Emacs for vim Users---from http://www.crazyshell.org/blog/

Emacs for vim Users

这是一年前凌晨四点我在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的对应按键了: http://www.elmindreda.org/emacs.htm 简单翻译如下:

软件操作:

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 ,不知道的朋友可以去装一个, 脚本如下:

1 (require 'window-number)
2 (autoload 'window-number-mode "window-number" t)
3 (autoload 'window-number-meta-mode "windows-number" t)
4 (window-number-mode 1)
5 (window-number-meta-mode 1)

把这段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删除整行函数

1 (defun smart-kill ()
2   "If `mark-active', call `kill-region', otherwise call `kill-whole-line'."
3   (interactive)
4   (if mark-active
5       (call-interactively 'kill-region)
6     (call-interactively 'kill-whole-line)))

Emacs拷贝整行函数

01 (defun copy-region-and-paste ()
02   "拷贝region并且粘贴到region后"
03   (interactive)
04   (call-interactively 'copy-region)
05   (call-interactively 'yank))
06 """"""""""""""""""""""""""""""""""""""
07 (defun copy-line-left ()
08   "拷贝当前行光标后面的文字"
09   (interactive)
10   (copy-region-as-kill-nomark (point) (1+ (line-end-position))))
11 """""""""""""""""""""""""""""""""""""
12 (defun which-copy ()
13   (interactive)
14   (if mark-active (copy-region-and-paste) (copy-line-left)))

以上几个函数依赖于DEA的一个el文件, 下面是源码, 自己DIY的童鞋可以扒下来, 懒的可以自己require这个文件就可以了.
http://dea.googlecode.com/svn-history/r516/trunk/my-lisps/edit-settings.el

两个函数相当于Vim的yy和dd,把两个函数绑定到相应快捷键上就ok了!

PS: 另外感谢ugoa这位网友指正. 

原创文章,转载请注明出处:  http://www.crazyshell.org/blog/?p=673

我猜您可能还会喜欢:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值