vim技巧:設置空格和Tab字符可見,並自定義顯示的字符顏色

使用 Windows 下的一些 IDE(例如 Source Insight)查看代碼時,能夠設置空格和Tab字符可見。本篇文章介紹在 vim 中如何進行這個設置,並自定義顯示的字符顏色。具體包括下面的內容:java

  • 設置空格和Tab字符可見的好處
  • 設置空格和Tab字符可見
  • 設置空格和Tab字符的顯示顏色
  • 只針對特定類型文件自動設置空格和 tab 字符可見

設置空格和Tab字符可見的好處

在實際工做中,設置空格和Tab字符可見,主要是基於下面的需求:git

  • 因爲 tab 字符在不一樣編輯器下的顯示寬度可能不一樣,在代碼中使用 tab 字符進行縮進,在其餘地方查看時,排版縮進會發生變化。一些公司的編程規範要求不能使用 tab 字符。設置 tab 字符可見,能夠發現哪裏用了 tab 字符,便於刪除。
  • 一些公司使用 git 管理代碼,並上傳到 gerrit 服務器上。若是上傳的代碼包含 tab 字符,在 gerrit 上審覈代碼會把 tab 字符顯示成紅色,也是不建議用 tab 字符,因此須要設置 tab 字符可見,方便在上傳代碼以前就發現、並刪掉 tab 字符。
  • 在 git 上用 git log -p 命令查看代碼修改先後時,行末空格會顯示紅色的警告。爲了避免看到這個警告,須要設置空格可見,發現行末空格,以便及時刪除。

設置空格和Tab字符可見

在 vim 中,可使用下面命令來設置空格和 tab 字符可見:編程

:setlocal list
:set listchars=tab:>~,trail:.

執行 :setlocal list 命令後,會把 tab 字符顯示爲 CTRL-I 鍵的顯示字符,實際顯示爲 ^I。同時會在行末顯示一個 $ 字符。默認不會顯示空格。vim

這個 list 選項是一個 「local to window「 選項,也就是可使用 :setlocal 命令來設置成只在當前窗口生效,這樣設置以後,用 :edit 命令再打開其餘文件,在新的窗口上沒有開啓這個設置,不會影響其餘文件。服務器

若是想要在打開代碼文件時,才顯示空格或 tab 字符,打開其餘類型文件,例如 txt 文件、markdown 文件、makefile 文件等,不顯示空格或 tab 字符,就可使用 :setlocal list 命令。若是須要設置成全局狀態,全部窗口都開啓這個設置,可使用 :set list 命令。markdown

因爲把 tab 字符顯示爲 ^I 不夠直觀,不想在行末顯示 $ 字符,且須要顯示空格,因此再執行 set listchars=tab:>~,trail:. 命令來設置 tab 字符和空格的顯示樣式,且行末不顯示字符。編輯器

這個 listchars 選項是一個 「global」 選項,一旦設置,對全部窗口都生效,用於設置 list 屬性會顯示哪些字符、以及如何顯示。常見的選項值說明以下:測試

  • eol:c
    設置行末顯示字符爲 c。這裏 c 能夠換成任意一個字符,例如默認的 $ 字符、或者改爲 # 字符,等等。
    顯然,要設置成一個可見字符,才能明顯地看到顯示效果。
    若是沒有設置這一項,行末不顯示任何字符。
  • tab:xy
    設置 tab 字符的顯示樣式,字符 x 老是會顯示,會顯示零個或多個字符 y 以填充到 tab 字符的顯示寬度。
    例如,設置爲 tab:>-,且 tab 字符的顯示寬度是 4,那麼 tab 字符會顯示爲 >---
    實際顯示的時候,可能只顯示一個 >,或者只顯示 >-。這個跟 tab 字符所在的位置有關。假設 tab 字符的顯示寬度爲 4,意味着 tab 字符的寬度老是停在 4 的倍數行上,當手動輸入 3 個空格,再輸入一個 tab 字符時,tab 字符只會顯示一個空白字符,那麼就只顯示所設置的字符 x,對於剛纔的例子來講,就是隻顯示 > 字符。
    在實際測試時,若有設置 :set expandtab,會把 tab 字符轉換成空格,輸入 tab 鍵不會獲得 tab 字符,要先執行 :set noexpandtab 命令,關閉這個設置再來測試。
  • tab:xyz
    設置 tab 字符的顯示樣式,字符 z 老是會顯示,顯示字符 z 以後,若是還有可顯示的位置,字符 x 會顯示在開頭,在字符 x 和 字符 z 中間顯示零個或多個字符 y 以填充到 tab 字符的顯示寬度。
    例如,設置爲 tab:<->,且 tab 字符的顯示爲 4,那麼 tab 字符會顯示爲 <-->
    實際顯示的時候,可能只顯示一個 >,或者顯示爲 <><-> 等,跟 tab 字符所在的位置有關。如上面說明所示。
  • 若是沒有設置 tab: 這一項,tab 字符默認會顯示爲 ^I
  • space:c
    設置全部的空格顯示爲字符 c,包括行首空格、行中間的空格、行末空格都會顯示。
    這裏 c 能夠換成任意一個字符。
    若是沒有設置這一項,空格顯示爲默認的空白。
  • trail:c
    設置行末空格顯示爲字符 c,會覆蓋 space: 這一項的設置,且只覆蓋行末空格的顯示。
    這裏 c 能夠換成任意一個字符。
    若是沒有設置這一項,行末空格保持爲 space: 這一項的設置。
  • 不一樣設置項之間,用英文逗號 , 隔開。例如,tab:>~,trail:. 設置了 tab 字符和行末空格的顯示樣式。

