vim-users.jp

Hack #137: タブとインデントの設定を理解する

Posted at 2010/04/06
このエントリーをはてなブックマークに追加

Vim にはタブやインデントの挙動を制御するオプションが多数あり、細かい指定ができます。

本 Hack ではこれらに関するオプションについて簡単に紹介します。一部説明を省略している箇所もあります。より詳しい説明が知りたい場合は :help で各オプションの項目を見てみてください。

また、ここで紹介しているもので全てではありません。より高度なオプションについては省略しています。

'tabstop' 'ts'

バッファについてローカルなオプションです。

タブ文字が何文字分として表示されるかの設定です。

'expandtab' 'et'

バッファについてローカルなオプションです。

このオプションが on だと、インデントが生成される際やタブキーを押した際にタブ文字の代わりに同じ見た目になるようにスペースを挿入します。 インデントが生成される際とは、<>、Insert-mode での <C-d><C-t> でインデントを変更した際、新しい行を挿入した際、= でインデントを調節した際などが該当します。

本当のタブ文字を挿入したい場合は <C-v><Tab> とすることで入力できます。

以下のオプションの説明で「空白を挿入する」とあった場合、このオプションが on の場合はスペースを、off の場合はタブ文字(と、場合によっては合わせてスペース)を挿入することになります。

'shiftwidth' 'sw'

バッファについてローカルなオプションです。

インデントを変更する際に何文字分ずらすかの設定です。

これは 'tabstop' とは独立しています。つまり、'tabstop''shiftwidth' を別の値に設定することができます。

この場合を含み、'expandtab' が off の場合、タブ文字だけではインデントが行えない場合があります。その場合は、半端な部分はスペースになります。

" :set tabstop=8 shiftwidth=4 noexpandtab の場合
" わかりやすくするためにタブ文字を >------- で、スペースを _ で表示している
hoge
____hoge
>-------hoge
>-------____hoge

'softtabstop' 'sts'

バッファについてローカルなオプションです。

このオプションに 0 以外が設定されていると、 <Tab><BS> を入力した際にその文字数分空白を入力したり削除したりします。つまり、'tabstop' の値とは関係なくあたかもタブ文字がこのオプションの値の文字数であるかのように振舞います。

'smarttab' 'sta'

グローバルなオプションです。

このオプションが on のとき、行頭の連続した空白に限り、<Tab>'shiftwidth' 分だけ空白を挿入します。また、同様に行頭の空白の部分のみ、<BS>'shiftwidth' 分のスペースを削除します。これによりインデントがタブ文字かスペースかをあまり意識する必要がなくなります。

'autoindent' 'ai'

バッファについてローカルなオプションです。

新しい行を挿入する際に、新しい行のインデントを直前にいた行と同じになるようにします。

この自動で挿入されたインデントは、何も入力せずに Insert-mode の抜けたりさらに新しい行を作ったりした場合削除されます。 この動作を望まない場合は、新しい行を挿入した際に何かを入力してすぐ消すような Key mapping を定義するといいでしょう。

nnoremap o oX<C-h>
nnoremap O OX<C-h>
inoremap <CR> <CR>X<C-h>

'copyindent' 'ci'

バッファについてローカルなオプションです。

新しい行にインデントを自動挿入する際、既存行のインデント構造をコピーします。

これはつまり、既存行のインデントがタブ文字で構成されていれば 'expandtab' が on でも自動挿入されるインデントはタブ文字になるということです。既存行がタブ文字とスペースが混ざって構成されていた場合も、同じになるようにコピーされます。

'preserveindent' 'pi'

バッファについてローカルなオプションです。

現在行のインデント量を変更する際、すでにある部分に関してはインデント構造を保とうとします。

例えばタブ文字で構成されている行があり、その行を << でインデント量を減らそうとした場合、通常 'expandtab' が on の場合は行のインデントを構成する文字がスペースに変換されてしまいますが、このオプションが on の場合はタブ文字はそのままに保たれます。

thinca

もどる
blog comments powered by Disqus