怎么移动你的光标?可能有人会说,这上下左右键不是很好用吗,还用你来讲。Emacs的强大在于你能够只使用键盘左边那堆键来完成任何事情(不包括顶上的ESC和Function),这也是Emacs的设计宗旨。
为了试验这些按键,大家在进入Emacs时选择页面中间的Emacs Tutorial,这里面可以随便乱按不用担心出什么岔子。
一、基本导航
看下面这张图片:
可以这么记,p-previous,n-next,b-backward,f-forward。这里所说的字符对于E文,就是一个字母,而中文是一个汉字,其实Emacs对中文支持还是很厚道的,后面慢慢可以看出来。不过在这儿我个人感觉这个光标移动没有Vim方便,别人就HJKL,一个键就能动了,这需要两个,Ctrl 有时还觉得按着很别扭,不太和谐呀。
在按C-n 时,如果越过了页尾,不像一般Windows编辑器是往下滚一行,而是往下滚半夜,当前光标会置于页面中间。C-p 也是一样的。
另外两个使用较多的是 C-v 往下翻页,
M-v 往上翻页。呃,还有一个
C-l 就是把当前行提到页面中间,感觉Emacs对页面中似乎情有独钟啊。
二、中级导航
按字符移的上节说了,然后说按单词移动:
M-f 向前移动一个单词,Emacs理解的中文单词是两个标点符号之间的东西,所以中文就是移到下一个标点符号的位置。往回是
M-b ,向后移动一个单词。
C-a 移动到行首,
C-e 移动到行尾。
M-a 移动到句首,
M-e 移动到句尾,在中文中一般就是跑到句号的位置,这里我不得不说一下,现在很多年轻人写文章有一逗到底的习惯,就只在文章最后加个句号,如果用Emacs来看你的文章,一个M-e 啥都不用干了。作为一个有一定文学素养的人,在此我严厉反对这种写文章的作风,不和谐。
M-}
移动到下一段,
M-{ 移动到上一段。
还有两个跑的更快的导航,
M-<
移到文档首,这里要注意是小于符号<,不是逗号, ,所以我们是按Alt + Shift + , 切记。移到文档尾是
M->
。
C-x [ 和 C-x ] ,分别是往上一页和往下一页。这里页是由分页符控制的,在Emacs Tutorial 中是没有分页符的,所有这两个键会跑到文档头和文档尾去。
例图:
阴影处是当前光标的位置,其它箭头所指是按相应键后光标的位置。
三。高级导航
可以这么来看基本导航是普通人用的,中级导航是高手采用的,高级导航是砖家、叫兽用的。
M-r 移动到页面中间行首位置,holly shit,又是页面中间,真XX阴魂不散。
M-x goto-char (n) ,这个比较复杂,先按M-x,然后空格输goto-char回车,另外Emacs有Tab键补全功能,大家可以试试,如果有多个选项会有提示,最后输入一个整数。这个东西会移动到从头数第n个字符的位置,我估计不会有人变态到能记住每个字是第几个字符。
M-g M-g [n] ,按
两次M-g,不用回车,提示输入一个数字,移动到指定行n,两个M-g,也可以输
M-g g
。
还有一个比较罕见的, C-x C-n
, 这个是设置当前列为目标列。
这是什么意思呢,本来我们按C-n 和C-p 时,光标会往下或往上移一行,而列的位置就是当前光标列的位置,除非下一行列没那么多(就是字符没那么多),光标会到距当前列最近的列。而我们可以用这个组合键重新设一个目标列,这样在按C-n 和C-p 时,光标会跑到我们设的目标列上。如果你不幸按了,而且又不习惯,可以使用
C-u C-x C-n
来取消目标列设置。
补充一点,这两个命令都是禁用命令,是Emacs考虑大家多半不会用,而且比较怪的命令,所以通常就禁用了,你不小心调出时会给出提示问你是否需要继续。就像这个样子:
大家按个空格稍微试下就行了。
最后还有两个重复命令:
M-n , n是数字,意思是重复下个命令n次,比如M-3 C-f,就是向前移三个字符。
C-u n , n还是数字,也是重复下个命令n次。如果省略n,就是4次。按两次C-u,就是重复16次。
小结:
按键 | 命令 | 作用 |
C-f | forward-char | 向前一个字符 |
C-b | backward-char | 向后一个字符 |
C-p | previous-line | 上移一行 |
C-n | next-line | 下移一行 |
M-f | forward-word | 向前一个单词 |
M-b | backward-word | 向后一个单词 |
C-a | beginning-of-line | 移到行首 |
C-e | end-of-line | 移到行尾 |
M-e | forward-sentence | 移到句首 |
M-a | backward-sentence | 移到句尾 |
M-} | forward-paragraph | 下移一段 |
M-{ | backward-paragraph | 上移一段 |
C-v | scroll-up | 下移一屏 |
M-v | scroll-down | 上移一屏 |
C-x ] | forward-page | 下移一页 |
C-x [ | backward-page | 上移一页 |
M-< | beginning-of-buffer | 移到文档头 |
M-> | end-of-buffer | 移到文档尾 |
M-g g n | goto-line | 移到第n行 |
(none) | goto-char | 移到第n个字符 |
C-l | recenter | 将当前位置放到页面中间(Emacs最喜欢的地方) |
M-n | digit-argument | 重复下个命令n次 |
C-u n | universal-argument | 重复下个命令n次,n默认为4 |