原文

Emacs Prelude

Prelude 是一个Emacs发行版, 旨在加强默认Emacs的体验.Prelude更改了许多默认的配置, 组合捆绑了大量的额外的插件,并添加了它自己的核心库.最终的产品提供了一个对于新手易于使用, 对于高级用户提供了许多额外的能力的Emacs配置.

Prelude 只对 GNU Emacs 24.x 版本兼容.一般地, 我们总是建议你以最新版本的Emacs来运行Prelude - 当前最新版本为 24.4.

目录

快速使用

我们假设你正运行 Unix-like 系统(*BSD, GNU/Linux, OS X, Solaris, 等等), 并且你已经安装了Emacs 24, 也安装好了git以及curl,你可以忽略整个手册, 只需要在你喜欢的shell里输入以下命令:

curl -L https://git.io/epre | sh

你可以启动你的Emacs,坐下来并享受prelude了,忘记这份手册的剩余部分.

这时有两人个环境变量你可以用于控制源码仓库以及安装目录.为了改变安装目录, 你可以:

export PRELUDE_INSTALL_DIR="$HOME/.emacs.d" && curl -L https://github.com/bbatsov/prelude/raw/master/utils/installer.sh | sh

为了改变源码仓库为, 你可以:

export PRELUDE_URL="https://github.com/yourname/prelude.git" && curl -L https://github.com/bbatsov/prelude/raw/master/utils/installer.sh | sh

注意,安装包会备份任何在 .emacs 文件或 .emacs.d 目录,然后它会解压Prelude的代码到.emacs.d 目录里.如果你打算手动安装, 请确保你没有.emacs文件或者手动备份你已经存在的.emacs.d 目录.

一旦你安装完成后,不要忘记去调整你的prelude-modules.el文件.默认情况下, 许多prelude自带的模块并没有加载.

安装 Emacs 24

好明显, 你使用 Emacs Prelude 之前, 你首先得安装 Emacs 24 . 请看 WikEmacs articles on installing Emacs

安装(Prelude)

自动化安装

你可以通过命令行使用curl 或者wget来安装Emacs Prelude.自然地,git也是要安装好的.

通过 curl 安装

如果你打算用curl, 请在shell里输入以下命令:

curl -L https://github.com/bbatsov/prelude/raw/master/utils/installer.sh | sh

通过 Wget 安装

如果你打算使用 wget, 请在shell里输入以下命令:

wget --no-check-certificate https://github.com/bbatsov/prelude/raw/master/utils/installer.sh -O - | sh

手动安装

git clone git://github.com/bbatsov/prelude.git path/to/local/repo
ln -s path/to/local/repo ~/.emacs.d
cd ~/.emacs.d

更新 Prelude

手动更新

更新过程非常简单直接,由3个步骤组成:

更新所有插件包

只需要运行 M-x package-list-packages RET U x

更新Prelude的代码
cd path/to/prelude/installation
git pull

路径path/to/prelude/installation通常是 ~/.emacs.d (在最新的Unix系统下)

重启 Prelude

在你更新完之后,重启一下Emacs通常是一个好的主意.在下次Prelude启动时, 它会安装好新的依赖(如果需要的话).

自动更新

简单地执行M-x prelude,然后重启下Emacs就可以了.

开启额外的模块.

默认情况下,大多数Prelude自带的模块并没有加载.更多关于这些模块提供的功能, 请查这个文档 docs

;;; Uncomment the modules you'd like to use and restart Prelude afterwards

