vim: 見えない文字を見えるようにする
こんにちは、ここの blog は初登場で両刀使いの さとうふみやす です。 両刀と言ってもエディタの話で、vi, Emacs の事です。 皆さんはどちらがお好みですか? 私はテキストの編集は vi (vim)、 メーラーと辞書索き (全然エディタ用途じゃないですが) は Emacs (XEmacs + Wanderlust + lookup) と使いわけています。
今回のお題は vim で見えない文字を見えるようにする
としました。
ここでの 見えない文字
とは、スペースやタブ文字のことです。
スペース文字といえば ASCII のスペース (U+0020) やいわゆる「全角」のスペース (U+3000) がありますが、
これらを見た目で区別できたら便利じゃありませんか?
また、テキスト行の末尾に無駄なスペース文字がないか気になりませんか?
この Tips は、そんな人に役立ちます。
前置きが長くなりましたが本題に入りましょう。 以下 vim 向けのお話ですが、MIRACLE LINUX V4.0 付属の vim (vim-*-6.3.046-0.40E.4.2AX) と、 Debian GNU/Linux unstable (sid) 付属の vim (vim 7.0-017+8) でのみ確認してあります。 ディストリビューションに依らず、vim 6 以降であれば問題ないと思います。
今回の Tips は、vim のシンタックスハイライティング機能 (syntax highlighting) を利用します。 シンタックスハイライティングを有効にすると、vim は表示・編集しているテキストの構造を解析し、 構文やブロックごとに色やフォントを変えて表示してくれる便利な機能です。 これを利用して全角スペースや行末尾のスペースを可視化します。
まずは、vim を起動して次のコマンドを実行してみてください。 これがエラーになるようであれば、残念ながらあなたがお使いの vim はシンタックスハイライティングに対応していません。 (見た目が) 特に変化ないようであれば問題ありません:
:syntax on
次にハイライトさせたいパターンを構文 (syntax) として定義します。
全角スペースに一致させる場合、次のようなコマンドになります。
display
キーワードは画面に表示される場合だけ処理させるための指示です。
containedin=ALL
キーワードはどんなコンテキストでも一致させるための指示です:
:syntax match InvisibleJISX0208Space " " display containedin=ALL
次に、定義した構文に一致するテキストをどのように表示するか (ハイライト) を定義します。 全角スペースに対し白黒端末ではアンダーラインを、色対応端末と GUI (gvim) では青で表示させるには、 次のように定義します:
:highlight InvisibleJISX0208Space term=underline ctermbg=Blue guibg=Blue
さあ、準備ができました! ASCII スペースと全角スペースを適当に入力してみてください。 うまい具合に ASCII スペースと全角スペースが見た目で区別できるようになったでしょうか?
同様に、行末のスペース文字を可視化するコマンドを紹介しましょう。 ついでにタブも可視化してみます (タブの可視化は画面がごちゃごちゃになるのでお薦めしません) :
:syntax match InvisibleTrailedSpace "[ \t]\+$" display containedin=ALL
:highlight InvisibleTrailedSpace term=underline ctermbg=Red guibg=Red
:syntax match InvisibleTab "\t" display containedin=ALL
:highlight InvisibleTab term=underline ctermbg=Cyan guibg=Cyan
以上、いまくいったでしょうか。
うまくいったなら、vim の設定ファイルに追加しておきましょう。
~/.vimrc ファイルに次のような設定を記述します:
syntax on
syntax match InvisibleJISX0208Space " " display containedin=ALL
highlight InvisibleJISX0208Space term=underline ctermbg=Blue guibg=Blue
syntax match InvisibleTrailedSpace "[ \t]\+$" display containedin=ALL
highlight InvisibleTrailedSpace term=underline ctermbg=Red guibg=Red
syntax match InvisibleTab "\t" display containedin=ALL
highlight InvisibleTab term=underline ctermbg=Cyan guibg=Cyan
以上です…と言いたいところですが、問題が一つ。
vim はファイル種別ごとにシンタックスハイライティングの定義を切り替える機能があるのですが、
.vimrc によるシンタックスハイライティング定義よりもそちらが優先されてしまうため、
上記の設定が有効にならないことがあります。
この問題の回避に加え、
シンタックスハイライティング機能の有無のチェックと
.vimrc ファイルの再読み込みに対応させると、次のような設定になります:
if has("syntax")
syntax on
function! ActivateInvisibleIndicator()
syntax match InvisibleJISX0208Space " " display containedin=ALL
highlight InvisibleJISX0208Space term=underline ctermbg=Blue guibg=Blue
syntax match InvisibleTrailedSpace "[ \t]\+$" display containedin=ALL
highlight InvisibleTrailedSpace term=underline ctermbg=Red guibg=Red
syntax match InvisibleTab "\t" display containedin=ALL
highlight InvisibleTab term=underline ctermbg=Cyan guibg=Cyan
endf
augroup invisible
autocmd! invisible
autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
augroup END
endif
申し訳ありませんがここで時間切れのため、最終版の詳細な解説は割愛させていただきます。
で vim のヘルプが参照できるので、
そちらを参考にしてください。
:help キーワード



コメント