跟我一起学习VIM - vim插件合集

2023-05-16

 
 

前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程。虽然准备有限,但分享过程中大家大多带着一种惊叹的表情,原来编辑器可以这样强大,这算是对我多年来使用VIM的最大鼓舞吧。所以分享结束之后,将这篇简短教程整理一下作为我2014年的第一篇Blog。

目录

  • 写在前面:Life Changing Editor
  • 什么是VIM
  • 为什么选VIM
    • 为什么选其它
    • 为什么犹豫选择它们
    • VIM >= SUM(现代编辑器)
  • 如何学习VIM
    • 一秒钟变记事本
    • VIM的基本用法
    • VIM进阶:插件
      • 插件管理神器:Vundle
      • 配色方案
      • 导航与搜索
      • 自动补全
      • 语法
      • 其它
    • 终极配置: spf13
    • 与其它软件集成
    • 一些资源
  • 写在最后

搭完网站之后的第一篇文章有些兴奋,先变身话痨简单回顾一下我是如何接触到VIM的,不感兴趣的同学可以直接跳过这一部分:-)

写在前面:Life Changing Editor

我是一个非常 懒 的人,对于效率有着近乎执拗的追求。比如我会花2个小时来写一个脚本,然后使用这个脚本瞬间完成一个任务,而不愿意花一个小时来手工完成这项任务,从绝对时间上来说,写脚本花的时间更长,但我依然乐此不疲。

工欲善其事,必先利其器 ,折腾各种各样的软件就成为了我的一大爱好,尤其是各种人称 神器 的工具类软件,而 善用佳软 是这类工具的聚集地,现在我使用的很多优秀的软件都得知于此,包括VIM,所以,如果你和我一样,希望拥有众多“神器”,让工作事半功倍,可以关注此站。

第一次听说VIM已经是离开校园参加工作之后的事,那时部门内部大多使用Source Insight代替Visual Studio编写代码,大家都被它的代码管理,自动完成,代码跳转等功能所吸引,但一个领导说了句很多Vimer经常会说,至今仍让我记忆尤新的一句话:

世界上只有三种编辑器,EMACS、VIM和其它

我很反对这种极端的言论,使用何种工具是一个人自由,只要能发挥一个工具最大的效率就行,不应该加以约束,更不应该鄙视。话虽如此,我却阻挡不住好奇心的驱使,琢磨着到底是什么样的编辑器会拥有这样高的评价。抱着这份好奇,我搜索到了 善用佳软 ,看到《 普通人的编辑利器——Vim 》,Dieken的《 程序员的编辑器——VIM 》,以及王垠的《 Emacs是一种信仰!世界最强编辑器介绍 》BANG……想到不久前看到的 一段话 :

南中国的雷雨天有怒卷的压城云、低飞的鸟和小虫,有隐隐的轰隆声呜呜咽咽……还有一片肃穆里的电光一闪。那闪电几乎是一棵倒着生长的树,发光发亮的枝丫刚刚舒展,立马结出一枚爆炸的果实,那一声炸响从半空中跌落到窗前,炸得人一个激灵,杯中一圈涟漪。

这种一个激灵的感觉不仅仅局限于雷雨天。在我读完上面几篇文章之后,简单的文字亦立刻击中儃中,炸的一个激灵。从此,我对编辑器的认识被完全颠覆。

很多孩子都有一个梦想:希望能够长大之后可以身着军装,腰插手枪,头戴警帽,遇到坏人之后潇洒拔出枪,瞬间解决战斗,除暴安良,匡扶正义。我这样的程序员们也有一个梦想:希望学成之后可以像电影里黑客们一样,对着满屏幕闪烁的各种符号,双手不离键盘噼里啪啦一阵乱敲,屏幕上的符号不断滚动,就攻破了几百公里之外的某某银行的服务器,向帐户里面增加一笔天文数字,然后潇洒的离去,神不知鬼不觉,留下不知所措的孩子们的梦想——警察叔叔们。这简直构成了程序员们的终极幻想:-P。VIM的出现让我感觉离幻想更近了一步,呃,别想错了,我是指——双手不离键盘,噼里啪啦,黑客的范儿。不可否认,扮酷也是促使我学习VIM的一个重要原因:-P。

在一个激灵之后,接下来便是不可自拔的陷入VIM世界,于是网上搜索各种入门教程,_vimrc的配置,折腾插件,研究奇巧淫技,将VIM打造成IDE。那感觉就像世界从此就只有VIM,写代码用VIM,Visual Studio用VIM,Source Insight用VIM,甚至写PDF,浏览网页都要用VIM,够折腾吧。可是像Vimer们一样,我依然折腾着,并快乐着。如今,折腾一圈之后,随着对Unix的KISS设计哲学逐渐理解与认可: 把所有简单的事情做到极致 。所以在对待VIM的态度上也有了一定的转变,不再执著的将它打造成万能的IDE,而仅仅让它将编辑功能发挥到极致,其它的事情交给其它更擅长的工具去做。 eep imple, tupid.

在VIM的 官方网站 上,对每个插件的评价是这样 分类 的:

  • Life Changing
  • Helpful
  • Unfulfilling

而我想将这个分类应用到使用的软件上,对于VIM,它是毫无疑问的 Life Changing 

什么是VIM

以下两句对编辑器的最高评价足矣:

  • VIM is the God of editors, EMACS is God’s editor
  • EMACS is actually an OS which pretends to be an editor

为什么选VIM

我们所处的时代是非常幸运的,有越来越多的 编辑器 ,相对于 古老的VIM 和EMACS,它们被称为 现代 编辑器。我们来看看这两个古董有多大年纪了:

**EMACS** : 1975 ~ 2013 = 38
**VI**    : 1976 ~ 2013 = 37
**VIM**   : 1991 ~ 2013 = 22

看到这篇文章的人有几个是比它们大的:-)

