目录

Vim 学习记录

介绍

很久以来,一直想写一些关于 Vim 的使用博客。但是随着对 Vim 的了解加深,我意识到自己还达不到创作文章介绍Vim的能力。 一方面是因为自己对 Vim 的了解实在是有限,很多东西都只是鹦鹉学舌,了解简单的用法,而介绍这些基本用法的博客文章等浩如烟海,因此没有重复赘述的必要。 另一方面是因为随着学习的深入,我也接触到了很多优秀的博客文章,值得仔细研读。同时也意识到自己的水平跟这些文章的作者相去甚远,想要达到同等水平况且需要些时日,更不用说写出更有深度的东西了。

鉴于以上原因,我决定首先将我学习过程中所参考的优秀学习资料进行汇总和简介。如果初学者能看到本文,并因此在学习中少走些弯路,那便是本文的价值。 另外,我应该不会写偏向于大而全的 Vim 介绍博客,至少目前不会。但是我可能会写一些关于某些功能点的深入学习和记录的文章,我认为在当前网络中所能搜索到的文章中,这类更有价值。

目前本人主要使用的是 Vim ,但是目前 Neovim 似乎后来居上,大有取而代之之势,并且 github 上有很多优秀活跃的 Neovim 插件在开发。从长久趋势来看,新的东西总是基于已有设计,总结经验,克服弊端,并最终淘汰旧的。从传承上来看, Neovim 不过是对 Vim 的推倒重建式的重构,亦如当年 Vim 对于 Vi 编辑器的改良一般。

据称 Neovim 完全兼容 Vim 的功能和配置,并提供了额外的功能,从其风靡程度来看,我也相信这一点。但至少从目前来看,我还没有足够的理由和动机去使用它。也许还是缺少一个契机。这个契机就是遇到 Vim 无法或很难解决的痛点,并且 Neovim 可以很容易解决。而在这之前,则需要对 Vim 更加熟练的使用。

综合教程

入门教程: Vimtutor

Vimtutor 作为自带的官方教程,其作为入门教程的权威性自然不言而喻。当然,除了其明面上的地位之外,其作为一个入门教程,给初学者提供了一个很好的实际操作体验,该教程会提供一些例子供阅读者进行实际的操作,比起仅仅列举式的功能介绍,该导论还是挺容易被初学者接受的。 下面是截取的一部分例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                     Lesson 1.3: TEXT EDITING - DELETION


           ** Press  x  to delete the character under the cursor. **

  1. Move the cursor to the line below marked --->.

  2. To fix the errors, move the cursor until it is on top of the
     character to be deleted.

  3. Press the  x  key to delete the unwanted character.

  4. Repeat steps 2 through 4 until the sentence is correct.

---> The ccow jumpedd ovverr thhe mooon.

  5. Now that the line is correct, go on to lesson 1.4.

NOTE: As you go through this tutor, do not try to memorize, learn by usage.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

整篇教程不长,一小时之内就能读完,然后就能够对平时经常用到的绝大部分功能有一个大概的认识。如果想要熟练掌握,还是要勤加练习,并且强迫自己用不同的方式实现某一功能。

该教程是随Vim一块安装的,打开方式很简单,只需在终端敲入vimtutor

1
$ vimtutor

如果想打开中文版(对,居然自带中文版😃),可以使用vimtutor zh_cn命令。 当然,该文档也可以从Vim中打开,在normal模式敲入:

1
:e $VIMRUNTIME/vim/tutor/tutor.zh_cn.utf-8

不过还是推荐使用vimtutor进行打开,因为在使用该命令时,Vim会自动把原文档复制一份成临时文件然后打开。因此,对通过该方式打开的文档进行操作不会改变原文档。这样使用者就可以放心操作了。

其他入门教程

简明Vim练级攻略

这是一篇11年的教程,虽然时间稍早,但是排版易读,语言诙谐,并且加入了很多图片和动图,对读者比较友好。目前该文已有超多120万的阅读量👍。 这篇教程整体内容跟Vimtutor差不多,可以看成是Vimtutor的补充,读完Vimtutor之后可以读下这篇,跟着操作一遍,可以起到复习的效果。

