在vim中高亮光标所在行中的tab、空格、缩进

缘由

主要是以前在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)。让我逐行解释:

  1. highlight DisplayTabAndSpace Ctermbg=163

    • 这一行代码用于定义一个名为 DisplayTabAndSpace 的高亮组。Ctermbg 参数指定了该高亮组在终端中的背景色。这里设置为 163,表示在终端中使用的颜色索引。
  2. autocmd InsertEnter,CursorMovedI * match DisplayTabAndSpace /\%.l\%#\@<!\s\+$/

    • 这一行代码是一个自动命令(autocmd),它会在插入模式进入(InsertEnter)和光标在插入模式中移动(CursorMovedI)时触发。
    • match 命令用于匹配文本并进行高亮显示。在这里,我们使用 DisplayTabAndSpace 高亮组匹配一些文本。
    • / 开始和结束正则表达式模式。
    • \%.l 匹配当前行,. 表示任意字符,l 表示行的边界。
    • \%# 匹配光标当前的位置。
    • \@<! 是一个零宽度负回顾断言,表示在当前位置之前不匹配指定的内容。
    • \s\+$ 匹配一个或多个空白字符(包括空格和制表符),紧接着行尾的位置。
    • 综合起来,这个正则表达式用于匹配在当前行末尾的空格或制表符,并且不匹配光标所在的位置。
  3. autocmd InsertLeave * call clearmatches()

    • 这一行代码也是一个自动命令,它会在退出插入模式时触发。
    • call clearmatches() 是一个 Vim 命令,用于清除之前设置的所有匹配项的高亮显示。

综上所述,这段代码的作用是在插入模式中高亮显示当前行末尾的空格或制表符,并在退出插入模式时清除高亮显示。

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值