conceal を使って全角スペースを□で表示する

ってのをやってみたんだけど、結果的に微妙だった。一応やり方を紹介しておく。

設定

解説とかは面倒なのでソースのみ。

" conceal の表示を有効にする
set conceallevel=1
" どのモードで conceal の文字にするか
set concealcursor=nvic

augroup vimrc-highlight  " {{{
  autocmd!
  autocmd ColorScheme * call s:highlight_additional()
  autocmd BufWinEnter * call s:syntax_additional(1)
  autocmd Syntax * call s:syntax_additional(0)
augroup END  " }}}

function! s:syntax_additional(b)  " {{{
  if a:b && exists('b:additional_syntax')
    return
  endif
  let b:additional_syntax = 1

  syntax match IdeographicSpace / / display containedin=ALL conceal cchar=endfunction  " }}}

function! s:highlight_additional()  " {{{
  " "IdeographicSpace" のハイライト(四角になるので実際には必要ない)
  highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen
  " 設定している colorscheme に合わせて背景色と文字色を設定
  highlight Conceal term=underline ctermbg=Black ctermfg=DarkGreen guibg=Black guifg=Grey
endfunction  " }}}

結果


パッと見はいい感じ。

何が微妙だったか

まず、この設定は性質上全てのバッファで適用する必要があるんだけど、conceal の設定は各ウィンドウに 1 つのみ。つまり他に conceal 機能を使っていた場合 'conceallevel' や 'concealcursor' が共有されてしまう。全角スペースのみ setl concealcursor=nvic する、とかはできない。
ハイライトに関しても、今回は 'concealcursor' で全てのモードで□表示にしているのだけど、ビジュアル選択すると背景色が残念なことになる。

てわけで、だったら無理せんでも今まで通り matchadd() で背景色だけ変えればいいか、という結論に至ったのでした。わかればいいしね。