单词 conceal 的中文含义是 隐藏掩盖。Vim 中有个 conceal text 的概念,表示指定的文本被标记为 隐藏字符。

例如,如果希望将每行的前 10 个字符指定为可隐藏字符,可以在 Vim 命令行模式下执行命令 :syn match Concealed '^.\{10\}' conceal

所谓 Vim 中的隐藏字符并不表示这些文本内容完全不可见,而只是标记为 可隐藏。实际隐藏与否取决于 conceallevel 选项的值,而当前行的可隐藏字符是否以正常的方式进行显示,取决于 concealcursor 选项。

Vim教程网(https://vimjc.com)之前介绍过的Python自动补齐Vim插件jedi-vimPython缩进指示Vim插件indentLine等均使用了Vim的 conceal 特性。

:本文所提到的所有 Vim 选项只有在编译 Vim 时加入了 +conceal 特性时才有效,在 Linux 命令下可通过 vim --version 命令查看当前 Vim 的版本和编译信息。

vim-conceal

1、conceallevel 选项

conceallevel (缩写形式 cole) 选项决定 Vim 隐藏字符如何显示,它共有 4 个值:

效果
0 正常显示文本,是 conceallevel 的默认值
1 每一处隐藏文本块被一个字符替代。如果没有定义定制的替代字符,则使用 listchars 定义的字符 (缺省是空格)
2 完全不显示隐藏文本,除非定义了替换字符 (参考 :syn-cchar)
3 完全不显示隐藏文本,不管任何设置

默认设置下,Vim 不会对当前光标所在行的隐藏字符采取 conceallevel 选项的设置。也就是说不管怎么设置 conceallevel 选项的值,当前光标所在行的隐藏字符都会被正常显示出来,以便于进行编辑和复制等操作。

2、concealcursor 选项

如果要设置当前光标所在行是否显示隐藏字符,需要使用 concealcursor 选项。

concealcursor (缩写形式 cocu) 选项的默认值是空字符串,表示在 Vim 的四种主要的编辑模式下 (普通模式 (用 n 表示)、插入模式 (用 i 表示)、可视化模式 (用 v 表示)、命令行模式 (用 c 表示)) 均正常显示当前光标所在行的隐藏字符。可灵活地在 nivc 这四个值中间进行挑选组合来设置任何你希望的显示方式。

例如,如果希望除了 Vim 插入模式外,其他操作模式下都不看到一些设置的隐藏字符,可以进行如下设置:

1
set concealcursor='nvc'

3、隐藏Vim文件中所有行的前n个字符

假设正在使用 Vim 打开 nginx 的错误日志 error.log,因为不太关心 log 文件里的每一行开头部分固定格式的日期和时间,希望这部分内容不出现在Vim文件内,但又不希望修改 error.log 文件的内容,这时候就可以使用 Vim 的隐藏字符功能。

首先,通过在 Vim 的命令行模式下执行 syn match Concealed '^..../../.. ..:..:..' conceal 命令来匹配带有日期标点符号的字符并设置为可隐藏字符;其次,在 Vim 的命令行模式下执行 :set conceallevel=2 来将指定的隐藏文本块用替代字符进行隐藏;如果又需要将隐藏的字符正常显示出来,可以再在 Vim 命令行模式下执行 :set conceallevel=0 命令。

Vim隐藏字符conceal

《女程序员说》

原创不易,希望能给小女子的公众号加个关注~