通过之前一系列的文章,相信各位小伙伴应该已经对vim产生了浓厚的兴趣,可能不少小伙伴通过慢慢地使用变得跟我一样,离开vim就不会写代码了。如果你希望继续长时间使用vim,甚至将vim作为主要的代码编辑器,那么花一定的时间来学习vim的配置是很有用的。如果你只是因为 linux 平台默认安装了 vi/vim ,平时又主要用它改改匹配文件,临时用用,那么还是赶紧退出这个文章,免得耽误时间吧。

标题上说从零基础打造vim多少有点标题党,要理解后面一系列文章的内容至少要了解vim里面的一些基本概念,我认为在阅读本系列专栏之前,你应该了解以下内容

  1. 知道vim,并且知道 vim 的基本操作,例如进入插入模式、移动光标,并且知道如何保存退出
  2. 知道vim的相关术语,缓冲区列表、缓冲区、窗口、命令模式、插入模式等等
  3. 知道 vim的配置文件在哪

如果你还不知道,请移步我的专栏,跟着专栏中的内容做做实验。理解一下里面提到的这些概念。

关于配置部分,我准备介绍以下几个方面的内容:

  1. vimscript 的基础内容,并补充一些之前没介绍过的vim的特性
  2. neovim lua对应的接口
  3. 推荐一些插件和相关配置,做到抛砖引玉

可能有小伙伴要问了,vimscript 不管是写还是读都比较晦涩,而且 neovim 已经采用更容易理解也更加现代化的 lua了,有必要学习 vim script吗?

我觉得还是有必要的,首先 neovim 是 vim 的另一个实现版本,要想学好 neovim 自然绕不开 vim,而学好 vim 自然也绕不开 vimscript 。其次,lua 脚本中的接口继承自 vimscript 。想要使用 lua 配置的前提是知道使用 vimscript 配置。它们就好像学习 MFC 绕不开 Win32 API 一样。所以我觉得想要学习 neovim 的配置自然绕不开 vimscript 。而且 neovim 完全兼容 vim 基本不用担心 vimscript 在 neovim 中执行不了的问题。 倒是 neovim 并没有实现 vimscript 百分之百的功能,有些时候还是得靠 vimscript 来实现。

演示环境

之前一系列的文章本来打算在 mac 上做演示的,但是我发现 mac上录屏比较麻烦,而且 mac上的 neovim 我已经配置好了,行为上可能跟裸 vim 有些差距(虽然可以不加载配置文件启动),所以我采用 WSL2 Ubuntu上的 neovim做演示。

刚好这个演示环境没有对vim进行过配置。也方便演示从0开始配置。

本教程的环境是 linux中 neovim 的 0.6.1 版本,虽然官方已经放出来 0.8 版本,但是Ubuntu官方源中好像还是 0.6。这里就继续用它演示吧

第一个 vimscript 脚本

我学习的任何一门语言好像都是从打印 hello world 开始的,我也不能免俗。我们这个教程也从打印 hello world 开始吧

vimscript 中可以使用 echo 和 echom 来打印语句,例如我们可以在命令模式中输入 echo "hello world"。我们发现在屏幕的下方出现了 hello world 字样。

熟练vim使用感受(从零开始匹配vim0)(1)

接着我们再使用 echom "hello world" 发现,它仍然在下方打印了 hello world 字样。这两者有什么区别呢?

要理解它们的区别我们需要介绍一个新的命令 :message 。这条命令可以查看 message-history 中的内容,我们可以简单地将这条命令理解为查看 vim 的运行日志(虽然并不是在查看日志)。执行这条命令我们发现,message-history 中只有一条 hello world。这个时候他们的区别就出来了,一个在打印的同时会将打印信息写入 message-history,另一个就仅仅只是打印而已。

熟练vim使用感受(从零开始匹配vim0)(2)

各位小伙伴只需要简单打印不同的语句就能知道 echom 会将内容写入到日志中,而 echo 不会。这里留给各位自己去实验吧,我就不做演示了。

我们现在来完成一个小练习,使用vim脚本来写一段欢迎信息例如 hello, jack, 我们让用户每次打开都能看到这个欢迎信息 。这里的用户我们暂时让它固定,后续我们可以做到动态的修改 欢迎的用户。

我们知道每次打开vim,它都会去加载配置文件,我们只要将要执行的命令写到配置文件中就好了。还记得配置文件在哪吗?针对 neovim 来说它支持 vimscript 和 lua 配置(当然它也支持其他语言)。我们将目录切换到 ~/.config/nvim 。如果各位小伙伴之前有过配置,那么请先将配置做一个备份。同时确保 init.lua (lua配置)和 init.vim (vimscript 配置) 只能有一个

我们先尝试着用 vimscript 的方式来完成这个功能。我们建立一个新文件 ~/.config/nvim/init.vim。然后在里面写上一句 echo 'hello, jack',然后退出。我们发现每次进入 neovim 之后,总会在下方显示这么一句话了。

熟练vim使用感受(从零开始匹配vim0)(3)

熟练vim使用感受(从零开始匹配vim0)(4)

我们再来看看如何使用 lua 来打印这么一句话呢?lua 中对应的函数是 print 。我们可以直接在 之前备份的 init.lua 中写上 print("hello, jack") 来完成这一个工作(记得现将之前的 init.vim 备份)。需要注意的是 lua 中的 print 写将信息一并写入到 message 中,也就是说它与 echom 效果相同。如果想执行 echo 操作可以使用 api.vim.nvim_echo() 。它的用法比较复杂,这就就不介绍它了,有兴趣的小伙伴可以去官网查一下,试试用它来实现这个打印欢迎信息的例子。

熟练vim使用感受(从零开始匹配vim0)(5)

这篇文章的内容到此就结束了,最后给大家做一个总结:

  1. neovim如果想要加载 vimscript配置,可以将配置文件放到 ~/.config/nvim/init.vim 中,如果想要加载 lua 配置,可以将文件放到 ~/.config/nvim/init.lua 中。
  2. echo、echom 都会打印字符串,不同的是 echom 将打印的内容往一个叫做 message-history 的地方写。lua 中的 print 具备 echom的功能
  3. 可以使用 message 命令查看 message-history 的内容
  4. 从 vimscript 的使用上看,它里面写的是vim的一些命令,我们将命令写在文件中让vim去执行。vim命令与 vimscript 的关系有点像 shell 命令和 shell 脚本的关系
,