potappo's blog

日々の雑感などを書くブログ。

vimでスペースやTabなどの見えない文字を表示させる方法

旧サブブログ「Life is Try and Error」(2013 年 3 月 31 日で閉鎖予定)の過去記事(2006-11-07 掲載)の再掲です。以下、過去記事そのまま・・・と思いましたが、リンク先が既に消滅している場合は、注釈をつけています。
タブ(tab)と行末(eol)を表示させるだけなら、「:set list」が一番簡単。
スペースを表示させるには、色々な方法があるみたいだけど、私が設定した方法は以下。全角スペースと行頭の半角スペースを表示させることができる(参考:コアテクの路地: vim: 見えない文字を見えるようにする [2013/3/30 追記:リンク先消滅])。

"行頭のスペースの連続をハイライトさせる
"Tab文字も区別されずにハイライトされるので、区別したいときはTab文字の表示を別に
"設定する必要がある。
function! SOLSpaceHilight()
    syntax match SOLSpace "^\s\+" display containedin=ALL
    highlight SOLSpace term=underline ctermbg=LightGray
endf
"全角スペースをハイライトさせる。
function! JISX0208SpaceHilight()
    syntax match JISX0208Space " " display containedin=ALL
    highlight JISX0208Space term=underline ctermbg=LightCyan
endf
"syntaxの有無をチェックし、新規バッファと新規読み込み時にハイライトさせる
if has("syntax")
    syntax on
        augroup invisible
        autocmd! invisible
        autocmd BufNew,BufRead * call SOLSpaceHilight()
        autocmd BufNew,BufRead * call JISX0208SpaceHilight()
    augroup END
endif

「:h listchars」を読むと、他にも色々特殊文字があるようなので設定する。

"特殊文字(SpecialKey)の見える化。listcharsはlcsでも設定可能。
"trailは行末スペース。
set list
set listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<

trailを可視化するのは便利。行末の余分なスペースがわかるのみならず、新規行だとスペースをいくつ入力しているかわかるのは良い。listcharsには他にeolがあって、デフォルトでは「$」になっているが、上記設定をすると表示されない。listcharsを指定すると明示的に指定しない限り表示されないようだ。trailsとextendsさえ設定してあれば不要だと思うけど。