首页 > vim 的concealcursor 和conceallevel?

vim 的concealcursor 和conceallevel?

在使用neosnippet时遇到的问题
额,问题是这样的,在使用neosnippet展开一个snippet的时候,neosnippet会产生tabstop,这些tabstop在按照作者给出的初始化插件代码下,是隐藏的,问题的关键在于,如果我展开一个snippet,然后马上保存并退出文件,再次打开文件时,就会发现tabstop被插入到文本中,这个功能让我很郁闷,这个是我在github上给作者提交的issue
https://github.com/Shougo/neosnippet.vim/issues/236#issuecomment-44950979
作者也回答我这个是一个feature,但我最后问到如果解决tabstop被插入到文本中的时候,他叫我去看

:help conceallevel
:help concealcursor

我看过了,但是还是不懂怎么解决这个问题。

其实,我的问题就是,如果让tabstop别插入到文本中

下图是展开一个snippet出现的tabstop(我已经取消了作者的推荐设置,所以可以看到tabstop)

接下来,马上退出文本并重新打开,你就会看到tabstop被插入到文件中了


那东西是插件里的占位符,请不要叫它们 tabstop,因为 tabstop 在 vim 里是有特定的意思的,你这样一说,我看了半天才明白你说的是什么。

首先那些占位符是肯定有用的,当你展开代码片段的时候占位符帮助你确定需要填写的代码的位置。我个人觉得比较纳闷的一点是:你都展开一个代码片段了,你不把它填完却直接关掉文件再打开,这是何故?好奇葩的操作习惯啊!

不过呢,即使应对奇葩人士 vim 也有足够的办法,Shougo 让你看的那个东东,在 vim 里叫做 conceal (text),用汉语理解就是“隐藏字符”。Neosnippet 里的那些占位符就是隐藏字符,你可以调整隐藏字符是否/如何呈现。

隐藏字符并不是真的隐藏起来了,它是 vim syntax 里的一种特殊语法,你可以用语法配置命令设置隐藏字符的视觉状态,所以如果你发现隐藏字符的设置和你想的不完全一样,那么也许你正在使用的语法(配色)有这方面的设置,你可以换一个或者钻进去看看。

接下来说说常规情况下那两个选项:conceallevelconcealcursor

当文本被标记为“隐藏字符”的时候,conceallevel 决定这些文本如何显示,它有四个值:

  1. 设为 0,不隐藏,该咋样还是咋样(这是默认值,所以占位符依然看得见)

  2. 设为 1,每一块隐藏字符用一个特殊字符来替换,这个字符是由当前使用的语法配置设置的,如果语法高亮没有,那就使用 listchars 选项里设置的字符,如果这也没有,默认的替换字符是一个空格

  3. 设为 2,让隐藏字符完全隐藏(意思是即便默认的空格也不用),但如果语法配置里有设置替换字符的话,就用设置的

  4. 设为 3,完全不显示隐藏字符,不管有没有任何设置。

到目前为止,你可能觉得设置成 3 最清爽了吧,但是你要小心,完全不显示隐藏字符就意味着一旦某些插件自作主张替你设置了隐藏字符,你是永远也看不到它们的!比如说我曾经用过一个 JSON 的语法高亮插件,不知道作者是怎么想的,他把所有的 ; 都设置成了隐藏字符,搞得我纳闷了好久……

如果你一定要完全不显示隐藏字符,那么你至少要考虑一下如何搭配 concealcursor 来使用。默认状态下,vim 不会对当前光标所在行的隐藏字符采取 conceallevel 的设置,也就是说不管你怎么设置,当前光标所在行的隐藏字符都是会显示出来的,concealcursor 决定了在 vim 的四种主要模式里(常规、插入、可视、命令),当前光标所在行是否显示隐藏字符。

补充一下:对于命令模式,当前光标所在行指得是搜索时的高亮匹配位置。

这个选项默认是空,所以在四种模式下当前光标所在行都会显示隐藏字符,你可以在 n i v c 四个值里挑选组合来设置你希望的方式。就拿你这个例子来说吧,比方说你希望除了插入模式以外,剩下的时候我都不希望看到这些占位符(隐藏字符),那就 set concealcursor='nvc'。如果你对这些代码片段了如指掌,那么插入模式下不显示隐藏字符也没关系。

顺便你可以试试 UltiSnips,这个插件比 NeoSnippets 简单一些,而且全面兼容 NeoSnippets 的代码片段,挺适合初学者的(功能绝对不差哦)。

【热门文章】
【热门文章】