VIM的学习曲线非常陡, 这里 有一个主流编辑器的学习曲线对比。既然学习VIM如此之难,而 现代 编辑器又已经拥有了如此多的特性,我们为什么要花大量的时间来学习这个老古董呢?

为什么选其它

先来看看为什么我们会选现在所使用的编辑器?(也许很多人直接用IDE自带的编辑器,我们暂且也把它们划到编辑器的范畴内。)这里我简单列举一些程序员期望使用的编辑拥有的功能:

  • 轻量级,迅速启动(相对于IDE)
  • 特性
    • 语法高亮
    • 自动对齐
    • 代码折叠
    • 自动补全
    • 显示行号
    • 重定义Tab
    • 十六进制编辑
    • 列编辑模式
    • 快速注释
    • 高级搜索,替代
    • 错误恢复
    • 迅速跳转
    • Mark
  • 也许,美观也是一个诉求

但是…

为什么犹豫选择它们

总有一些理由让我们一再犹豫的选择它们,或者勉强使用它们:

  • 太贵:虽然知道VS很贵,但看到价格时,还是被吓了一跳
    • Visual Studio Profession 2012 : 11645元
    • UtralEdit : 420元
    • Source Insight : 2500元
    • $$
    • $$
    • $$
  • 不能跨平台
    • VS, SI, UE,Notepad++这些只能在Windows上使用
    • Mac上的TextMate只能运行于Mac上
  • 不容易扩展

那么,还有别的选择么?

VIM >= SUM(现代编辑器)

首先,VIM包含了上面列的所有现代编辑器的优点,并且远远多于此。

并且,VIM拥有让你不再 犹豫 的其它特性:

  • 无止尽的扩展:现在VIM的官方网站上已经有了 4704 个扩展,并且在不断增加…
  • 完美的跨平台:
    • Windows : gVim
    • Linux : 内置默认 (e.g., man page)
    • Mac : MacVim
  • 开源
  • 用起来很酷
  • 最关键的,$

废话结束,开始进入正题。

如何学习VIM

一秒钟变记事本

很多时候大家希望能够以最快的速度编辑文档,而不愿意花大量的时间在学习这一工具上,比如偶尔要去Linux改变一下配置。这时VIM有一种方法可以 一秒钟变记事本 ,打开VIM之后,只需要一个键 ,接下来所有的操作就和Windows上的记事本无异,你所喜爱与习惯的方向键也回来了。

这也并没有多神奇,它只是VIM提供的一种特殊的模式: Insert mode ,在按过 之后,你可以在编辑器的左下角看到 INSERT 字样。但是因为VIM无法使用 CTRL-来保存,那么,在编辑完之后,如何保存退出呢?也很简单,先按ESC ,再输入 :wq ,前面一步是告诉VIM退出 INSERT 模式,后面一个命令是保存退出。

我见过很多人这样用,虽然说这很容易,但是有种暴殄天物的感觉,和给了你一把AK47,你却把它当成棍子使一样。要发挥AK47的作用,还请向下看。

VIM的基本用法

最好的入门教程非VIM自带的 vimtutor 莫属,它是VIM安装之后自带的简短教程,可以在安装目录下找到,只需半个小时左右的时间,就可以掌握VIM的绝大部分用法。这是迄今为止我见过的软件自带教程中最好的一个。

当然,网上的VIM教程也非常多,我之前看的是李果正的 大家来学VIM ,很适合入门。

另外推荐陈皓的 简明VIM练级攻略 ,或者创意十足的游戏 VIM大冒险 。

VIM大冒险

这游戏的创意实在是太赞了,打完游戏,你便掌握了VIM,这才是真正的 寓教于乐 ,下面是摘自这个游戏的描述:

VIM Adventures is an online game based on VIM’s keyboard shortcuts (commands, motions and operators). It’s the “Zelda meets text editing” game. It’s a puzzle game for practicing and memorizing VIM commands (good old VI is also covered, of course). It’s an easy way to learn VIM without a steep learning curve.

最后在这里给大家分享一个vgod设计的 VIM命令图解 。这也是我看过的最好的命令图示,看完了前面的基本教程后,可以将它作为一个cheat sheet随时查看,相信用不了多久你也可以完全丢掉它。关于此图的详细解释可以参考 这里 。

VIM命令图解

VIM进阶:插件

在学完了上面任何一个教程之后,通过一段时间的练习,你已经可以非常熟练的使用VIM。即使是“裸奔”,VIM已经足够强大,能够完成日常的绝大部分工作。但VIM更加强大的是它的扩展机制,就像Firefox和Chrome的各种插件,它们将令我们的工具更加完美。网上有很多教程里写的插件已经过时,接下来我将介绍一些比较新的,非常有用的插件,看完之后,相信你一定会觉得蠢蠢欲动。

插件管理神器:Vundle

在这开始之前,先简单介绍VIM插件的管理方式。在我刚接触插件之时,安装一个插件需要:

  1. 去官网下载
  2. 解压
  3. 拷贝到VIM的安装目录
  4. 运行:help tags

这些步骤已经足够复杂,更加无法想象的是要 更新 或者 删除 一个插件时,因为它的文件分布在各个目录下,就比如Windows上的 安装路径 , Application data , 用户数据 , 注册表 等等,除非你对VIM的插件机制和要删的插件了如直掌,否则你能难将它删除干净。所以一段时间之后,VIM的安装目录下简直就是一团乱麻,管理插件几乎成为了一项不可能完成的任务。想象一下,如果Windows上面没有软件管理工具,你如何安装,卸载一个软件吧。

但是这没有难倒聪明的Vimer们,他们利用VIM本身的特性,开发出了神器—— Vundle ,配合上 GitHub ,VIM插件的管理变得前所未有的简单。来对比一下使用Vundle如何管理插件:

在按照官方的 教程 安装好Vundle之后,要安装一个插件时,你只需要:

  1. 选好插件
  2. 在VIM的配置文件中加一句 Bundle 'your/script/path'
  3. 在VIM中运行 :BundleInstall