Vim实操教程

文如其名,这同样是一份注重实际操作的教程,整体内容也跟上两个文档差不多,可以作为补充一块阅读。 该教程的优点是排版较好,有着类似于书籍的章节排版,逻辑清晰。而且相对上两篇而言,比较新一些,同时有一些关于插件的简单介绍。

每日一vim

这是一个教程系列,共计30篇,每篇介绍一个功能,篇幅较短,阅读的时候不会有心里负担,当然对于功能的介绍也是浅尝辄止,读者可以根据需要有选择性的阅读。

高级进阶:Vim从入门到精通(vim-galore-zh_cn)

当搜索Vim的学习教程时,很多人都推荐《Vim galore》,这篇文章就是其中文翻译。虽然中文翻译有点俗套的编程语言教程内味,但是并不影响这是一篇很好的Vim教程。

该仓库下就链接了其他语言的版本,英文好的可以读英文原版,不太好的可以读中文,并且该教程还有日语、西班牙语和俄语选项,都是开源社区贡献的,这也从侧面印证了该教程的牛x。

相对于上面所提到的入门教程,该文章提供了更加深入的介绍,但同时也不那么容易阅读,需要反复咀嚼才能将其学透。 我在第一次看该教程的时候,已经读了上面那些教程,并且有了一段时间的Vim使用经验,但是还是有很多地方读不懂和不理解。后来慢慢的对于里面的内容有了认识(比如那么多的寄存器),但是还是有些不太懂。 所以建议初学者可以先不要读此教程,待有了一定的基础之后再来阅读,当然该教程也需要反复复习。越是经典的教程越是值得我们反复咀嚼,并且每次阅读都会有新的收获。

高级进阶:Vim学习笔记

这是一个颇为低调的学习笔记,如果不是偶然看到,可能很难搜索到该教程,该教程所对应的github博客主页甚至都是空白的。据作者称,这是他从一本书整理而来。 经过简单浏览我发现这本书还是不错的,介绍深入浅出,不会只简单介绍基本操作,而是对Vim有较为高级的介绍。 博客内容很丰富,感觉有时间可以学习学习。

插件

配置教程

所需即所获:像 IDE 一样使用 vim

这是我阅读的第一篇关于Vim插件配置的文章,主要是我在搜索关于Vim配置的文章的时候,这篇文章高居搜索引擎榜首。虽然已经五年没有更新了,但仍然在github上有9k Star。 这是我读到并且跟着操作的第一篇关于插件配置的博客,该博客涉及的内容很多,以至于很难短时间内搞明白所有的内容,事实上我到现在还搞不明白有些插件的用处。因此需要在实际操作中逐渐摸索。 因为时间原因,文中有些插件早已经被开发者放弃或者被其他的插件所代替。因为不同的人需求也不尽相同,所以有很多文中列举的插件其他使用者可能会觉得根本没有必要。

考虑到以上原因,我采用的方法是首先将所有的配置文件直接拷贝下来,然后逐渐学习和摸索每个插件的用处,然后增删改查,最后打造属于自己的配置。 直接使用现成配置的好处是增加学习过程中的收获感,因为配置完成之后直接就可以看到最终的效果,虽然这个阶段对每一个功能都一脸茫然,但是仍然可以增加自己的成就感。而如果从头开始摸索的话,则可能因为工作量太大并且久久看不到自己想要的效果而丧失学习乐趣。

逐渐摸索下来之后便可对插件进行逐一学习和探索,并且你会逐渐发现这项工作深不见底。因为从对已有插件简单的使用到掌握复杂的配置已经是一个颇为困难的过程,更不用说你甚至可以直接写自己所需的插件。真是学海无涯啊~

这里同样推荐一些成熟配置以供参考,当然关于Vim的配置在网上一搜一大堆,在github的topics中也能找到很多高star仓库,以下是摘录的几个:

