[转]编辑器之战: Vim 的复仇

原文出处: Elliot Williams 译文出处:明明如月

文本编辑编程
Vim的神秘之处在于它普通模式时使用一种介于自然语言和编程语言中间的语言。

它包含动词(方法)、形容词(修饰语)、和名词(对象)。输入c命令代表“编辑”某些文本。但是仅仅输入一个c不起作用,因为它还需要一个对象。但如果你输入caw(“修改一个单词”),光标所选中的单词将被删除,Vim进入插入模式,等待你键入单词的替换词,通过按Esc键(退出键)就可以返回普通模式。如果你想编辑整句,输入cas来删除它然后然后输入新句子即可。想改变C函数括号内的所有参数吗?ci)“改变括号内的内容”. (ca)删除整体,括号和所有。数字也同样适用。通过c5w命令可以修改后面的5个单词。就Vim的语法是模块化且可拓展的角度而言,它还是挺容易学的。

以上那些只是雕虫小技。.命令才是亮点。编辑动作的阶段性重复构成了一个单元。所以如果你仅仅想把一个单词改为“Hackaday”后返回到普通模式,就把光标移动到那个单词上键入cawHackaday后再按.键就可将其修改为“Hackaday”。将移动命令也加入其中,w命令将光标移动到下一个单词的开头。现在如果交换.w那么文档中所有单词都会变成“Hackaday”。只需要按两个键。试想一下如果杰克·尼克尔逊在《闪灵》中用Vim和.命令写作,那该多高效啊。

虽然听起来好像不是特别实用,但是想想有多少次你需要把所有“foo()”方法替换为“getFooInstantanceMethod()”方法就不难理解了。

当然了在Vim中那只是很“普通”的搜索和替换方法,但是其实大多数情况下你没必要那样做。为啥呢?因为/foo搜索“foo”而且caw将修改光标选中的单词。
通过;可以实现搜索的可重复性。在搜索和替换部分(几乎)同时是任意编辑动作的情况下,交替使用;.与搜索和替换是等价的。

不需要输入“y”和“n”来对每个匹配的单词进行修改确认,你只需要找到需要的地方输入.即可。

关于vim的讨论非常热闹,以至于在 StackOverflow上,它已经成为一个经典的热门话题,在另一方面,文本编辑经常视为一贯重复性行为。Vim却将这些动作作为单一的单元,使得复现和将它们链接在一起非常容易。如果你是一个程序员,这很像编程里的活动 — 将整个任务拆分成多个方法并运行。如果你理解编程,你就更容易理解Vim。

可视模式和命令模式

在你通往精通Vim的路上,你会接触到更多模式。可视模式下你可以先选择文本的区域然后再使用命令来操作它。偶尔用用挺好的,因为可视模式下选择区域很难转换成普通方法,所以不要像我学习的时候那样用的那么频繁。然而有很多针对可视模式有用的插件。

命令模式是Vim的主要模式。它本质上像ed这种原始的行编辑器。:17,25d在不移动鼠标情况下删除17到25行。:-3t.复制当行的前面三行。:v/foobar/s/thang/thing/g 将不含有“foobar”的文档里所有“thang”替换为 “foobar”。在这里你也可以使用所有存储的正则表达式。

另外,如全局搜索、替换、删除或者复制整行文字这样的简单的操作在命令行下非常容易。%s/one/two/gc把所有的“one”替换成 “two”,每个搜索和替换需要用户确认。(%代表整篇文章。这里你也可以使用行数范围。当然:e命令功能是打开一个文件编辑, :wq 的功能是保存当前文件并退出。你不需要记住太多的命令行模式的命令,但是有些命令超实用。

寄存器和宏

接下来将介绍寄存器。像编程语言的变量那样,Vim 在寄存器中存储文本(或命令)。你可以从寄存器剪切或者粘贴数据,前十个主要是一个剪切缓冲区。寄存器是存储你剪切但不确定是否扔掉的文本的好地方。“zdi} 将删除所有方法括号内的所有代码,保存在“z”寄存器中。你可以在任何时候通过“zp将其粘贴回来。

你也可以像宏一样记录和回放寄存器中的Vim的命令序列。毕竟Vim命令大多数情况下都仅仅是文字。q用来开始和停止宏的录制,qw将一个宏录制到“w”寄存器中。

在此之后你可以用@w来重复运行。宏像其编写者那样强大。我只用一些宏,但是只要我用过的都会频繁使用。

例如,有一个宏我一天用无数次。我用Markdown写Hackaday文章然后将其编译成HTML语言发表。在Markdown中超链接的用法类似这样:[link text]( https://www.example.com )。

S]f]a(“+pa)用“[]”将当前选中的文本括在里面。添加一个左圆括号,退出插入模式,粘贴粘贴板中的内容,添加一个右圆括号,返回到普通模式。但是现在,我复制浏览器中一个超链接,选择文本然后在Vim中键入@l 这样获得了链接到该网址的Markdown超链接。