(require 'prelude-c)
;; (require 'prelude-clojure)
;; (require 'prelude-coffee)
;; (require 'prelude-common-lisp)
;; (require 'prelude-css)
(require 'prelude-emacs-lisp)
(require 'prelude-erc)
;; (require 'prelude-erlang)
;; (require 'prelude-elixir)
;; (require 'prelude-haskell)
(require 'prelude-js)
;; (require 'prelude-latex)
(require 'prelude-lisp)
;; (require 'prelude-mediawiki)
(require 'prelude-org)
(require 'prelude-perl)
;; (require 'prelude-python)
;; (require 'prelude-ruby)
;; (require 'prelude-scala)
(require 'prelude-scheme)
;; (require 'prelude-scss)
;; (require 'prelude-web)
(require 'prelude-xml)

一旦你安装完成后,你可修改你的prelude-modules.el文件.如果你打算手动安装,这时你需要复制 prelude-modules.el 文件(译注: 放到~/.emacs.d/目录下),这个文件在根目录 path/to/prelude/installation 下的 sample 目录里.

你在注释掉一些模块后, 你也应该重启Emacs或者通过C-x C-eevaluate模块require表达式.(这个不好翻译…)

运行

这没有什么特别的. 像平常一样启动Emacs就可以了.我个人将Emacs运行在一个守护模式:

emacs --daemon

然后,我通过终端或者一个图形客户端连接到服务, 就像这样:

emacsclient -t
emacsclient -c

你可能在你的.zshrc或者.bashrc也设置一些别名:

alias e='emacsclient -t'
alias ec='emacsclient -c'
alias vim='emacsclient -t'
alias vi='emacsclient -t'

如果你通常在命令行使用vi(m)编辑文件, 最后两个别名将非常有用.

你也可以打开一个文件并跳到指定行:

emacsclient somefile:1234

这会打开一个somefile文件,并且将光标定位到第1234行.

开始了解 Prelude

当然,了解Prelude是如何加强默认的Emacs检验的最好的方式就是去精读Prelude的源码.(好明显,是用Emacs Lisp来写的).理解代码不是必修课.Prelude包含了一个prelude-mode次模式, 它是prelude提供的额外的功能的集合.它也提供了些额外的键位映射绑定扩展.

键位映射情况

全局范围的
绑定的键位 描述
C-x 根据正则对齐区域
C-+ 放大字体(text-scale-increase)
C– 缩小字体(text-scale-decrease)
C-x 0 返回之前的窗口(反转 other-window (C-x o))
C-^ 将两行合并成一行(prelude-top-join-line)(译注:将当前行与下一行合并到当前行)
C-x p 启动 proced (Emacs进程管理器, 仅在Linux下工作)
C-x m 启动 eshell
C-x M-m 启动你的默认shell
C-x C-m M-x的别名
M-X 类似 M-x ,但命令只限于当前活动的主模式.
C-h A 运行 apropos (搜索所有Emacs符号)
C-h C-m 显示当前主模式的键位绑定以及描述所有绑定的键位说明
M-/ 运行 hippie-expand (一个替代默认的dabbrev-expand)
C-x C-b 打开 ibuffer (一个代替默认的buffer-list的东东)
F11 全屏
F12 开启/关闭 Emacs 菜单栏
C-x g 开启 magit 的状态缓冲区
C-x M-g 打开 magit 的弹出窗
M-Z 显示与字符相关的操作的快捷键
C-= 执行 expand-region(增量文本选择) (译注:对于写代码这个功能非常有用)
C-a 执行 prelude-move-beginning-of-line. 详情请这里
Prelude 模式下的
绑定的键位 描述
C-c o 用外部程序打开当前访问的文件
C-c i 搜索符号, 仅在包含代码的缓冲里搜索
C-c g 用Google搜索光标下的东西(或者一个交互式查询)
C-c G 用Github搜索光标下的东西(或者一个交互式查询)
C-c y 用Youtube搜索光标下的东西(或者一个交互式查询)
C-c U 用Duckduckgo搜索光标下的东西(或者一个交互式查询)
C-s RET 或者 Super-o 在当前行向上一行插入一个空行并适当进行缩进
S-RET 或者 M-o 插入一个空行并适当缩进
C-S-up 或者 M-S-up 将当前行或区域向上移(注意S是大写)
C-S-down 或者 M-S-down 将当前行或区域向下移(注意S是大写
C-c n 修正缩进及去掉空白
C-c f 打开最近访问的文件
C-M- 缩进区块(如果有选择的话)或者整个缓冲区
C-c u 根据URL,打开一个新的缓冲区来打开该URL
C-c e 计算 Emacs Lisp 代码表达式,并用结果来替换
C-c s 切换两个活动窗口
C-c D 删除当前文件及缓冲区
C-c d 复制当前行(或区块)到下一行
C-c M-d 复制当前行(或区块)到下一行并注释掉
C-c r 重命名当前的缓冲区以及它正在访问的文件
C-c t 打开一个终端模拟器(ansi-term)
C-c k 关闭所有缓冲区除了你当前正在使用的
C-c TAB 缩进并复制区块到粘贴板
C-c I 打开用户的 init 文件(即 prelude/personal/preload 目录)
C-c S 打开 shell 的 init 文件 即 ~/.bashrc~/.zshrc
C-c . + 将当前数字加1
C-c . - 将当前数字减1
C-c . * 将当前数字*2
C-c . / 将当前数字/2
C-c . 将当前数字取模, %2
C-c . ^ 将当前数字进行平方 ^2
C-c . < 将当前数字左移 1 个单位, 即*2
C-c . > 将当前数字右移 1 个单位,即/2
C-c . # 将当前数字转换为指定基数的数字. 默认为10
C-c . % 将当前数字用另一个数字来替换
C-c . ‘ 将当前数字用数学操作符来操作
Super-g 开启或关闭 God 模式
Super-r 最近的文件
Super-j 合并行
Super-k 删除整行
Super-m m magit 状态
Super-m l magit 日志
Super-m f magit 文件日志
Super-m b magit blame 模式

注意: 对于各种算术运算符, 前缀操作符 C-c . , 仅需要同时按一次. 剩下部分的操作符, 适当按下就可以了.

OS X 修改键位

Prelude 默认情况下不弄乱标准的键位映射 Command (就是 Super), Option 就是Meta.

如果你想互换它们, 请添加以下配置到你的个人配置文件里:

(setq mac-command-modifier 'meta)
(setq mac-option-modifier 'super)

Projectile

这些是 Projectile 提供的功能

绑定的键位 描述
C-c p f 显示项目里文件列表.带有前缀参数, 将会首先清空缓存 (这个命令非常好用)
C-c p d 显示项目里目录列表.带有前缀参数, 将会首先清空缓存
C-c p T 显示项目里所有测试文件列表
C-c p s g 对项目进行执行 grep (相当于全文搜索)
M– C-c p s g 在项目里执行 projectile-grep-default-files
C-c p b 显示当前项目里所有已经打开到缓冲区的文件列表
C-c p o 对所有项目打开的缓冲区执行 multi-occur
C-c p r 对项目里所有的项目文件执行 query-replace
C-c p i 使用项目的缓存失效(如果存在的话)
C-c p R 对项目重新生成 TAGS 文件
C-c p k 删除所有项目的缓冲区
C-c p D dired 模式打开项目的根目录
C-c p e 显示所有最近打开过的项目的文件
C-c p s a 对项目执行 ack.需要有 ack-and-a-half
C-c p s s 对项目执行 ag. 需要有 ag.el
C-c p a 对项目执行 ack. 需要有 ack-and-a-half
C-c p c 对项目执行标准的编译命令
C-c p P 对项目执行标准的测试命令
C-c p z 添加当前访问的文件到缓存
C-c p p 显示所有你可以切换的项目

Prelude 提供了一个额外的键位前缀 S-p (S 代表 Super), 所以, 你也可以使用 S-p 来代替 C-c p

如果你有时忘记了任何项目的键位绑定情况, 只需要输入:

C-c p C-h

Helm

Helm 的设置是根据这个指引的 A Package in a league of its own: Helm..

你可以根据以下的指导来学习Helm的用法和按键绑定情况. C-c hPreludeHelm 默认的按键前缀. 如果你不记得任何的按键, 在 C-c h 之后再加上 C-h 就可以列所所有关于 Helm 的所有绑定的按键的情况.

如果你喜欢 Helm 并且想全局上使用 Helm 通过 helm-find-files, helm-buffer-lists… 来加强, 这时你加上(require 'prelude-helm-everywhere). 当 prelude-helm-everywhere激活了, Helm 就会开启以下这些全局按键:

绑定的键位 描述
M-x 执行 helm-M-x,一个 M-x 的交互版.
M-y 执行 helm-show-kill-ring. 显示 kill-ring的内容
C-x b 执行 helm-mini, 一个 C-x b 的交互版.
C-x C-f 执行 helm-find-files , 一个 find-file 的交互版
C-h f 执行 helm-apropos, 一个 apropos-command 的交互版
C-h r 执行 helm-info-emacs, 一个 info-emacs-manual 的交互版
C-h C-l 执行 helm-locate-library, 可以搜索所有加载到 emacs 的文件位置

以下的按键是在 shell-mode 情况下激活:

绑定的键位 描述
C-c C-l 执行 helm-comint-input-ring, 使用helm接口来显示 shell 历史命令

以下的按键是在 eshell-mode 情况下激活: |绑定的键位 | 描述 | |–: | –: | | C-c C-l | 执行 helm-eshell-history, 使用helm接口来显示 eshell 历史命令 |

如果你更喜欢在所有地方使用 Ido, 你就不应该添加 prelude-helm-everywhere, 这样你就可以同时使用 HelmIdo, 以及 Prelude 的默认按键了.

你总是可以通过 (prelude-global-helm-global-mode-on) 来重新激活 Helm.

注意: 在 helm-M-x, 你必须传递前缀参数在你执行helm-M-x 之后, 因为你的前缀参数将会在helm-M-x显示的模式线上.

helm-M-x之前,是没有效果的.

Key-chords

Key-chords 仅当 prelude-key-chord 模块开启时才可用.

绑定的键位 描述
jj 跳到一个单词的开始位置 (avy-goto-word-1)
jk 跳到一个字符(avy-goto-char)
jl 跳到一行的开始(avy-goto-line)
JJ 跳到前一个缓冲区 (prelude-switch-to-previous-buffer)
uu 编辑视图作为树 (undo-tree-visualize)
xx 执行一个外部命令 ( execute-extended-command )
yy 浏览 kill-ring 内容 ( browser-kill-ring)
禁用 Key-chords

在一些情况下, 你可能不想要prelude已经定义好的 key-chord 的按键, 这时, 你可以在personal.el文件里通过设置它的命令为nil来禁用这些按键. 例如, 为了禁用jj key-chord, 可以添加以下行到配置文件里:

(key-chord-define-global "jj" nil)

如果你是一个 evil-mode 用户, 你可能也想同时禁用 key-chord-mode:

(key-chord-mode -1)
vim 模拟器

如果你想在emacs里使用vim, 可以启用prelude-evil模块, 它提供了对evil-mode的支持.

自动化包安装

默认情况下, Prelude 安装好后只带最小限度的功能.它也可以在后台自动安装各种编程语言及框架的附加插件.例如: 你试图打开一个.clj文件 clojure-mode, cider以及Prelude的加强版Lisp配置将会自动为你安装.

当然, 你也可以手动安装任何东西.

颜色主题

Emacs 24 自带了一个新的主题服务, 这显式有效地渲染一些老的颜色主题包. Emacs 24 提供了一打内建的主题, 你可以开箱即用, 通过调用 M-x load-theme 命令.

Zenburn是Prelude的默认颜色主题, 但你可以自行修改. 为什么用Zenburn?我(并且世界上许多黑客)发现它相当简洁.个人发现默认的主题容易对眼睛产生厌倦, 这是为什么我决定把有争议的地方替换它. 当然, 你也可以返回默认(或者选择其他颜色主题).

为了禁用 Zenburn 主题, 你可以将以下行放到你个人的配置文件里:

(disable-theme 'zenburn)

或者你可以使用其他主题颜色, 通过添加以下内容到 personal/preload, 像这样:

(setq prelude-theme 'solarized-dark)

注意: Solarized 默认情况下是不可用的. 你可以从MELPA安装它(`M-x package-install RET solarized-theme).

最后, 如果你不想用任何主题, 你可以添加以下内容到你的 personal/preload:

(setq prelude-theme nil)

个性化

fork官方的 Prelude 仓库并添加一些你自己的东西. 你应该避免去修改你个人文件夹之外的东西, 以免在日后升级时带来的冲突问题.

如果你想添加一些自动安装的包到你的个人配置文件, 可以使用以下代码:

(prelude-require-packages '(some-package some-other-package))

如果你只需要单一的包, 你也可以这样子:

(prelude-require-packages 'some-package)

预加载你自己的配置文件

有时, 你想要在 Perlude 加载之前, 加载你自己的配置文件. Prelude 会自动预加载所有在 personal/preload 文件夹下的 Emacs Lisp 文件. 注意, 这意味着你不能使用任何与Prelude相关的东西, 除了几个变量之外, 比如prelude-dir等等.

禁用 whitespace-mode

尽管 whitespace-mode 模式人令人眼前一亮, 但有些人觉得它太过有入侵性.你可以在你的个人配置文件里通过以下代码禁用它:

(setq prelude-whitespace nil)

如果你喜欢 whitespace-mode 但更愿意它不要在你保存文件时自动清除空格, 你可以在你的配置文件里通过设置 prelude-clean-whitespace-on-save 为nil 来禁用这些行为.

(setq prelude-clean-whitespace-on-save nil)

禁用 flyspell-mode

如果你不喜欢, 可以这样子禁用它

(setq prelude-flyspell nil)

注意事项

更新捆绑的包

在执行更新 Prelude 之前, 最好更新一下你已经安装好的包, 因为最新的Prelude通常依赖于捆绑好的包的更新版本.

如果你打算手动更新Prelude, 你总是应该首先执行包更新操作.

M-x package-list-packages RET U x

如果你打算使用 M-x prelude-update, 上步的步骤就不是必须的, 因为它会自动先执行更新包操作.

flyspell-mode 的问题

Prelude 会大量使用 flyspell-mode 来对各种设置进行拼写检查. 这些操作会依赖于你的操作系统中的 aspell 程序以及一个英文字典. 在Mac OS X下, 你可以通过 homebrew 来安装 aspell, 像这样:

brew install aspell --with-lang=en

在Linux发行版, 只需使用你的包管理器来安装即可.

Emacs 的终端版颜色太丑的问题

如果你的Emacs在终端上看上去太丑陋(相对于图形界面版), 可以试下添加以下配置到你的 ~/.bashrc 或者 ~/.zshrc.

export TERM=xterm-256color

然后重新加载下 ~/.bashrc~/.zshrc 文件, 然后再次启动emacs.

在初始化启动时报 MELPA 错误

如果你发现有一些 HTTP 连接到MELPA错误相关的信息, 只要手动执行 M-x package-refresh-contents , 然后直接重启Emacs即可.

在编辑器缓冲区发现箭头导航的警告

这不是个bug, 而是一个特色. 我坚信唯一使用Emacs的方法是按它的方式来使用(至少相对于导航而言是这样子)

如果你相信这会使你更进一步, 你可以完全禁用箭头导航, 可以在你的配置文件里添加:

(setq guru-warn-only nil)

完全禁用, 可以在你的配置文件里添加以下片段:

(setq prelude-guru nil)

自定义 C-a 的行为

Prelude 覆盖了 C-a 的行为, 描述在这里. 如果你不喜欢, 你可以简单地添加以下代码到你的配置文件里:

(global-set-key [remap move-beginning-of-line]
                'move-beginning-of-line)

ido 在大的数据处理里遇到性能问题

Prelude 将ido-fix 与默认的 ido 互换了. flx的排序算法更复杂, 但有着更好的结果. 在一些比较慢的机器下, 它可能需要降低 flx-ido-threshold 的值来确保有比较好的体验.

(setq flx-ido-threshold 1000)

你也可以完全禁止这些排序算法, 像这样:

(flx-ido-mode -1)

Windows 兼容性

理论上 Prelude 应该在 Windows 也可以很好地工作, 我只在 Linux 与 OS X上测试过, 所以Windows时而会有相关的问题. 这种情况可能随着时间的推移而解决 .

已知的问题

checkout 项目的未解决的问题列表. 顺便说下, 随意修复好它,然后发给我一个 pull 请求就好. :-)

技术支持

通过 Prelude的 Google Group 可以得到些技术支持 emacs-prelude@googlegroups.com..

贡献

这有份清单, 列出了所有为 Emacs Prelude 做出过贡献的人

bugs 以及 修正

我们总是欢迎任何提交bugs以及改进的建议. 如果能有 Github 的pull request 就更好了. :-)

我也接受一些赞助, 可以通过 gittip来捐赠.