这是一年前凌晨四点我在CSDN上写的一个系列, CSDN上的blog准备关闭了, 觉得还是把这个系列移动过来比较好,并尽量加入新的元素, 让更多人受益.
/ Vim编辑器之神 Emacs神的编辑器 /
从学习曲线可以看下面这张图:
光从这张图可以看出:
世界上的程序员分三种,一种使用 Emacs, 一种使用 Vim,剩余的是其它。
其它我们不看,太简单,先看Vi它的学习曲线一开始就比较陡, 后来慢慢的就顺手了, 但是再看Emacs就不一样了,开始陡的厉害,最后也还处于不稳定的状态. Vim和Emacs难不难, 其实关键要看自己有没有Geek的精神. 喜不喜欢折腾! 博主就是个爱折腾的. 不停的折腾.
我在Gtalk,Emacs-cn,Emacs群了解到,很多Emacser大部分都是从Vimer转过来的,初学者开始使用Emacs时总是感觉没Vim那么给力.但是又常听说是神的编辑器,只能怀疑自己了,其实不用怀疑, Vim和Emacs的重心是不同的, Vim倾向于专业实力(编辑,除了编辑它不行), Emacs倾向于综合实力(这个实力需要你有Geek的精神,需要你懂lisp,并不是会装装插件你就能够掌握Emacs!). 不过,我们可以让Emacs慢慢的顺从我们, 很多Vimers开始时总想在Emacs上找一些vim上对应的键, 比如vim的 f 键 ,行内最给力的键. 在Emacs中是什么? 下文将把所有对应的基础键 写出来,并给出相应更快捷的方式
----------by Crazybaby
这里已经有人写了份Emacs和Vim的对应按键了: 简单翻译如下:
软件操作:
Action | gi | Emacs | Notes on Emacs |
软件退出 | :q Enter | C-x C-c | If changes exist, will ask whether or not to save them. |
强制退出 | :q! Enter | C-x C-c | Just say no. |
保存当前buffer | :wq Enter | C-x C-s C-x C-c | |
取消当前命令 | Ctrl+c | C-g | |
重绘窗口 | Ctrl+l | C-l | |
进入命令行 | : | M-x |
文件操作:
Action | vi | Emacs | Notes on Emacs |
打开文件并命名filename | :e filename Enter | C-x C-f filename | |
保存当前缓冲区 | :w Enter | C-x C-s | Will not save a new, unmodified file. |
保存名为filename的文件 | :w filename Enter | C-x C-w filename | |
移动到下一个缓冲区 | :n Enter | C-x b buffer | |
移动到上一个缓冲区 | :prev Enter | C-x b Enter |
导航
Action | vi | Emacs | Notes on Emacs |
到缓冲区开始部分 | 1G | M-< | |
到缓冲区结束部分 | G | M-> | |
向左移动一个字符 | h | C-b Left | Will wrap to previous line. |
向右移动一个字符 | l | C-f Right | Will wrap to next line. |
向上移动一行 | k | C-p Up | |
向下移动一行 | j | C-n Down | |
到第n行 | nG | M-x goto-line Enter n M-g g n Enter M-n M-g g | |
到行开头 | 0 | C-a | |
到行结尾 | $ | C-e | Places cursor one step beyond last character. |
到下一个词 | w | M-f | Stops at first non-word character before the word. |
到上一个词 | b | M-b | |
到下一页 | Ctrl+f | C-v PageUp | |
到上一页 | Ctrl+b | M-v PageDn | |
设置标志位x | mx | C-x r Space x M-x point-to-register Enter x | |
移动到标志位x | 'x | C-x r j x M-x register-to-point Enter x | |
移动到显示的缓冲区的(第一行) | H | ||
移动到显示的缓冲区的(最后一行) | L | ||
向下移动缓冲区 (注意:上下是相对的) | Ctrl+y | C-1 M-v | |
向上移动缓冲区 | Ctrl+e | C-1 C-v |
文本编辑
Action | vi | Emacs | Notes on Emacs |
插入(以一个字符为单位) | i | Always in insert mode. | |
追加(以一个字符为单位) | a | C-f | Only cursor movement is needed. |
向行头插入 | I | C-a | Only cursor movement is needed. |
向行尾插入 | A | C-e | Only cursor movement is needed. |
删除当前字符 | x | C-d Delete | |
删除前一个字符 | X | Backspace | |
删除当前字符到行尾(并进入插入文字操作) | C | C-k | Only deletion is needed. |
删除当前字符到行尾(没有进入插入模式) | D | C-k | Removes line entirely if empty. |
删除一整行 | dd | C-a C-k C-a C-k C-k | For empty lines For non-empty lines |
以当前字符向后删除一个词 | dw | M-d | Does not delete whitespace before next word. |
以当前字符向前删除一个词 | db | M-Backspace | |
以当前光标所在行向上新建一行 | O | C-o | |
以当前光标所在行向下新建一行 | o | C-e Enter | |
连接行 | J | C-n M-^ | |
undo操作,类似于C-z | u | C-x u |
复制和粘贴和剪贴
Action | vi | Emacs | Notes on Emacs |
复制本行 | yy | C-a C-k C-a C-k C-k | For empty lines For non-empty lines |
复制n行 | nyy | C-Space (move to line below last desired) M-w | |
向下剪贴n行 | ndd | M-n C-k | |
向下粘贴 | P | C-y | |
向上粘贴 | p |
搜索和替换
Action | vi | Emacs | Notes on Emacs |
向前搜索 | /pattern Enter | C-s pattern Enter | |
向后搜索 | ?pattern Enter | C-r pattern Enter | |
全局替换 | :%s/pattern/with/gc Enter | M-% word Enter with Enter C-M-% pattern Enter with Enter |
窗口操作
Action | Vim | Emacs | Notes on Emacs |
水平分割 | Ctrl+w s | C-x 2 | |
垂直分割 | Ctrl+w v | C-x 3 | |
关闭当前窗口 | Ctrl+w c | C-x 0 | |
关闭其它窗口,除了本窗口 | Ctrl+w o | C-x 1 |
但是大部分Emacs操作都很繁琐且命令太少了,下面来点给力的, 从基础命令一点点开始,由于时间关系将连续写一个系列.
备注: [Visual]为vim的V模式 其它都为插入模式
效果如下(录制于Windows,效果同Linux):
一.编辑器基础操作
补充: 退出 vim的 :q 键 为 Emacs的 C-x 0 键 关闭当前窗口
二.buffer操作
PS:用emacs截图主要是为了 emacs有org这个mode 比较方便排版 还望见谅
-> vim buffer快速定位
->Emacs buffer快速定位
Emacs这个插件为window-number ,不知道的朋友可以去装一个, 脚本如下:
把这段lisp插入到.emacs相应位置即可.
再看看比较给力的, 给力列编辑, Emacs的列操作比Vim的顺手很多, 先看Emacs的.
Emacs列给力编辑
按键 | 功能 |
---|---|
C-x r k | 剪切矩形块 |
C-x r y | 粘贴矩形块 |
C-x r o | 插入矩形块 |
C-x r c | 删除矩形块 |
C-x r t | 填充矩形块 |
请见操作:
给力的CUA-mode (先使用C-RET确认坐标)
再来看看也比较给力的Vim操作.
话不多说, 一切看上面我的操作.
另外,Vim中有两个比较给力的,Emacs是没有直接快捷键的. 可以用如下lisp实现:
Emacs删除整行函数
Emacs拷贝整行函数
以上几个函数依赖于DEA的一个el文件, 下面是源码, 自己DIY的童鞋可以扒下来, 懒的可以自己require这个文件就可以了.
两个函数相当于Vim的yy和dd,把两个函数绑定到相应快捷键上就ok了!
PS: 另外感谢ugoa这位网友指正.