插件
想其他任何的编辑器一样,Vim也拥有难以置信的可拓展性。如果有任何不能制作成宏的特性,用户通常都可以为此编写插件。依我看来,Vimscript 没Lisp那样好编写,所以我就把拓展的编写留个其他用户吧。有人已经写了一个几乎你所需的所有模块。但是在刚开始的时候不要过度使用插件。即使你是刚学习Vim,它也会使你的工作量减轻很多。
如果你经不住诱惑安装了一些插件,我建议你一次只装一个,直到能给非常熟练的使用后再安装另外的插件。我建议依次安装和学习如下插件:vim-sensible, vim-airline, vim-abolish, ctrlp.vim, UltiSnips, vim-surround, vim-easy-align。

VIM最佳命令

如果你在用Vim,但是没充分使用如下的命令,说明你还没用好它。

l IA 分别插入文本到行首或尾部。

l m设置标记然后通过“`就可以跳回到此标记位置。 这对轻松在长篇文章中跳转非常有效。

l g; 跳转到上次编辑位置。就是说“在去其他地方之前,先返回之前编辑的地方”。这非常有用。但这还不是全部–它追踪编辑历史以便可以复现前5此编辑。g,返回前一个编辑历史。

l CTRL-] 跳转到鼠标所在函数的定义位置,CTRL-t跳回。CTRL-t可以使你会一直返回,直到返回到开始位置。(为了使其生效你需要一个标签文件。) 这几乎达到像eclipse这种IDE价值的一半,却没他们那样造成屏幕凌乱。

l 一个IDE的另外一半是长变量或者方法名的tab完成功能。在Vim中用CTRL-nCTRL-p 来预选列表中上滚和下滚。如果你使用的是标签文件或者如果你在Vim中其他文件定义了标签,它将对变量名和方法名自动完成。

l gg=G跳转到文档顶部(gg) 自动缩进(=) 直到到达文档末尾 (G)。这使得你打开和关闭的大括号排成一行,很容易找到你忘记配对的大括号。

l U撤销最后一个命令。CTRL-r重做。:earlier 2m 恢复到两分钟前的状态。如果你不再进行撤销,继续编辑然后想重做之前的一些改动,就可以考虑用这个命令。g+g- 则在恢复树种上下切换。它变得更加复杂。

l /f 都是搜索命令,这两个命令在符合命令中起着至关重要的作用。df,从当前光标位置上的字符一直删除到遇到逗号(包括逗号)。d/foo 一直删除直到第一次匹配“foo”的位置。如果你喜欢,你可以用这来代替其他动作。

l :r 读取一个文件。:!在shell中运行命令。:r! 粘贴命令的结果输出到文档中。:r!ls whatever*比输入文件名更快。在此我并不打算介绍UNIXy中怎样通过shell脚本运行文本。

无处不在的VI
一旦你习惯于Vim的移动命令,你会乐在其中。当然了你也可以直接使用鼠标,但如果你能熟练使用Vim移动命令,你将很少用鼠标了。手一直在键盘上比时不时腾出手来操作鼠标操作要会更快很多。铁杆Vim用户会重新映射Escape 键(返回到普通模式)到其他更加方便的功能。我设置的是 Caps Lock键,在我左手小手指下面。
(我其实是通过xcapse插件映射它和Control键复合键使用。)
是的,这确实有点极端,但是比 现在已经不存在的避免Emacs导致腕管综合征的键盘设计 强多了。
如果你在Unix使用Bash shell,set -o vi 这种用法来读取行的方法几乎和vi一样。你的浏览器也可以Vim化,火狐浏览器、cVim或vimium中有Vimperator 和Pentadactyl 插件。谷歌浏览器中有ViChrome插件 。如果你想合二为一,qutebrowser是目前最好的原生Vim风格网页浏览器,而且还将会更加完善。
你若搜索 “vi keybindings”你会发现它不仅支持Visual Studio、Eclipse 还支持Emacs。
为什么Emacs里有Vi模拟模式,但Vim中却没Emacs的模拟模式呢?
稍加思索你就会明白,编辑器之战已经有了结果。
想用惯Vim需要花费一些时日。程序员想要擅长Vim,需要要摆正心态勤加练习。从1994到20011年间我用Emacs写代码、写我的学位论文、我所代课的学生的论文和学术论文。从2011年起我就开始用Vim来编写更多代码、写书、写邮件和我在Hackaday上的文章。
我仍然在不断提高,五六年间每天使用Vim 6到8小时,每月将自己总结的技巧写在指令表中。虽然Vim像任何值其他值得深入探索的东西一样,用起来有点难,但是却非常值得。不要轻信任何人告诉你他们“懂”Vim。:wq.

资源
There’s really too much to say about Vim. Here’s a short list of great resources:
关于Vim要说的实在是太多了,这里提供一些相关极有价值的参考资源:
如果你刚开始用输入 :help tutor

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。 启动vim 在命令...
    im蚂蚁阅读 30,722评论 3 48
  • 目录(?)[-] 关于Vim 1 Vim的几种模式 启动Vim 文档操作 光标的移动 1 基本移动 2 翻屏 3 ...
    SunnyLeong阅读 8,631评论 0 32
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,157评论 9 467
  • 中午那会儿,还是艳阳高照,暖烘烘的感觉,像是在火炉旁,女孩子的脸上红彤彤,像是高原红,很是美丽而可爱。 我踩着我的...
    雪海_阅读 209评论 0 0
  • 两种方法均与哔哩哔哩剩余内存统计比较过,数据一样,且都小于iOS系统 <设置>里统计的数据; 方法一: 方法二:
    南城同學阅读 8,367评论 0 18