SpecialKey
set list
でタブなどの特殊文字を表示するようになります。
これらの特殊文字はlistchars
でどのような文字列で表示するか設定できます。
set listchars=tab:>-,trail:-,extends:>,precedes:<,nbsp:%
こんな感じ。
このうち、tab
、trail
(文末空白)などはSpecialKeyという
ハイライトグループに分けられてその色にハイライトされます
1。
vim-indent-guidesとのconflict
上の様にタブをlist
設定で記号表示する様にしていますが、
記号はSpecialKeyで設定された色になってるはずですが
タブの部分が白くなってしまっていました。
これは、 vim-indent-guides を入れていて
autocmd VimEnter,Colorscheme * hilight IndentGuidesEven ctermbg=235
autocmd VimEnter,Colorscheme * hilight IndentGuidesOdd ctermbg=239
みたいな設定をしているからでした。
この設定でインデント部分に色が付くわけですが、
タブでインデントされてる場合にもこの設定が反映されて
文字色(ctermfg
)もリセットされていたからでした。
コレに関してはインデント部に関してはタブ文字以外の文字が入ることは無いので
autocmd VimEnter,Colorscheme * hilight SpecialKey term=bold ctermfg=9
autocmd VimEnter,Colorscheme * hilight IndentGuidesEven term=bold ctermfg=9 ctermbg=235
autocmd VimEnter,Colorscheme * hilight IndentGuidesOdd term=bold ctermfg=9 ctermbg=239
見たいな感じでSpecialKeyに合わせてIndentGudesのctermfg
の値を設定しておきます。
これでインデント部分でもタブ文字はSpecialKeyの色になります。
Cursorline
set cursorline
を設定すると、カーソルがある行に特別な色付けなどがされます。 (初期設定ではCUIでは下線が引かれます。)
変更は
autocmd VimEnter,ColorScheme * hilight CursorLine cterm=underline
の様にhighlight
でCursorLineの値を指定します。
現在の自分設定では
autocmd VimEnter,ColorScheme * hilight SpellBad cterm=underline ctermbg=0
の様にスペルチェックにunderline
を割り当ててるため、
このままだと入力中にスペルミスした時にチェックができなくなるので、
autocmd VimEnter,ColorScheme * hilight CursorLine cterm=underline
autocmd InsertEnter * hilight CursorLine cterm=bold
autocmd InsertLeave * hilight CursorLine cterm=underline
の様にして、入力モードに入ったらその行を太文字に、
入力モードから出る時に再びunderline
にするような設定にしています。
これで入力行を見るだけでも入力中かどうか一発で分かるのでそれも結構便利です。
ただし、このCursorLineの設定があるときはSpecialKeyの設定が反映されないらしく カーソル行ではタブや行末空白が白く(通常文字に)なってしまいます。
これは仕様上今のところ仕方がない模様。
vim - CursorLine and NonText / SpecialKey highlight clash - Stack Overflow
‘cursorline’ でハイライトされた部分の ‘listchars’ などの色がおかしい · Issue #67 · vim-jp/issues
これを無理やり回避するために、タブと文末スペースに関しては 別途以下の様に設定しています。
" SpecialKey, needed for cursorline
autocmd ColorScheme * htmlhighlightskip link MySpecialKey SpecialKey
autocmd VimEnter,WinEnter * let w:m_sp = matchadd("MySpecialKey", '\(\t\| \+$\)')
もしかするとlistchars
やSpecialKey
に設定されてるグループ名とかで
設定できるのかもしれませんが、ちょっと調べても分からなかったので直接。
matchadd
の代わりに
autocmd VimEnter,WinEnter * match Tab '\t'
こんな感じでmatch
を使って設定する事もできますが、
これだと1つしか設定できないので複数設定すると最後のもの(MySpecialKey
とかTab
とかのグループ名関係なく最後にmatch
を使って設定したもの)しか
有効にならないので注意。
(2match
、3match
というのも同じ様に使えて、これらで最大3つまでは設定できる。けどmatchadd
なら制限ないのでそっちを使うべき。)
これでCursorLineをさらに上書きするので、カーソル行でも
これらの文字列がSpecialKey
色になります。
追記: 2016/10/21
7.3とかまでだと消えてしまっていましたが、 少なくとも7.4だとCursorLineの設定も残ったままになるので 色が変わらないまま下線付きに出来ます。
追記ここまで
全角文字を可視化
全角文字も隠れてると色々問題が起こるので可視化。
" Two-byte space
autocmd ColorScheme * hi link TwoByteSpace Error
autocmd VimEnter,WinEnter * let w:m_tbs = matchadd("TwoByteSpace", ' ')
' '
の中は全角スペースです。
色グループとしてError
を選んでますが、
Error
は現設定ではバックグラウンドを赤くするようになっています。
(文字色を変えても何もならないのでバックグラウンドが変わるものが必要。)
まとめ
こんな感じになっています。
-
:highlight
で確認。 ↩