搜尋

首頁  >  問答  >  主體

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被插入到檔案中了

漂亮男人漂亮男人2743 天前856

全部回覆(1)我來回復

  • 巴扎黑

    巴扎黑2017-05-16 16:43:08

    那東西是插件裡的佔位符,請不要叫它們 tabstop,因为 tabstop 在 vi​​m 裡是有特定的意思的,你這樣一說,我看了半天才明白你說的是什麼。

    首先那些佔位符是肯定有用的,當你展開程式碼片段的時候佔位符幫助你確定需要填寫的程式碼的位置。 我個人覺得比較納悶的一點是:你都展開一個代碼片段了,你不把它填完卻直接關掉文件再打開,這是何故?好奇葩的操作習慣啊!

    不過呢,即使應對奇葩人士 vim 也有足夠的辦法,Shougo 讓你看的那個東東,在 vim 裡叫做 conceal (text),用漢語理解就是「隱藏字符」。 Neosnippet 裡的那些佔位符就是隱藏字符,你可以調整隱藏字符是否/如何呈現。

    隱藏字元並不是真的隱藏起來了,它是vim syntax 裡的一種特殊語法,你可以用語法設定指令設定隱藏字元的視覺狀態,所以如果你發現隱藏字元的設定和你想的不完全一樣,那麼也許你正在使用的語法(配色)有這方面的設置,你可以換一個或鑽進去看看。

    接下來說說常規情況下那兩個選項:conceallevelconcealcursor

    當文字被標記為「隱藏字元」的時候,conceallevel 決定這些文字如何顯示,它有四個值:

    1. 設為 0,不隱藏,該咋樣還是咋樣(這是預設值,所以佔位符依然看得見)

    2. 設為 1,每一块隐藏字符用一个特殊字符来替换,这个字符是由当前使用的语法配置设置的,如果语法高亮没有,那就使用 listchars 選項裡設定的字符,如果這也沒有,預設的替換字符是一個空格

    3. 設為 2,讓隱藏字元完全隱藏(意思是即便預設的空格也不用),但如果語法配置裡有設定替換字元的話,就用設定的

    4. 設為 3,完全不顯示隱藏字符,不管有沒有任何設定。

    到目前為止,你可能覺得設定成3 最清爽了吧,但是你要小心,完全不显示隐藏字符就意味着一旦某些插件自作主张替你设置了隐藏字符,你是永远也看不到它们的!比如说我曾经用过一个 JSON 的语法高亮插件,不知道作者是怎么想的,他把所有的 ; 最清爽了吧,但是你要小心,完全不顯示隱藏字符就意味著一旦某些插件自作主張替你設置了隱藏字符,你是永遠也看不到它們的! 比如說我曾經用過一個JSON 的語法高亮插件,不知道作者是怎麼想的,他把所有的; 都設定成了隱藏字符,搞得我納悶了好久…

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

    補充一下:對於指令模式,目前遊標所在行指得是搜尋時的高亮匹配位置。

    這個選項預設是空,所以在四種模式下當前遊標所在行都會顯示隱藏字符,你可以在 n i v c 四个值里挑选组合来设置你希望的方式。就拿你这个例子来说吧,比方说你希望除了插入模式以外,剩下的时候我都不希望看到这些占位符(隐藏字符),那就 set concealcursor='nvc'。如果你對這些程式碼片段瞭如指掌,那麼插入模式下不顯示隱藏字元也沒關係。

    順便你可以試試 UltiSnips,這個插件比 NeoSnippets 簡單一些,而且全面兼容 NeoSnippets 的代碼片段,挺適合初學者的(功能絕對不差哦)。

    回覆
    0
  • 取消回覆