SpaceVim

该项目也许是最有名的Vim配置,在github的vimrc话题中高居榜首,其甚至有中文文档(后来才知道该项目原来就是由国人发起的👍)。官网称自己为Vim发布(Vim distribution),感觉就像BSD是作为Linux操作系统的一个发布一样。该发布非常成熟,当然也比较复杂。 我没用过,但是感觉入门成本应该比较低,按照成熟的官方文档进行配置应该没啥问题。因此该配置对于想直接使用Vim配置完全体的用户来说比较友好。

但是我本人没有用该配置的原因也是如此,该配置太成熟和复杂了,以至于很难入手去学习。对我自己而言,一个简易配置,并且容易上手鼓捣的版本才比较适合我。 因为这样可以很好的折中使用体验和入门成本,这也是我选择上述文章学习的原因。

另外要说的一点,当自己逐渐熟悉Vim的配置流程之后,会发现SpaceVim的源码是一个很好的学习材料。

k-vim

该配置在github上也有高star,并且作者是国人。该配置的说明文档不是特别详细,但是问题不大,因为该配置并不是特别复杂,并且在配置文件中有很好的注释。虽然感觉项目稍老,而且开发也不是特别活跃,但是是一个很好的入门和学习素材。

另外作者还开发了一个简化版的vim-for-server版本,用于不太方便安装插件的场景,对我很有启发,我决定也要搞这么一个东西。

myvim

最后允许我厚颜无耻的放上我自己的Vim配置,这是我自己摸索的一个配置,虽然简单,但是暂时够用,同时我也会不断的摸索和完善该配置。

在某博客上读到一句话,感觉比较赞同,大概意思是应该将Vim打造成适合自己的方式,而不是自己去适应已有的配置。这也可能也是大多数人一直乐此不疲折腾的原因吧。 所以以上参考都只是参考和学习资料,毕竟什么配置最合适只有自己知道。

插件推荐

关于插件的推荐,网上同样有很多相关的教程。同时,也可以经常看vimawesome 网站。这个网站有很多流行的插件推荐,可以根据自己的需要进行摸索, 这里我根据自己的使用情况介绍几个个人感觉比较重要的:

我认为首先需要做的是一些美化工作,这包括找一个合适的主题,还有漂亮的状态显示工具。 当然,在最开始之前,最好安装一个插件管理程序,以便于管理。

关于这方面的插件有几个不错的,其中包括Vundle, vim-plug, dein。这几个插件的评分都挺高的,而且功能也相近。

其中Vundle是一个比较老的插件,同时可能也是最流行的一个。 目前对我来说,该插件完全够用。因为我只是需要一个能自动安装插件的这么一个管理器,而且我平时用的插件也不算多,所以对性能等要求也不算特别高。

但遗憾的是Vundle插件似乎已经停止开发了,但是其他的两个插件仍处在活跃开发中。其中vim-plug是我看到的被推荐次数最多的替代品,安装该插件只需要下载一个名为plug.vim的文件。该插件支持一些新的功能,比如可以指定版本和标签,以及设置插件加载的时间。

也许等我安装的插件比较多,需要这么一个懒加载插件管理器来提升速度,或者想要尝试一下新的功能的时候,我会试着学习下该插件,但目前似乎还不是时候。

dein的功能不是特别了解,但感觉应该会跟vim-plug差不多。这三个插件选择一个即可。

另外,本人最近又读到了一些文章,提倡尽量简化配置,尽量多用vim自带的功能来代替那些可有可无的插件,即 “如非必要,勿增实体” 。而据说vim 8.0之后的版本自带插件的管理功能,关于这点,留待以后学习研究。目前还是用些易用的管理插件比较好,这同样也是基于折腾成本与获得感的考虑。

https://i.loli.net/2021/11/22/wNt5PvpkadhErHq.png
Vim 截图

下面开始推荐我认为有必要安装的插件:

gruvbox 主题