卸载时只需:

  1. 去除配置文件中的 Bundle 'your/script/name'
  2. 在VIM中运行 :BundleClean

更新插件就更加简单,只需一句 :BundleUpdate 。现在你已经完全从粗活累活中解放了出来,从此注意力只需放在挑选自己喜欢的插件上,还有比这更美好的么?下面介绍的所有的插件都以它来管理。

配色方案

你是否觉得用了许多年的白底黑字有些刺眼,又或者你是否厌倦了那单调枯燥?如果是,那好,VIM提供了成百上千的配色方案 ,终有一款适合你。

在所有的配色当中,最受欢迎的是这款 Solarized :

阴阳八卦

在Github上它有 4,930 个Star,仅靠一个 配色方案 就得到如此多的Star,可见它有多么的受欢迎。它有两种完全相反的颜色,一暗一亮,作者非常具有创意将它们设计成一个 阴阳八卦 ,赏心悦目。下面是采用这种配色的VIM截图:

Solarized截图

Solarized配色还有一个使它能够成为最受欢迎的配色方案的理由,除了VIM之外,它还提供了很多 其它软件 的配色方案,包括: Emacs Visual Studio Xcode NetBeans Putty ,各种终端等等,应该是除了默认的黑白配色之外用途最为广泛的一种了。目前我采用的就是这种配色方案的dark background,它的对比度非常适合长期对着编辑器的程序员们。

还有一种很受欢迎的配色方案: Molokai ,它是Mac上TextMate编辑器的一种经典配色,也非常适合程序员:

Molokai截图

导航与搜索

  1. NERDTree - file navigationNERDTree

    代码资源管理器现在已经成为了各种各样IDE的标配,这可以大大提高管理源代码的效率。这样的功能VIM自然不能少,NERD Tree提供了非常丰富的功能,不仅可以以VIM的方式用键盘来操作目录树,同时也可以像Windows资源管理器一样用鼠标来操作。

    --help: 可以将打开目录树的功能绑定到你所喜欢的快捷键上,比如: map <leader>:NERDTreeToggle<CR>

  2. CtrlP - fast file finderCtrlP

    如果说上面介绍的NERD Tree极大的方便了源代码的管理方式,那CtrlP可以称的上是革命性的,杀手级的VIM查找文件插件。它以简单符合直觉的输入方式,极快的响应速度,精确的准备度,带你在项目中自由穿越。它可以模糊查询定位,包括工程下的所有文件,已经打开的buffer,buffer中的tag以及最近访问的文件。在这之前,我用的是lookupfiles ,因为依赖了其它的插件和应用程序,这个上古时代的插件逐渐被抛弃了。自从有了它,NERD Tree也常常被我束之高阁。

    据说它模仿了Sublime的名字和功能,我没用过Sublime,但是听说CtrlP这个功能是Sublime最性感的功能之一。可以去它的 官网 看看。

    --help: 这个插件另一个令人称赞的一点在于无比简单直观的使用方式,正如其名: Ctrl+,然后享受它带来的快感吧。

  3. Taglist - source code browserTaglist

    想必使用过Visual Studio和Source Insight的人都非常喜爱这样一个功能:左边有一个Symbol窗口,它列出了当前文件中的宏、全局变量、函数、类等信息,鼠标点击时就会跳到相应的源代码所在的位置,非常便捷。Taglist就是实现这个功能的插件。可以说symbol窗口是程序员不可缺少的功能,当年有很多人热衷于借助taglist、ctags和cscope,将VIM打造成一个非常强大的Linux下的IDE,所以一直以来,taglist在VIM官方网站的scripts排列榜中一直高居 榜首 ,成为VIM使用者的必备插件。

    --help: 最常见的做法也是将它绑定到一个快捷键上,比如: map <silent> <F9> :TlistToggle<CR>

  4. Tagbar - tag generation and navigationTagbar

    看起来Tagbar和上面介绍的Taglist很相似,它们都是展示当前文件Symbol的插件,但是两者有一定的区别,大家可以从上图的对比中得知,两者的关注点不同。总的来说Tagbar对面向对象的支持更好,它会自动根据文件修改的时间来重新排列Symbol的列表。它们以不同的纬度展示了当前文件的Symbol。

    --help: 同Taglist一样,可以这样绑定它的快捷键, nmap <silent> <F4> :TagbarToggle<CR>

  5. Tasklist - eclipse task listTasklist

    这是一个非常有用的插件,它能够标记文件中的 FIXME 、 TODO 等信息,并将它们存放到一个任务列表当中,后面随时可以通过Tasklist跳转到这些标记的地方再来修改这些代码,是一个十分方便实用的Todo list工具。

    --help: 通常只需添加一个映射: map <leader>td <Plug>TaskList

