rcmdnk's blog
Last update

ONE PIECE ワンピース フィギュアーツZERO ポートガス・D・エース Special Color Edition

タブ等の特殊文字の表示について。

Sponsored Links

SpecialKey

set list

でタブなどの特殊文字を表示するようになります。 これらの特殊文字はlistcharsでどのような文字列で表示するか設定できます。

set listchars=tab:>-,trail:-,extends:>,precedes:<,nbsp:%

こんな感じ。

このうち、tabtrail(文末空白)などはSpecialKeyという ハイライトグループに分けられてその色にハイライトされます 1

listchars, lcs

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に合わせてIndentGudesctermfg の値を設定しておきます。

これでインデント部分でもタブ文字はSpecialKeyの色になります。

Cursorline

set cursorline

を設定すると、カーソルがある行に特別な色付けなどがされます。 (初期設定ではCUIでは下線が引かれます。)

変更は

autocmd VimEnter,ColorScheme * hilight CursorLine cterm=underline

の様にhighlightCursorLineの値を指定します。

現在の自分設定では

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\| \+$\)')

もしかするとlistcharsSpecialKeyに設定されてるグループ名とかで 設定できるのかもしれませんが、ちょっと調べても分からなかったので直接。

matchaddの代わりに

autocmd VimEnter,WinEnter * match Tab '\t'

こんな感じでmatchを使って設定する事もできますが、 これだと1つしか設定できないので複数設定すると最後のもの(MySpecialKeyとかTabとかのグループ名関係なく最後にmatchを使って設定したもの)しか 有効にならないので注意。 (2match3matchというのも同じ様に使えて、これらで最大3つまでは設定できる。けどmatchaddなら制限ないのでそっちを使うべき。)

matchadd()

mat[ch]

これでCursorLineをさらに上書きするので、カーソル行でも これらの文字列がSpecialKey色になります。

追記: 2016/10/21

ただし、CursorLineの設定は消えてしまうので下線がその部分だけ消えます。

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は現設定ではバックグラウンドを赤くするようになっています。 (文字色を変えても何もならないのでバックグラウンドが変わるものが必要。)

まとめ

こんな感じになっています。

vimcolor

Sponsored Links
  1. :highlightで確認。

Sponsored Links

« Vimで'ImportError: No module named site'みたいなエラーが出るようになった Bashでの[a-z]みたいな正規表現での大文字小文字について »