vim-users.jp

Hack #40: 不可視文字を表示する

Posted at 2009/07/12
このエントリーをはてなブックマークに追加

テキストデータには空白スペースやタブ文字など通常は表示されない文字が含まれていますが、編集する際はそれらの文字が表示された方が便利な場合があります。そこで、Vim で不可視文字を可視化する方法をいくつか取り上げます。

'list' 'listchars' オプションを利用する

この 2 つのオプションで、不可視な部分を別の文字に置き換えて表示することができます。

'list'
ウィンドウにローカルなオプションで、不可視文字の置き換えを行うかを表します。
'listchars'
'list' がオンの時、どのシンボルをどの文字で表示するかを設定します。以下の指定文字列をカンマ区切りで指定します。 各項目は、対象をどの文字で表示するかをコロン(:)で区切って指定します。全てのシンボルを指定する必要はありません。
eol:c
論理行の行末に表示する文字を指定します。省略された場合は何も表示されません。
tab:xy
タブ文字の最初の桁の文字と、次の桁以降に表示する文字の 2 文字を指定します。 これは例えば、”tab:^_” のように設定すると “^___” の様に表示されます。空白文字を指定することも可能です。 省略した場合、”^I” が表示されます。この場合、'tabstop' の値に関わらず 2 文字幅で表示されるので注意して下さい。
trail:c
行末の連続する空白文字を表示する文字を指定します。省略した場合、特に何も表示されません。
extends:c
'wrap' がオフの時、行末に続くテキストがある場合にそのことを知らせるために行末に表示される文字を指定します。
precedes:c
'wrap' がオフの時、行頭に続くテキストがある場合にそのことを知らせるために行頭に表示される文字を指定します。
nbsp:c
non-breakable(改行不可) な空白文字(0xA0, 160) です。 一般的な空白文字 (0×20 32) ではないので注意して下さい。

これらのシンボルは実際の文字と見分けられるように、”eol” “extends” “precedes” は “NonText”、”nbsp” “tab” “trail” は “SpecialKey” というハイライトグループでそれぞれハイライトされます。

'list' 'listchars' で表示できるのは以上で説明したシンボルのみになります。特に、日本語を扱う上で避けて通れないいわゆる全角スペースなどはこの方法で表示することはできません。

ハイライトで目立たせる

Vim のハイライト機能を利用して不可視文字を目立たせることで可視化する方法があります。この方法では任意の文字に置き換えるといったことはできませんが、不可視文字を認識するには十分な効果を発揮します。 なお、この方法で目立たせる対象は正規表現で指定するので、不可視文字に限らず利用可能です。

ハイライトグループを作成する

まずは対象をどのように目立たせるかを設定します。今回は不可視文字を目立たせるのが目的なので、対象の背景色を変更するようにします。

highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen

この例では、背景色を緑に、色の利用できない端末ではアンダーラインを引くようなハイライトを作成し、それに対し “IdeographicSpace” と言う名前を付けています。 他に具体的にどのようなハイライトが利用可能かは本 hack の域を出るためここでは解説しません。

なお、:highlight コマンドで作成したハイライトは :colorscheme でカラースキームを設定する際に全てクリアされます。よってこのコマンドは :colorscheme を実行した後に実行するか、もしくはカラースキームを変更した際に常に実行されるように

autocmd Colorscheme * highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen

とします。

ハイライトの対象を設定する

ハイライト対象を設定するには、:match を用いる方法と :syntax を用いる方法の 2 つがあります。ここでは :match を用いる方法を紹介します。

:match コマンドは以下の様に使用します(厳密なコマンドの書式の解説は省きます)。

match IdeographicSpace / /

/で囲まれた部分が全角スペースです。見ての通り、対象となる正規表現と、対象をどのハイライトグループでハイライトするかを指定します。 ただし、:match コマンドで設定された対象はウィンドウローカルにしか設定されません。 よって、ウィンドウに入り直す度にコマンドを実行するように、以下のようにします。

autocmd VimEnter,WinEnter * match IdeographicSpace / /

Vim の起動直後は WinEnter イベントが発生しないので、VimEnter イベント発生時にも実行しています。BufRead,BufNew などでは不完全です。ファイルを指定せずに Vim を起動した場合や :split などで分割したウィンドウではコマンドが実行されません。

今回のように全角スペースをハイライトしたい場合、その文字自身をコマンドで指定することになります。 コマンドを Vim スクリプトに記述する場合、スクリプト内にマルチバイト文字を記述することになるので該当コマンドを実行するより前に :scriptencoding でスクリプトファイルのエンコーディングを指定しておく必要があります。

scriptencoding utf-8

以上の内容をまとめると以下のようになります。

scriptencoding utf-8

augroup highlightIdegraphicSpace
  autocmd!
  autocmd Colorscheme * highlight IdeographicSpace term=underline ctermbg=DarkGreen guibg=DarkGreen
  autocmd VimEnter,WinEnter * match IdeographicSpace / /
augroup END

colorscheme YourFavoriteColorscheme
thinca

もどる
blog comments powered by Disqus