基於上面說明,能夠知道 set listchars=tab:>~,trail:. 命令設置 tab 字符顯示爲 >~~~~ 的樣式(假設 tab 字符的顯示寬度是 4),設置行末空格顯示爲點號 .,不顯示行首空格和行中間的空格,行末不顯示字符。若是須要顯示全部空格,能夠把 trail 改爲 spaceui

設置空格和Tab字符的顯示顏色

進行前面的設置以後,空格和 tab 字符已經可見,可是顯示的字符顏色使用了 hi SpecialKey 這一項的顏色,能夠執行 :hi 命令查看 SpecialKey 對應的顏色是什麼,跟 vim 使用的顏色主題有關,不一樣顏色主題可能有不一樣的顏色,例如藍色、綠色、黑底白色等。spa

這個顯示顏色會跟代碼文件自己的顏色高亮混在一塊兒,不方便區分。假設 tab 字符顯示爲 >~~~~,字符顏色是藍色,若是後面跟着藍色的代碼關鍵字,就跟代碼關鍵字顯示成一個總體,不方便看到代碼關鍵字。前面把行末空格顯示爲點號 .,若是某句註釋的行末有空格,容易誤覺得是註釋自己的點號。

爲了方便區分於代碼文件自身的顏色高亮,可使用下面命令來設置可見的空格和 tab 字符顯示爲灰色,不那麼顯眼,方便區分於代碼文件自身的顏色高亮:

:hi SpecialKey guifg=darkgrey ctermfg=darkgrey

若是不想顯示成灰色,能夠修改上面 guifgctermfg 的值,設置成我的喜歡的顏色。

這樣設置以後,會有一個問題,就是修改了默認 hi SpecialKey 這一項的顏色。而 vim 會用到這個顏色來顯示自身的一些內容,例如執行 :map 命令,顯示映射的快捷鍵時,按鍵字符就顯示爲 hi SpecialKey 這一項的顏色,改爲灰色後,不太顯眼。

爲了不直接修改 hi SpecialKey 這一項的顏色,咱們能夠自定義一個顏色組,並設置爲只對空格和 tab 字符生效,具體以下所示:

:highlight MyTabSpace guifg=darkgrey ctermfg=darkgrey
:match MyTabSpace /\t\| /

這裏用 :highlight 命令(這個命令也能夠簡寫爲 :hi 命令)來自定義了一個 MyTabSpace 顏色組,顯示爲灰色。而後用 :match 命令設置 MyTabSpace 顏色組對空格和 tab 字符生效。上面的 \t 就是 tab 字符。不一樣字符串之間用 | 隔開,書寫的時候要使用 \| 轉義。在 | 後面的空白字符就是空格。

只針對特定類型文件自動開啓空格和 tab 字符可見

如前面說明,咱們可能只想在查看代碼文件時,才設置空格和 tab 字符可見,而且最好是自動開啓。這個就須要在 ~/.vimrc 文件中進行配置。完整配置以下:

" 建立一個新的 MyTabSpace 組,並設置它的顏色
highlight MyTabSpace guifg=darkgrey ctermfg=darkgrey
" 指定tab字符和空格的顏色組爲MyTabSpace,不一樣字符串之間用|隔開,要使用\|轉義.
match MyTabSpace /\t\| /
" 針對特定類型的代碼文件,設置顯示Tab鍵和行尾空格以便在查看代碼時注意到它們
autocmd FileType c,cpp,java,xml setlocal list | set listchars=tab:>~,trail:.

這段配置先使用 :highlight 命令(在 .vimrc 文件中書寫時,省略了前面的冒號)自定義一個 MyTabSpace 顏色組,顏色爲灰色。而後用 :match 命令設置 MyTabSpace 顏色組對空格和 tab 字符生效。因爲空格和 tab 字符默認不可見,因此對於沒有設置空格和 tab 字符可見的文件窗口來講,這個設置沒有影響。

後面使用 :autocmd 命令針對 c,cpp,java,xml 這些類型的文件自動設置空格和tab 字符可見,就能看到這些字符顯示爲灰色。其餘類型文件沒有自動設置,不受影響。若有須要,能夠自行添加其餘類型的文件後綴名。

可使用 :help 'list' 命令查看 list 選項的說明。
可使用 :help 'listchars' 命令查看 listchars 選項的說明。
可使用 :help :highlight 命令查看設置顏色高亮的更多說明。
可使用 :help :match 命令查看如何設置指定字符串的顯示顏色組。
可使用 :help :autocmd 命令查看如何針對特定類型文件自動執行指定命令。

相關文章
相關標籤/搜索