缘由
主要是以前在B站上看到一个视频,其中有一位大佬的vim就有这个效果,于是就想自己把这个效果实现一遍。
- B站上的视频地址是:https://www.bilibili.com/video/BV144411G7kJ/?spm_id_from=333.337.search-card.all.click&vd_source=7ce13d5ec75d42ceb64e069cfd4cc3f1
- 这个视频在YouTube上的地址是:https://www.youtube.com/watch?v=yG-UaBJXZ80
- 随便点了一下,在视频的48分钟,就有那个效果,如下图所示:
如何实现
向你自己的 vimrc 配置文件中写入下面三行代码,然后重新启动vim:
highlight DisplayTabAndSpace Ctermbg = 163
autocmd InsertEnter,CursorMovedI * match DisplayTabAndSpace /\%.l\%#\@<!\s\+$/
autocmd InsertLeave * call clearmatches()
这三行代码实现的效果如下图:
添加代码后无效果?
可能有以下原因:
- 你的终端软件不支持256色:在上图中你可以看到我使用的 Xshell 7 ,也就是说我的vim其实是安装在 VMware 中的一台 Linux 中,那么此时 Xshell 7 就是我的终端,所以,我需要让 Xshell 7 支持 256 种颜色,你可以执行命令:
tput colors
得知你当前的终端支持的是哪种颜色模式,这个命令通常要么输出 8,要么输出 256,如果是 256 那么你不用对你的终端进行设置,如果这个命令输出的是 8 ,那么你需要对你的终端做如下类似的设置:
- 你没有设置环境变量:你可以在命令行中输入
env
命令或者printenv
命令或者echo $TERM
命令来查看这个环境变量。这三种方式都可以查看,选择其中一种即可。如果没有下图中的这个环境变量,或者有这个环境变量,但值不是xterm-256color
,那么你有两种方法可以实现:- 第一种是直接在命令行中执行:export TERM=xterm-256color ,这种方法就是用于临时测试用的,关闭终端后就会失效,下次又需要重新执行这行export代码,如果测试出确实是因为没有这个环境变量导致上述三行代码没有效果,那么就可以添加这个环境变量到配置文件中。
- 第二种是直接写到配置文件中:在你登录的当前用户的家目录下有一个
.profile
文件,将export TERM='xterm-256color'
写入到这个配置文件中去,然后执行,source ~/.profile
即可。
- 另外:gvim 和 neovim 我并没有测试。
如何设置成自己想要的颜色?
你可以在 Google 中搜索关键字:xterm 256 colors ,你多半可以找到这个网址:https://www.ditig.com/publications/256-colors-cheat-sheet
在这个网址中,你可以看到,在我的代码中设置的 163 就是这个颜色:
你需要设置为什么颜色,就在这个网址上找,然后替换掉原本代码中的 163 即可。比如你喜欢视频中的那种红色,那么就可以设置为 196 ,然后保存退出,重新进入 vim 即可。
详细代码解释
虽然这里只有3行代码,但说真的,想要把这3行代码解释透彻,并不是那么容易的。关键点在于正则表达式那块。
时间有限,详细的代码解释准备后续再补充,因为这个功能本来就可有可无,而且vim也是一个小众的软件,受众不多。不理解配置代码且有条件的朋友可以自己询问 ChatGPT。
为了方便没有ChatGPT的朋友,我这里先贴出ChatGPT的回答:
这段 Vimscript 代码主要用于在 Vim 编辑器中高亮显示空格和制表符(Tab)。让我逐行解释:
-
highlight DisplayTabAndSpace Ctermbg=163
- 这一行代码用于定义一个名为
DisplayTabAndSpace
的高亮组。Ctermbg
参数指定了该高亮组在终端中的背景色。这里设置为 163,表示在终端中使用的颜色索引。
- 这一行代码用于定义一个名为
-
autocmd InsertEnter,CursorMovedI * match DisplayTabAndSpace /\%.l\%#\@<!\s\+$/
- 这一行代码是一个自动命令(autocmd),它会在插入模式进入(
InsertEnter
)和光标在插入模式中移动(CursorMovedI
)时触发。 match
命令用于匹配文本并进行高亮显示。在这里,我们使用DisplayTabAndSpace
高亮组匹配一些文本。/
开始和结束正则表达式模式。\%.l
匹配当前行,.
表示任意字符,l
表示行的边界。\%#
匹配光标当前的位置。\@<!
是一个零宽度负回顾断言,表示在当前位置之前不匹配指定的内容。\s\+$
匹配一个或多个空白字符(包括空格和制表符),紧接着行尾的位置。- 综合起来,这个正则表达式用于匹配在当前行末尾的空格或制表符,并且不匹配光标所在的位置。
- 这一行代码是一个自动命令(autocmd),它会在插入模式进入(
-
autocmd InsertLeave * call clearmatches()
- 这一行代码也是一个自动命令,它会在退出插入模式时触发。
call clearmatches()
是一个 Vim 命令,用于清除之前设置的所有匹配项的高亮显示。
综上所述,这段代码的作用是在插入模式中高亮显示当前行末尾的空格或制表符,并在退出插入模式时清除高亮显示。