この記事では、Vim / neovim でプラグインを使わずに「タブ/改行/行末のスペースを記号で表示する」ためのコマンドについて、ご紹介します。
[解答] set list listchars を設定する
Vimコマンド
:set list listchars=tab:{記号},eol:{記号},trail:{記号},space:{記号},extends:{記号},precedes:{記号},nbsp:{記号}
- tab: タブ
- trail: 行末(行最後の文字から改行まで)の半角スペース
- eol: 改行
- space: 半角スペース
- extends: ウィンドウの幅が狭くて右に省略された文字がある記号
- precedes: ウィンドウの幅が狭くて左に省略された文字がある記号
- nbsp: 不可視のスペース
ここで指定する{記号}は記号でなくても構いませんが、本来の編集を邪魔しないものが良いでしょう。大概は Vim 標準の digraph を活用することが多いようです。
また、必ずしも全部設定する必要はありません。変更したいものだけをカンマ区切りで表記しましょう。
設定例
各記号に何を設定するかは、人それぞれ好みが分かれるところです。そこで下記のように10パターンほど用意してみました。こちらを参考に組み合わせて設定してみると良いでしょう。
:set list listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
set list listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
:set list listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
set listset listchars=tab:»-,trail:-,nbsp:%,eol:↲
set list set listchars=tab:>-,trail:-,eol:$
:set list listchars=tab:»\ ,eol:¬,trail:·
set listchars=eol:~,tab:>\ ,extends:<
set listchars=tab:^\ ,trail:~
set listchars=tab:>\ ,trail:~
set list listchars=tab:|_
こちらの記号は digraph 入力(インサートモードでCtrl-k)で、次のカッコ内のように指定することで入力できます。
- » (>>)
- « (<<)
- ¬ (NO)
- · (.M)
こちらの一覧は :help digraph で確認すると良いでしょう。
また、次の記号は特殊記号入力(インサートモードでCtrl-v)で、次のようにカッコ内を指定することで入力できます。
- → (uffeb)
- ↲ (u21b2)
注意事項
この設定には、次のような注意点や制限があります。
- tab(タブ)に指定する記号は2文字だが、全角文字は利用不可
- eol(改行)/ trail (行末スペース)は1文字、もちろん全角文字は利用不可
- 半角スペースを記号に使う場合はエスケープ(\)が必要
- 同じ記号でも使用するフォントによって、見た目や幅が異なる
- 文字 ‘:’ と ‘,’ は使えない
- エンコーディングが “utf-8” のときだけ、UTF-8の文字が使うことができる
- tabについては、上記よりもう少し複雑な指定が可能
補足
通常、こちらは設定ファイルに記載しておく内容のはずです。ただ、実際に使ってみて、どれが具合が良いかはコマンドでいずれか設定を試してみるのが良いでしょう。
このVimコマンドの補足情報
- 利用頻度
- 便利さ
- 覚え易さ
関連するVimヘルプ
Vim のヘルプでは下記のように解説されています。
‘listchars’‘lcs’ 文字列 (既定では “eol:$”)
グローバル
‘list’ モードと :list コマンドでの表示に使われる文字を設定する。値は
指定文字列のコンマ区切りのリストである。
lcs-eol
eol:文字 行末の表示に使われる文字。指定されないと、行末には何も
表示されない。
lcs-tab
tab:xy[z] タブ文字の表示に使われる 2つ または 3つの文字。
3文字目は任意。tab:xy ‘x’ が常に使用され、次に ‘y’ が適切な回数だけ使用され
る。したがって、”tab:>-” は以下のように表示される:
>
>-
>–
etc.
tab:xyz ‘z’ が常に使用され、次に ‘x’ が先頭に追加され、次に
‘y’ が適切な回数使用される。したがって、”tab:<->” は以
下のように表示される:
>
<>
<->
<–>
etc.
“tab:” が省略された場合、タブは ^I と表示される。
lcs-space
space:文字 スペースの表示に使われる文字。指定されないと、スペース
は空白のまま。
lcs-trail
trail:文字 行末のスペースの表示に使われる文字。指定されないと、行
末のスペースは空白のまま。行末のスペースでは “space”
の設定を上書きする。
lcs-extends
extends:文字 ‘wrap’ がオフで、行が画面の右端よりも伸びているときに、
最終列に表示される文字。
lcs-precedes
precedes:文字 最初の列に表示される文字の前にテキストがある場合 {訳注:
上の行の末尾が画面の右端より伸びているとき} に、物理行
の最初に目に見える列に表示する文字。
lcs-conceal
conceal:文字 ‘conceallevel’ が 1 のときに Conceal されたテキストの
代わりに表示される文字。
lcs-nbsp
nbsp:文字 ノーブレークスペース文字 (0xA0 (10進数では160) や
U+202F) の表示に使われる文字。指定されない場合は空白の
まま。{訳注: 0xA0はLatin1で改行なしスペースを表す}文字 ‘:’ と ‘,’ は使えない。‘encoding’ が “utf-8” のときはUTF-8の文字
が使える。そうでないときはprintableな文字 {訳注: 文書先頭を参照} だけ
が使える。全ての文字は幅が1でなければならない。
例:
:set lcs=tab:>-,trail:-
:set lcs=tab:>-,eol:<,nbsp:%
:set lcs=extends:>,precedes:< “eol”, “extends”, “precedes” には強調表示グループ “NonText” が、
“nbsp”, “space”, “tab” , “trail” には “SpecialKey” が適用される。
hl-NonTexthl-SpecialKey
こちらは、Vim上では下記のコマンドでヘルプを確認できます。
:help listchars :help lcs
ヘルプで検索するときは、通常は大文字小文字は識別されませんので、どちらでも構いません。
参考書籍
こちらの書籍が参考になります。
Vim/neovim関連の書籍で、もっとも評判が良くてバイブルと呼んでる人もいる一冊です。Vim/neovimのバージョンに依存しない沢山のTips形式で、その表題通りに「思考のスピードで編集」できるようになるノウハウが詰まっています。その高い評価は Amazon のレビューからも分かる通りです。Vimmer なら必ず一度は読んでおいて間違いありません。
こちらもVim関連の書籍で評価が高い書籍の一冊です。vim-jpで見かける上級Vimmer(Vimサポーターズ)の皆様による、Vimを実践で使ったノウハウからプラグイン関連の情報が詰まっています。日本の Vim界隈を知る上でも是非一読しておきたい一冊です。
Vim/neovim の設定ファイルやプラグインなど、Vim script に関するノウハウがいくつも詰まった一冊です。日本で Vim Script をここまで深く解説している唯一の書籍と言えます。Vim力を伸ばしたいと考えるなら、絶対に避けては通れない書籍でしょう。