自动补全

  1. YouCompleteMe - visual assist for vimYouCompleteMe

    这是迄今为止,我认为VIM历史上最好的插件,没有之一。为什么这么说?因为作为一个程序员,这个功能必不可少,而它是迄今为止完成的最好的。从名字可以推断出,它的作用是代码补全。不管是在Source Insight,还是安装了Visual Assist的Visual Studio中,代码补全功能可以极大的提高生产力,增加编码的乐趣。大学第一次遇到Visual Assist时带给我的震撼至今记忆犹新,那感觉就似百兽之王有了翅膀,如虎添翼,从此只要安装有Visual Studio的地方我第一时间就会安装Visual Assist。

    而作为编辑器的VIM,一直以来都没有一个能够达到Visual Assist哪怕一成功力的插件,不管是自带的补全,omnicppcomplete , neocompletecache ,完全和Visual Assist不在一个数量级上。Visual Assist借助于Visual Studio,它的补全是语义层面的,它完全能够理解程序语言,而VIM的这些插件仅仅是基于文本匹配,虽然最近的neocompletecache 已经好了很多,但准确率非常低。所以在写代码时,即使VIM用得再顺手,绝大部分情况下我还是倾向于 Visual Studio + Visual Assist 

    但是YouCompleteMe的出现彻底的改变了这一现状,它对代码的补全完全终于也达到了编译器级别,绝不弱于Visual Assist,遇到它是我使用VIM之后最兴奋的一件事。为什么一个编辑器的插件可以做到如此的神奇,原因就在于它基于 LLVM/clang ,一个Apple公司为了代替GNU/GCC而支持的编译器,正因为YouCompleteMe有了编译器的支持,而不再像以往的插件一样基于文本来进行匹配,所以准确率才如此之高。其次,由于它是C/S架构,会在本机创建一个服务器端,利用clang来解析代码,然后将结果返回给客户端,所以也就解决了VIM是单线程而造成的各种补全插件速度奇慢的诟病,在使用时,几乎感觉不到任何的延时,体验达到了Visual Assist的级别。

    YouCompleteMe也是所有的插件当中安装最为复杂的一个,这是因为需要用clang来编译相应的库。因为clang在Linux和Mac平台上支持的非常好,所以在这两个平台上安装相对简单。但是clang并没有官方支持Windows,所以YouCompleteMe插件也没有官方支持Windows。可这么好的东西,活跃在Windows上聪明的Vimer们怎么可能容忍这种事情呢,有人就提供了 Windows Installation Guide ,已经编译好了各种版本的YouCompleteMe插件,可以参考这个Guide来安装。我并没有采用它,而是参考了 这里 ,自己编译了YouCompleteMe,其实也不难,一步一步按照介绍的步骤,相信你也可以。

    YouCompleteMe除了补全以外,还有一个非常重要的作用: 代码跳转 ,同样可以达到编译器级别的准确度,媲美Visual Assist与Source Insight。

    有了YouCompleteMe之后,是时候抛弃昂贵的Visual Assist与Source Insight了。赶快安装尝试吧:-)

    --help: 只要设置好项目的 .ycm_extra_conf.py ,自动补全功能就可以完美的使用了。通常一个全局的.ycm_extra_conf.py 足矣。代码跳转可以绑定一个快捷键: nnoremap <leader>jd :YcmCompleterGoToDefinitionElseDeclaration<CR> ,很好理解,先跳到定义,如果没找到,则跳到声明处。

  2. UltiSnips - ultimate snippetsUltiSnips

    这是什么?相信大家经常在写代码时需要在文件开头加一个版权声明之类的注释,又或者在头文件中要需要:#ifndef... #def... #endif 这样的宏,亦或者写一个 for 、 switch 等很固定的代码片段,这是一个非常机械的重复过程,但又十分频繁。我十分厌倦这种重复,为什么不能有一种快速输入这种代码片段的方法呢?于是,各种snippets插件出现了,而它们之中,UltiSnips是最好的一个。比如上面的一长串 #ifndef... #def... #endif ,你只需要输入 ifn<TAB> ,怎么样,方便吧。更为重要的一点是它支持扩展,你可以随心所欲的编辑你自己的snippets。

    现在它可以和上面介绍的YouCompleteMe插件一块使用,比如在敲完 ifn 时,YouCompleteMe会将这个snippet也放在下拉框中让你选择,这样你就不用去记何时按 <TAB> 来展开snippets,YouCompleteMe已经帮你完成。

    去它的 网站 看看,有几个视频,绝对亮瞎你的双眼(需要翻墙)。

    --help: 它和YouCompleteMe一块使用时会有一定的冲突,因为两者都默认绑定了 <TAB> 键,可以参考各自的help 文档,将其中一个绑定到其它的快捷键,或者借助 其它的插件 让它们兼容。

  3. Zen Coding - hi-speed coding for html/css Zen Coding

    比一般的 C/C++/Java 等更多重复劳动的语言估计要算HTML/CSS这类前端语言了吧,为此前端大牛发明了Zen Coding,去 这里 (需翻墙)看看演示视频,相当令人震撼。如果是写前端的话,强烈推荐此插件。

    --help: 可以去这里参考前端工程师们写的中文教程 1 , 2

语法

  1. Syntastic - integrated syntax checkingSyntastic

    这是一个非常有用的插件,它能够实时的进行语法和编码风格的检查,利用它几乎可以做到编码完成后无编译错误。并且它还集成了静态检查工具: lint ,可以让你的代码更加完美。更强大的它支持近百种编程语言,像是一个集大成的实时编译器。出现错误之后,可以非常方便的跳转到出错处。 强烈推荐 

    --help: 这是一个后台运行的插件,不需要手动的任何命令来激活它。

  2. Python-mode - Python in VIM

    如果你需要写Python,那么Python-mode是你一定不能错过的插件,靠它就可以把你的VIM打造成一个强大的Python IDE,因为它可以做到一个现代IDE能做的一切:

    • 查询Python文档
    • 语法及代码风格检查
    • 运行调试
    • 代码重构
    • ……

    所以,有了它,你就等于有了一个现代的Python IDE,各位Pythoner们,还等什么呢?

    --help: 默认情况下该插件已经绑定了几个快捷键:

     K         -> 跳到Python doc
     <leader>r -> 运行当前代码
     <leader>b -> 增加/删除断点

