vim インデント,Tab文字についてのあれこれ

こんにちは。vimrc(init.vim)をいじるのって楽しいですよね。最近vim熱が再燃してきて、「vimrcをいじっていたら一日が終わってしまった」という現象を久々に味わいました、ブログ主です。

vimでのインデント・Tab文字について、いくつかハマったり気になった項目があったので、その方法をまとめてみたいと思います。

Tabキーを押した時の挙動

まず行頭でTabキーを押した場合、vim内ではTab文字が挿入される訳ではありません。tabキーをタイプすると…

  • (tabstopまたはsofttabstopにて)決められた数のスペースを挿入。
  • スペースの数がtabstopに達すると、その領域がTab文字に変換される。

このような仕組みでtab文字が挿入されます。

例を挙げてみます。例えば…

set tabstop=8
set softtabstop=3

このような設定にて行頭でtabキーを3回タイプすると、softtabstop × 3 = 9 つのスペースが挿入されますが、tabstopに指定されている8つ分のスペースがtab文字に変換されるので、実際には1つのtab文字と1つのスペースが挿入されることとなります。

Tab文字制御に関する変数

vimにはTab文字を制御するための変数がいくつかあります。一覧を以下に示します。

" Tab文字に関する設定。以下に記した値は全てデフォルト値。
" 値は全てバッファローカル
set tabstop=8    " 略称 ts
set softtabstop=0    " 略称 sts
set shiftwidth=8    " 略称 sw
set expandtab!    " 略称et
set smarttab!    " 略称sta

tabstop
tab文字がいくつのスペースに相当するかを指定するオプション。デフォルト値は8。tabキーによって挿入されたスペース数がtabstopに達すると、その領域はtab文字に置き換わる。

softtabstop
tabキーによって挿入されるスペースの数を指定する。tabキーやbsキーでの動作時に使用される。デフォルト値は0(無効)。0の場合は「tabstop分のスペースが挿入→そのままtab文字に変換」となるので、(tabstop分の幅を持つ)tab文字が挿入される。
また、この値をマイナスにセットすると、後述するshiftwidthの値が使われる。

shiftwidth
cindentなどを設定している場合の自動インデントや、>>, <<コマンドでのインデントシフトの際に使われるスペースの数を指定する。デフォルト値は80の場合にはtabstopの値が使われる。

expandtab
この設定をonにすると、挿入されたスペースはtab文字に変換されない。デフォルトはオフ。自動インデントや、>>, <<コマンドでのインデントシフトの際にもtab文字は用いられず、適切な数のスペースが用いられる。

smarttab
tabキーでのスペース挿入数を、
行頭 : shiftwidth
それ以外 : tabstopもしくはsofttabstopsofttabstop!=0の場合)
とする。デフォルトではオフ。

ファイルタイプによるデフォルト値の設定

tab文字に自動的に変換してくれるのは大変ありがたいことではありますが、インデントにスペースを推奨しているプログラミング言語もあります。

例えばpythonでは、PEP 8というコーディング規約にて

Use 4 spaces per indentation level.

と定められています。「インデントには4つのスペースを使ってね。」ということです。

ちなみにvimでは、ファイルタイプ毎に適切なtab文字設定を行ってくれているので、特にこだわりがなければ個別に設定する必要はありませんが、拘りたい方は、以下のようにファイルタイプ毎にそれぞれの値を設定することもできます。

augroup mytabsettings
    autocmd! 
    autocmd Filetype python setlocal expandtab shiftwidth=4 softtabstop=4 tabstop=8
    autocmd Filetype javascript setlocal expandtab softtabstop=4 shiftwidth=4 tabstop=4
    autocmd FileType html setlocal sw=4 sts=4 ts=4 et    " 略称で指定
augroup END

終わりに

vimでのtab文字設定はいかがだったでしょうか。ファイルタイプによって、デフォルト値が異なることや、tab文字制御に関する変数がいくつかあるのでこんがらがっている人も多いのではないでしょうか。

皆さんも適切にtab文字設定を行って、快適なvim生活をお過ごしください。