更好 更强 更快

上次的那些操作只能让你存活下来。

现在让我们感觉更好一些。

有时候,你可能按了一次C-c或者M-x。然后发现自己按错了。想消除这些命令这时候你可是使用

C-g 取消操作

如果你不确定你现在按没有按命令。你可以狂按几次C-g。

光标移动

更好的光标移动

C-a 行首
C-e 行尾
M-f 下一个单词
M-b 上一个单词

更快的光标移动

M-m 移动到第一个非空格字符 (back-to-indentation)
M-a 句子头
M-e 句子尾
M-{ 段落头
M-} 段落尾
C-v 下一页
M-v 上一页
M-< 文件头
M-> 文件尾 
M-r 窗口中间
M-x goto-char RET N 文件的第 N 字节
M-x goto-line RET N 文件第 N 行

更强的光标移动

C-M-a 到函数头
C-M-e 到函数尾
C-M-f 到下一个同级语法结构 
C-M-b 到上一个同级语法结构
C-M-d 进入到下一级结构里
C-M-u 进入到上一级结构里

文档一般都有各种结构,比如LISP里有S表达式,C语言里的函数,LaTeX 里的 \begin{…}…\end{…} … 如果我们能够已文档的语法单位来移动,就会使操作非常高效。

defun。efun 在 LISP 里就是最高一级的 sexp,而在 C 语言里,它的含义就是函数。

C-M-a 到 defun 头
C-M-e 到 defun 尾

这样,我们在C语言程序里可以一个函数一个函数的跳过。也可以从一个函数中间一下跳到函数开头或末尾。

语法单位(sexp)。语法单位在各种 major mode 有不同的定义:

lisp-mode: 一个S表达式。

c-mode: 一个变量名,一个 (…), 一个 {…}, 一个 […], …
所以在 Emacs 里,寻找匹配的括号可以在括号处使用 C-M-f 和 C-M-b.

Gnus: 一个thread。包括所有的 Re:
其实 defun 可以被看作最高一级的 sexp。所以范围小一点的移动操作就是在同级 sexp 之间移动。

C-M-f 到下一个同级语法结构
C-M-b 到上一个同级语法结构

注意,这种移动不能越过语法结构的边界而进入上一级结构。所以,你如果在

1
for (i=0; i<10; i++) { ...}

的 for 循环的括号里向右移动,到达右边括号时,就会被提示到达边界。
注意,文档中的注释在这两个操作中会被跳过,这是非常方便的。

进入和退出子结构:

在LISP中,S表达式是嵌套的括号,进入子结构就是进入到这一级 (…) 里面。而在 C 语言中,进入子结构就是进入 (…), {…}, […] 的里面。 C-M-d: 进入到下一级结构里。C-M-u: 进入到上一级结构里。

C-M-a, C-M-e, C-M-f, C-M-b, C-M-d, C-M-u 这几个命令组合起来可以迅速的在程序里移动。往往手可以按住 C-M 不放,所以还是很顺手的。

如果你还对光标移动欲罢不能,这里有高清大图让你慢慢把玩。

操作

C-g 取消操作
C-space = C-@ 选择操作区
C-d 删除一个字符
M-d 删除一个单词
C-u xxx 多次命令
C-k 删除到尾
C-w 删除区域
M-w 复制区域
C-y 粘贴

M-0 C-y 向前剪切
M-z x 从光标删除到第一x


C-s 搜索
C-r 逆向搜索
C-M-s 正则搜索

M-x replace-string 替换文本

其实不管是Emacs还是Vim。这些动作你都要在不断的使用中变成下意识的动作。这样,你在键盘上的效率就会越来越高。

随便说一句,推荐学Emacs的原因还有。在终端里面我用过的bash和zsh都是支持Emacs按键的。Mac OS里面所有的文本输入框也是部分支持Emacs的。虽然man等是支持vim的按键方式,可是我们不是还有info是Emacs的方式么。