其它

  1. Tabularize - align everything Tabularize

    这个插件的作用是用于按等号、冒号、表格等来对齐文本,参考下面这个初始化变量的例子:

     int var1 = 10;
     float var2 = 10.0;
     char *var_ptr = "hello";

    运行 Tabularize /= 可得:

     int var1      = 10;
     float var2    = 10.0;
     char *var_ptr = "hello";

    另一个常见的用法是格式化文件头:

     file: main.cpp
     author: feihu
     date: 2013-12-17
     description: this is the introduction to vim
     license: 
     TODO:

    运行 Tabularize /:/r0 可得:

     file        : main.cpp
     author      : feihu
     date        : 2013-12-17
     description : this is the introduction to vim
     license     :
     TODO        :

    另一种对齐方式,运行 Tabularize /:/r1c1l0 

            file : main.cpp
          author : feihu
            date : 2013-12-17
     description : this is the introduction to vim
         license :
            TODO :

    对于写代码的人来说,还是非常有用的。因为没有找到对应的图,所以这里就用 另外一个插件 的动画来代替了,Tabular的功能比它更为强大。

    --help: 通常会绑定这样一些快捷键:

     nmap <Leader>a& :Tabularize /&<CR>
     vmap <Leader>a& :Tabularize /&<CR>
     nmap <Leader>a= :Tabularize /=<CR>
     vmap <Leader>a= :Tabularize /=<CR>
     nmap <Leader>a: :Tabularize /:<CR>
     vmap <Leader>a: :Tabularize /:<CR>
     nmap <Leader>a:: :Tabularize /:\zs<CR>
     vmap <Leader>a:: :Tabularize /:\zs<CR>
     nmap <Leader>a, :Tabularize /,<CR>
     vmap <Leader>a, :Tabularize /,<CR>
     nmap <Leader>a,, :Tabularize /,\zs<CR>
     vmap <Leader>a,, :Tabularize /,\zs<CR>
     nmap <Leader>a<Bar> :Tabularize /<Bar><CR>
     vmap <Leader>a<Bar> :Tabularize /<Bar><CR>
  2. Easymotion - jump anywhereEasymotion

    VIM本身的移动方式已经是极其高效快速,它在编辑器的世界中独树一帜,算是一个极大的创新。而如果说它的移动方式是一个创新的话,那么Easy Motion的移动方式就是一个划时代的革命。利用VIM的 #w 、 #b 、 :# 等操作,移动到一个位置就像是大炮瞄准一个目标,它可以精确到一个大致的范围内。而Easy Motion可以比作是精确制导,它可以准备无误的定位到一个字母上。

    这种移动方式我曾在Firefox和Chrome的VIM插件中看到过,跳转到一个超链时就采用了同样的方式,但是由于浏览网页的特殊性与随意性,当时我没有适应。在编辑的时候就不一样了,编辑更加专注,更带有目的性,所以它能够极大的提高移动速度。享受这种光标指间跳跃,指随意动,移动如飞的感觉:-P

    --help: 插件默认的快捷键是: <leader><leader>,效果如上图所示。

  3. NERDCommenter - comment++NERDCommenter

    又是一个写代码必备的插件,用于快速,批量注释与反注释。它适用于任何你能想到的语言,会根据不同的语言选择不同的注释方式,方便快捷。

    --help: 十分简单的用法,默认配置情况下选择好要注释的行后,运行 <leader>cc 注释, <leader>cu 反注释,也可以都调用 <leader>c<SPACE> ,它会根据是否有注释而选择来注释还是取消注释。

  4. Surround - managing all the “’[{}]’” etcSurround

    在写代码时经常会遇到配对的符号,比如 {}[]()''""<> 等,尤其是标记类语言,比如html, xml,它们完全依赖这种语法。现代的各种编辑器一般都可以在输入一半符号的时候帮你自动补全另外一半。可有的时候你想修改、删除或者是增加一个块的配对符号时,它们就无能为力了。

    Surround就是一个专门用来处理这种配对符号的插件,它可以非常高效快速的修改、删除及增加一个配对符号。如果你经常和这些配对符号打交道,比如你是一个前端工程师,那么请一定不要错过这样一个神级插件。

    --help: :部分常用快捷键如下:

     Normal mode
     ds  - delete a surrounding
     cs  - change a surrounding
     ys  - add a surrounding
     yS  - add a surrounding and place the surrounded text on a new line + indent it
     yss - add a surrounding to the whole line
     ySs - add a surrounding to the whole line, place it on a new line + indent it
     ySS - same as ySs
        
     Visual mode
     s   - in visual mode, add a surrounding
     S   - in visual mode, add a surrounding but place text on new line + indent it
        
     Insert mode
     <CTRL-s> - in insert mode, add a surrounding
     <CTRL-s><CTRL-s> - in insert mode, add a new line + surrounding + indent
     <CTRL-g>s - same as <CTRL-s>
     <CTRL-g>S - same as <CTRL-s><CTRL-s>
  5. Gundo - time machine Gundo

    现代编辑器都提供了多次的撤消和重做功能,这样你就可以很放心的修改文档或者恢复文档。可是假如你操作了5次,然后撤消2次,再重新编辑后,你肯定是无法回到最开始的3次编辑了,因为在你复杂的操作后,编辑器维护的Undo Tree实际上出现了分支,而一般的 CTRL+和 CTRL+无法实现这么复杂的操作。

    这时VIM的优势又体现了出来,它不仅提供无限撤消,VIM 7.3之后还有永久撤消功能,即使文件关闭后再次打开,之前的修改仍然可以撤消。而Gundo提供了一个树状图形的撤消列表,下方还有每次修改的差异对比,分支一目了然,相当于一个面向撤消与编辑操作的版本控制工具。有了它,你的文件编辑就像是有了一台时光机,可以随心所欲的回到任何时间,乘着你的时光机,放心大胆的去穿梭时空吧:-P

    --help: 通常会将这句加入 _vimrc : nnoremap <Leader>:GundoToggle<CR>

  6. Sessionman - session manager

    这是VIM的Session Manager,作用很简单,管理VIM的会话,可以让你在重新打开VIM之后立刻进行之前的编辑状态,就像Windows的休眠一样,相信它一定是你工作的好伴侣。

    --help: 我的配置如下:

     set sessionoptions=blank,buffers,curdir,folds,tabpages,winsize
     nmap <leader>sl :SessionList<CR>
     nmap <leader>ss :SessionSave<CR>
     nmap <leader>sc :SessionClose<CR>
  7. Powerline - ultimate statusline utility Powerline

    增强型的状态栏插件,可以以各种漂亮的颜色展示状态栏,显示文件编码,类型,光标位置,甚至可以显示版本控制信息。不仅功能强大,写着代码时看着下面赏心悦目的状态状,心情也因此大好。像我一样的外观控一定无法抗拒它:-)

    --help: 简单实用,无需多余的配置。

