文档一般都有各种结构,比如LISP里有S表达式,C语言里的函数,LaTeX 里的 \begin{...}...\end{...} ... 如果我们能够已文档的语法单位来移动,就会使操作非常高效。
C-M-a 到 defun 头 C-M-e 到 defun 尾这样,我们在C语言程序里可以一个函数一个函数的跳过。也可以从一个函数中间一下跳到函数开头或末尾。
所以在 Emacs 里,寻找匹配的括号可以在括号处使用 C-M-f 和 C-M-b.
C-M-f 到下一个同级语法结构 C-M-b 到上一个同级语法结构
注意,这种移动不能越过语法结构的边界而进入上一级结构。所以,你如果在
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 不放,所以还是很顺手的。
M-} (forward-paragraph) M-{ (backward-paragraph)段落在不同的mode有不同的含义,它的含义是由 paragraph-start 变量决定的。 这个正则表达式可以告诉 Emacs 那些符号出现被认为是一个段落开始了。
M-e (backward-sentence) M-a (forward-sentence)
句子在不同的模式有不同的含义。比如在 c-mode, “句子”成为了“语句”的 代名词,所以 M-a 和 M-e 可以以语句为单位移动。
句子的含义是由 sentence-end 变量决定的。这个正则表达式可以告诉 Emacs 那些符号出现被认为是一个句子结束了……比如我的 sentence-end 是这样 设置的:
(setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")这样中文的句子就可以被正确识别了。
C-c C-f 向前跳过同一级 tag (sgml-skip-tag-forward) C-c C-b 向后跳过同一级 tag (sgml-skip-tag-backward)
C-c C-u 到最近的上一级 \begin{...} 处。
C-c } 到最近的上一级匹配 {...} 处。