对于一个编辑器来说,好用自然是第一要素,但是颜值也是不可或缺的重要因素。漂亮的界面让人看起来心情愉悦,只有这样才能写出好的程序(或者任何东西)。 关于颜值,那么就不得不说主题了,一个主题相当于一个人的穿着,决定着整体形象。

我选择了比较流行,但更重要的是自己比较喜欢的 gruvbox 主题。我感觉该主题看起来比较舒服,而这个结论是我经过多个主题的实际安装对比得出来的,可能会有其他更漂亮和科学的主题,但是目前我选择了这个我已经比较满意的。 该主题的整体配色如上图所示。

同时我建议大家在选择自己的主题之前,一定要自己多多对比,然后选择自己看起来比较舒服的主题。这个就像买衣服一样,合不合适只有自己知道。(发现上面举得穿着的例子还挺合适😂)

vim-airline 状态栏

如果说主题是编辑器的穿着的话,那么 vim-airline 就像是装饰品,可以起到画龙点睛的作用。 即使不从美观角度来考虑,通过将自己经常需要敲命令查看的东西放在我们易于看到的地方,也会给效率带来巨大的提升。 而该插件可能就是目前这方面做的最好的一个。

该插件目前仍然在不断开发和维护当中,该插件不仅提供底部状态栏(上图 A2 部分),而且还有顶部标签栏(上图 A1 部分所示),并且提供了很多选项供使用者进行配置。当然,对于不需要深度定制的用户,简单使用默认配置即可。我就曾经在这个插件上花了很长的时间,几乎阅读了所有的文档。当最终结果还是很好的,正是有了这个插件,我才真正看到了现代编辑器应该有的样子。

另外,主题和状态栏的兼容还是挺重要的,幸运的是目前我用的主题和该插件是兼容的。 事实上,稍微成熟些的主题一般都会选择跟该插件进行兼容,毕竟这个插件几乎是这方面的标杆。

tagbar 概要

该插件主要提供文件的概览,就是代码的目录,可以浏览和跳转。就像 VS Code 中的 outline 那样,当然基本上所有的 IDE 都提供类似的功能。而 Vim 中该功能就由 tagbar 来实现。 但是仅靠 tagbar 还不够,还需要另外一个工具的支持,该工具就是 ctags,虽然我们在 Vim 中看不到它的体现,但是 ctags 非常重要,事实上很多插件和功能都要基于它来做。 比如 Vim 中自带的 ] 命令 C 语言函数跳转功能。

关于 tagbar 我并没有过多的进行配置,直接把别人的配置拿过来,能显示就行了,研究过多花里胡哨的功能即浪费时间也没必要。该插件的使用效果如上图中的 B 区域所示。

NERDTree 文件导航

该插件是 vimawesome 上最流行的插件之一,github 上的 star 也很多。但是后来我感觉没啥用,更重要的是能够找到很好的替代品,所以就卸载了该插件。 该插件主要提供的功能是文件导航(参考截图区域 C ),类似于 VS CODE 等编辑器的文件导航,这几乎也是成熟编辑器或 IDE 的标配功能。 当需要打开新的文件的时候,尤其是同目录下的文件,比较简单。 目前我所使用的是 Vim 自带的 Netrw 插件(即上图区域 C 所示)。

YouCompleteme 自动补全

第一次使用该插件是在写 C 语言程序的时候,该插件提供了与成熟 IDE 类似的强大补全功能,并且可以实现基于语义的跳转功能,这一点比仅支持标签匹配的 ctags 跳转要更加强大。 上图中 E 区域展示了当光标停到某个函数上时,该函数的一些信息会自动弹出来。 毫不夸张,使用该插件可以将 Vim 的生产力真正提高到一个新的台阶,让人不免感叹这才是编辑器该有的样子。

但是该插件存在一个非常致命的问题:很难安装

这主要体现在两方面,首先是依赖非常多,而且对很多软件的依赖精确到版本。另外一个问题是,如果没有科学上网的话,在编译的时候有些包会下载失败。

UltiSnip 代码段补全

Ctags 标签生成

lf 导航