终极配置: spf13

至此,我经常用到的所有插件都介绍完了,如果你也都安装尝试一下的话,相信很容易就配置出来符合你个人习惯的强大的IDE。也许有人会想,这么多的主题、个性化设置、插件,配置太麻烦,有没有已经配置好的,可以直接拿来使用呢?其实我当时也有一样的想法,在折腾了很久之后,发现 _vimrc 已经非常庞大且混乱,亟需整理。再后来就发现了它, spf13 

spf13

它是 Steve Francia’s Vim Distribution ,但是组织的非常整洁,容易扩展,并且跨平台,易于安装维护。在看到的所有_vimrc 中,这是写的最漂亮的一个。只需要一个简单的脚本就可以 安装 ,这里面利用了方便的 Vundle 集成了绝大部分前面介绍的插件,并且还有大量其它的插件,具体可以看它的 .vimrc.bundles 

因为它完美的结构组织,你完全可以在不修改它任何文件的基础上,对应增加几个自己的 ~/.vimrc.local ~/.vimrc.bundles.local , ~/.vimrc.before.local 文件来增加自己的个性化配置,或者增加删除插件,可扩展性极强。在我的 _vimrc 乱成一团的情况,果断fork并安装了这个Distribution,增加了自己的一些配置,最终形成了现在的VIM。如果你也不愿折腾配置,那么完全可以直接安装它,省事方便的同时还可以学习一下它的组织结构,一举两得。

与其它软件集成

因为VIM的操作方式广泛为人们所逐渐接受,尤其是经常工作在Linux下的人们,所以它越来越多的被集成到其它一些常用的工具上,我用过的就包括:

  • Visual Studio

    本身Windows下的gVim安装包在安装时会提供一个集成到Visual Studio中的插件 VsVim ,可以选择安装,但它是另开一个VIM的窗口来编辑当前的文件,我并不习惯这种方式,所以又找到了 ViEmu ,它完美的将VIM的操作方式集成到了Visual Studio中,让你根本感觉不到这是在使用Visual Studio。更加强大的是,它可以完美的和Visual Assist集成:

    Build 1854 contains a workaround for case=58034. Create a binary registry value named TrackCaretVisibility under HKCU\Software\Whole Tomato\Visual Assist X\VANet10 and set its value to 00 for compatibility with ViEmu. (The value defaults to 01 and is created for you upon exiting VS the first time you run 1854 or higher.) Note you need to close all IDEs before editing this registry key, to avoid Visual Assist X overwriting your change when it exits.

    在遇到YouCompleteMe之前,这就是我所采用的编程环境。但这是一个商业版的插件,只有30天的试用期,如果你真的喜欢它的,完全可以买下它,绝对物超所值。更为强大的是它还支持 Xcode 、 Word 、 Outlook 、 SQLServer ,这一定是一个极端的Vimer的项目:-),来看看它的动画:ViEmu

  • Source Insight

    VIM也可以集成到Source Insight中,不过我没有去找相应的插件,只找一种和前面介绍的 VsVim 一样的方法:

    • 在Source Insight菜单中,Options-Custom Commands
    • Run: “C:\Program Files\Vim\vim74\gvim.exe” –remote-silent +%l %f
    • Dir: %d
    • Add之后再Options-Key Assignments,将它绑定到一个快捷键中,比如 F11

    这样编辑一个文件时,如果你想打开VIM时,直接按 F11 ,它就会跳到当前行,编辑完之后关闭VIM,又回到Source Insight中。这种方法我用过一段时间,后来由于很少用Source Insight写代码,也逐渐淡忘了。

  • Firefox/Chrome

    在狂热于VIM的年代,我曾想把一切操作都变成VIM的方式,包括上网。所以就找到了 Vimperator ,但终究由于上网是一种更加随性、无目的的行为,拿着鼠标随便点点完全可以了,所以也就放弃它,回归到正常的操作方式下,有兴趣的可以把玩一下,很有意思,之前谈到的 Easy Motion 我就在这里见识过。Chrome下也有相应的 插件 。

一些资源

最后附上一些有趣有用的资源:

  • 一篇非常好的为什么使用VIM的文章,请看 这里
  • 为什么VIM使用HJKL作为方向键?请看 这里
  • 为什么VIM和EMACS被称为最好的编辑器?这看 这里
  • VIM作者的演讲:《 高效编辑的7个习惯 》,视频请点 这里

写在最后

网上可能有很多人像我之前一样,过于关注工具本身,而忽略了一个非常重要的问题:工具之所以称为工具,仅仅在于它是被人们拿来使用,只要顺手就好,用它来做的事情才是关键。对于我们开发人员来说,专业知识永远比工具更为重要。自打VIM出生以来,就有几个亘古不变的话题:

  • VIM vs Emasc
  • VIM vs 其它编辑器
  • VIM vs IDE

争论从来没有平息过,从远古时期的大牛们,到刚刚踏入VIM阵营的我们,也从来没有一个结论。也许很多人争吵已经不再是单单的编辑器之争,而是出于维护心目中最好的工作方式,甚至哲学之争。但对于大部分人来说,只要你的工具足够称手,那么多写几行代码,多看些书,远比参与这些无休止的争吵强得多。但如果你更深一步,开发出更好的编辑器,或者插件,那又另当别论了。

这篇教程至此也将告一段落,说是教程,本文却并没有详细的介绍如何入门,反而回忆了一大段个人学习VIM的经历,然后介绍了常用的优秀插件。也许看完本文,你并不一定能够学会VIM,但是它提供了很多比本文更有价值去学习的资源,给了你一个整体的认识,让你看到VIM可以强大到什么程度,避免走很多弯路。看完本文之后,你能够知道如何入门,如何去选插件,我想,对于本文来说,这就够了。

