01.Semantic-Keybinding

Emacs从最源头处, 首先用 M(Meta)-x(Execute) 调用所有的function。然后更进一步,以Control单键取代M-x双键,并将M-x调用的函数名,简化为其首字母。 比如向前移动一个字符的冗余实现过程为:M-x forward-char, 而按照简化的逻辑则变为C-f。C(Control)对应 M(Meta)-x,而字符f为函数forward-char的首字母。

换言之,我们只须单单从词源和语义出发, 就能快速且永久性记住常用的快捷键.

在最高频的快捷键绑定中, C-x, M-x中的x(execute)省略, 简化为C-与M-。本节我们将接着阐述光标的基本动作,其操作的对象为: character, word, line, sentence, (*paragragh), page, buffer.

1.字符与单词 (Character and Word)

C-f (M-x forward-char) 向前移动一个字符的位置 C-b (M-x backword-char) 向后移动一个字符的位置 char 是最小的操作单元, char之上则是word, 回顾上文阐述的meta的词源含义是higher,因此Meta绑定相同的键, 范围要比Ctrl更大一点, 由此, 比char大一级的是word M-f (M-x forward-word) 向前移动一个单词的位置. M-b (M-x backword -word) 向后移动一个单词的位置.

2.行与句子(Line and Sentence)

C-e (e for end) 移动到行尾 C-a (a for ahead) 移动到行首

同样的逻辑,Meta比Ctrl的范围高一个等级 M-a 光标移动到句首 M-e 光标移动到句末

以上两点为光标在水平方向的移动(horizontal), 与之相对应的纵向(Vertiallly)移动的操作.

3.纵向的移动 (Vertical Movement)

C-n (调用function next-line), 向下移动一行 C-p (previous-line) 接下来, 有意思的事情来了. 由character和line操作可知, 绑定相同的键, Meta的作用范围总是比Ctrl更高一级, 但是如果此时查看:

M-p
M-n

发现Emacs没有定义这两个key-sequnces, 根据前面的逻辑, M-p应该向上移动更多行, 至少比一行要多; Emacs竟然没有定义, 这真是千载难逢的良机. 此节按下不表, 先小结Ctrl的光标操作. Ctrl能操作的最大单位是line, 更大范围的光标动作交由Meta完成.

4.纵向的翻页(Vertically Page Down and Up)

向上翻页M-v, v当然是vertical, 而Meta是higher, 往更高处纵向移动, 当然便是UP; 那么向下呢? 既然Meta相对于Ctrl而higher, 反过来Ctrl则是Lower; 因此向下翻页是C-v. 此处的心思, 一级绑定, 始终用最少的动作, 最少的触发键, 如果绑定三个键, 则不需要Ctrl的参与. 比如设置三键组合M-v-u(up), M-v-d(down)向下,如此设置比较双键组合尚显冗余。 然而,M-v与C-v辅助便利地向上和向下翻页, 问题是他们是整屏, 整屏地翻页, 大多数时候, 这不是我们想要的. 更常用的操作是半屏半屏的翻页.

现在重新回到M-p与M-n, 绑定半屏翻页.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
(defun previous-multilines ()
  "scroll down multiple lines"
  (interactive)
  (scroll-down (/ (window-body-height) 3)))


(defun next-multilines ()
  "scroll up multiple lines"
  (interactive)
  (scroll-up (/ (window-body-height) 3)))

(global-set-key "\M-n" 'next-multilines) ;;custom
(global-set-key "\M-p" 'previous-multilines) ;;custom

因为设置了触控板(或者鼠标)Invert scroll direction(Natural Scrolling), 因此up与down是反着映射到next和previous的

5.缓冲区(Buffer)

M-< 移动到buffer头部 M-> 移动到Buffer的尾部 只要记着ctrl只管到line, 其余全部都是Higher的Meta的工作.

6.逻辑分割(Logical Segments)

  • Paragraph

    M-{
    Move back to previous paragraph beginning (backward-paragraph).
    M-}
    Move forward to next paragraph end (forward-paragraph).
    M-h
    Put point and mark around this or next paragraph (mark-paragraph).
  • Pages

    M-x
    what-page Display the page number of point, and the line number within that page.
    C-x [
    Move point to previous page boundary (backward-page).
    C-x ]
    Move point to next page boundary (forward-page).
    C-x C-p
    Put point and mark around this page (or another page) (mark-page).
    C-x l
    Count the lines in this page (count-lines-page).

7.键位布置

建议键位调整为:

Alt(option) --> Ctrl --> Space <-- Ctrl <--Alt

不管是在哪一种键盘上,都要保持此键位布置。

8.基本概念

Emacs对光标Cursor有着特殊的命名即Point。选中的一块区域称之为region。而region的两端,一端为Point,而另外一端则为Mark。

基本操作总结如下:

Command Descripion
C-@ Set mark
C-Spc same as C-@
C-x C-x Interchange mark and point
M-@ set mark after next word
M-h region around paragraph
C-x h Put region around entire buffer

其中,M-h往往会忘掉。