转自:http://ju.outofmemory.cn/entry/79671

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟我一起学习VIM - vim插件合集 的相关文章

  • 我可以使用 VIM 查看 Python 中函数的文档字符串吗?

    在 VIM 中编写 Python 时 有什么方法可以查看函数的文档字符串吗 例如 def MyFunction spam A function that foobars the spam returns eggs return foobar
  • Vim langmap 中断插件 (bépo)

    我正在使用 b po 键盘映射 http bepo fr http bepo fr 并寻求完美的 vim 映射 So far I used a long list of noremap http bepo fr wiki Vim B C3
  • 如何在 Vim 中转置文件中的行和列的内容?

    我知道我可以使用 Awk 但我使用的是 Windows 机器 并且我正在为可能没有 Awk 的其他人创建一个函数 我也知道我可以编写 C 程序 但我不希望我正在制作的 Vim 实用程序需要编译和维护 原始文件可能是 THE DAY WAS
  • 有没有办法在 Vim 中映射 Ctrl 句点和 Ctrl 逗号?

    我似乎找不到绘制地图的方法
  • 在 VIM 中缩进文件夹中的所有文件

    我有一个包含数百个 TTL TeraTermLanguage 文件的文件夹 现在我想缩进所有这些文件 我已经创建了用于缩进的 teraterm vim 并使用 VIM 打开一个文件并执行 gg G 整个文件得到了正确的缩进 但是有什么方法可
  • Vim 中的空格作为制表符和退格键行为

    在我的 vimrc 中我有 set shiftwidth 4 set tabstop 4 set expandtab 当我点击 Tab 按钮时 设置为使用 4 个空格而不是 Tab 但是当我在 Tab 之后按退格键时 我需要退格所有 4 个
  • 在 Vim 中的缩进线上按“Home”

    我有一个坏习惯 就是使用 home 键返回到行首 当我最近开始使用 vim 时 我注意到当我在缩进的行上按 home 键时 它会让我回到该行的开头 在 Notepad 我曾经使用的编辑器 中 它会让我返回到该行代码的开头 就在缩进之后 有没
  • 带有 Viper 和 Vimpulse 的 Emacs 缺少哪些 Vim 功能?

    Emacs 的一些重要功能在 Vim 中是缺失的 例如 comint 模式 并且没有脚本 插件可以替代它们 与 Emacs 相比 Vim 也有一些优点 例如模式编辑和通常更好的默认快捷键 然而 Viper 模式让我两者兼而有之 Vimpul
  • 运行 tmux 时映射箭头键

    这些键映射在 tmux 中停止工作 在我的 vimrc 我有 nmap
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • 在键盘快捷键上插入预定义文本

    我经常插入binding pry当我调试我的 ruby 文件时 当我使用 Vim 时 我希望将其自动化 以避免每次都重新输入 我怎样才能做到呢 我想要映射的确切顺序是 插入新行 Insert binding pry到新创建的行 返回正常模式
  • Linux 上 的默认键绑定是什么? Mac 将此绑定到命令

    Vim 的一些示例设置 例如janus https github com carlhuda janus 将命令键绑定到某些命令 例如 Command Shift F for Ack map
  • 在Vim函数中获取不带文件扩展名的文件名

    我想在Vim中获取不带文件扩展名的文件名 我在我的中编写了以下函数 vimrc文件来编译并运行Java程序 function JAVA RUN javac M endfunction map
  • vim 中的正则表达式查找和替换:向数字添加 .0

    我有一个如下所示的文件 1 1 0 1 6 1 0 2 8 1 0 3 10 1 0 4 12 1 0 6 如何为所有数字添加 0 后面的数字除外 我认为用正则表达式来做到这一点应该不会太难 但是我的正则表达式知识太生疏了 使用 VIM s
  • 在 Vim 中隐藏所有(不)匹配的行

    是否可以在 vi 或 Vim 中显示 隐藏所有匹配行 不突出显示 而只显示那些行 例如 我有一个带有单词单词的文本ERROR 如何让它只显示包含以下内容的行ERROR以及如何只显示线条而不显示ERROR 有解决办法吗不删除所有匹配的行然后撤
  • 如何在 Vim 中同时打开多个文件?

    有没有办法从 Vim 中打开目录中的所有文件 所以一个 command这实际上是说 打开下面的所有文件 some path进入缓冲区 理想情况下 递归地打开目录下的所有文件会很棒 您正在寻找的命令是 args 例如 args path to
  • 如何从 Vim 中发送转义序列?

    因此 最近苹果公司支持在终端的状态栏中显示工作目录和文件 必须发送的转义序列 以设置当前文件 是这样的 ESC 6 Pt BEL where Pt is a file url 指向当前正在编辑的文件 所以我想我可以让 Vim 发送这个命令作
  • 如何使用 vim 作为寻呼机设置彩色 git diff

    我无法配置 git 来遵循我的请求 使用 vim 作为差异分页器 在交互模式下添加文件时保留差异颜色 My gitconfig setup color ui auto diff false pager diff vim 通过此配置 交互模式
  • 如何使用 vim 作为“git log”编辑器?

    当我跑步时git log 编辑器到底是什么git log正在使用 Also 无论如何我可以使用吗vim作为我的默认编辑器git log 如果我想搜索 git 日志 最好的方法是什么 现在我正在做类似的事情 git log grep bla
  • 移动相邻选项卡以进行拆分?

    有没有一种简单的方法可以将 Vim 中的相邻选项卡作为拆分移动到当前窗口 While looking around I reached a mailing list discussion where someone said it s th

随机推荐

  • CAN总线多帧即连续帧数据发送 拆包与重装

    1939协议支持多帧数据发送即数据超过8个的帧发送 用户可以通过ID来识别当前帧是否为多帧发送 xff08 连续帧 xff09 xff0c 如果是多帧发送ID xff0c 举例 xff1a 1C EC F4 56 其中 F4和56为目标地址
  • DLT645-2007 规约 电表 报文解析

    注 xff1a 本文为转载 转载地址 xff1a https wenku baidu com view cc10838283d049649b66580d html DLT645 2007 规约 常见报文解析 2012 9 29 by leg
  • 同相比例放大器 输入端 平衡电阻的问题

    同相比例放大器 xff0c 电路原型如下 xff0c 该图是从网上摘取的 xff08 如侵权请联系删除 xff0c 原网址链接见注1 xff09 其中R1为平衡电阻 xff0c 该电阻存在的意义个人认为用于平衡 43 和 向的输入电流 xf
  • SIM800C 透传模式与非透传模式测试对比

    测试过程中 xff0c 公网 IP地址为 xff1a 39 162 72 33 1080 测试 SIM xff1a 中国移动物联卡 测试数据格式 xff1a 16进制 链路连接 xff1a 单路 工作模式 xff1a TCP客户端 说明 x
  • PADS 无模命令 层显示

    Z 43 1 显示的为第一层 Z 43 2 显示的为第二层 依次类推 Z 43 o 显示外层 xff0c 即首层 Z xff08 n M 即显示第几层到第几层 Z 显示所有层 ZT 显示顶层 ZB 显示底层 ZSM Z B显示底层Z C显示
  • 16位精度 ADC 选型

    ADS8320 售价 xff1a 人民币25 40元 ADS8320 16 Bit High Speed 2 7 V to 5 V microPower Sampling Analog to Digital Converter 1Featu
  • 怎么样在stata上安装pwcorr_a啊?findit pwcorr_a之后就是下面图那样?

    怎么样在stata上安装pwcorr a啊 xff1f findit pwcorr a之后就是下面图那样 xff1f 转载 xff1a 我的电脑用findit 不行 xff0c 经管之家的要收费 xff0c 在Gitte网站找到一个开源的压
  • 奇偶校验(附代码实现)

    定义 奇偶校验 Parity Check 是一种校验代码传输正确性的方法 根据被传输的一组二进制代码的数位中 1 的个数是奇数或偶数来进行校验 采用奇数的称为奇校验 xff0c 反之 xff0c 称为偶校验 采用何种校验是事先规定好的 通常
  • libcurl在windows中编译和使用的说明文档(官方翻译)

    使用Visual C构建先决条件 本文档描述了如何编译 xff0c 构建和安装curl和libcurl 从使用Visual C构建工具的来源 要用VC构建 xff0c 你会 当然要先安装VC 所需的最低版本VC是6 xff08 Visual
  • odroid xu4安装ROS melodic+远程登录+Roboware 开发

    odroid xu4安装ROS melodic 43 远程登录 43 Roboware 开发 一 odroid xu4安装ROS melodic二 远程登录odroid xu41 odroid xu4自动登录2 odroid xu4配置固定
  • Vector 简介和优缺点

    引用 xff1a https blog csdn net taiyang1987912 article details 50351827 vector向量相当于一个数组 在内存中分配一块连续的内存空间进行存储 支持不指定vector大小的存
  • PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱

    Veency是一款可以用电脑控制你的iPhone的插件 xff0c 作者是大名鼎鼎的Cydia的创始人Jay Freeman xff0c 也就是Saurik 但是最高支持到IOS9 xff0c 在IOS 10以上无法使用 基于Veency
  • 【Windows】Shellcode免杀,过360、火绒、Defender 静态及主防

    Shellcode xff0c 顾名思义是一段拿来执行的代码片段 xff0c 我们可以使用Shellcode来完成我们需要的任务 弹窗的代码 xff0c 可以被认为是一段Shellcode xff0c 获取某个模块的基址的代码 xff0c
  • Metasploit体系结构和目录

    一 Metasploit体系结构 一 xff09 基础库文件 metasploit基础库文件位于源码根目录路径下的libraries目录中 xff0c 包括Rex framework core和framework base三部分 Rex是整
  • Metasploit Framework Handbook

    文章目录 前言MsFrameworkMetasploit诞生发展体系结构功能阶段工具管理基本命令情报搜集网络服务渗透测试 Refference 前言 众所周知Metasploit工具是一款强大的渗透测试利器 xff0c 在渗透测试中堪称一条
  • 简单无锁队列的实现和使用

    无锁队列越来越流行 xff0c 在特定的场合使用不同的无锁队列 xff0c 可以起到节省锁开销 xff0c 提高程序效率 Linux内核中有无锁队列的实现 xff0c 可谓简洁而不简单 核心判断部分利用了整数溢出机制 xff0c 这个有很多
  • 关于网狐棋牌6603源码的整理、编译和搭建

    最近换工作 xff0c 趁着有一段清闲时间 xff0c 整理了一下网狐棋牌的源码 xff0c 这份源码下载很久了 xff0c 一直呆在硬盘 这次正好好好看看 网狐的代码质量很高 xff0c 流露出来的代码也比较完整 xff0c 基本上都能编
  • Pycharm:注释、删除所有注释

    1 单行注释 2 39 39 39 多行注释 39 39 39 3 删除所有注释 CTRL 43 R进入替换模式 xff0c 勾选右上角正则表达式 xff0c 然后在搜索框输入 xff0c Replace All即可
  • Outlook 2016 pst/ost邮件数据文件迁移实现

    当使用outlook 2016新建Email账户的时候 xff0c 其数据文件 xff08 ost文件 xff09 总是被保存在C盘默认目录 C Users 用户名 AppData Local Microsoft Outlook 下 xff
  • 跟我一起学习VIM - vim插件合集

    前两天同事让我在小组内部分享一下VIM xff0c 于是我花了一点时间写了个简短的教程 虽然准备有限 xff0c 但分享过程中大家大多带着一种惊叹的表情 xff0c 原来编辑器可以这样强大 xff0c 这算是对我多年来使用VIM的最大鼓舞吧