Vim の 3 種類のインデントモード
Vim には、大きく分けて、以下のようなオートインデント設定があります。
- autoindent … カレント行のインデントをキープする。シンプル。
- smartindent … C-like なプログラミング言語向けの自動インデント。
- cindent … C/Java言語に特化したインデント(
smartindentよりも厳密に文法を考慮)
Vim/Neovim はファイルタイプに応じて自動的に cident などのインデントモードが有効化されるようになっています(参照: :e $VIMRUNTIME/filetype.lua)。
インデントモードの有効化/無効化
autoindent の有効化
:set autoindent " autoindent を ON
:set noautoindent " autoindent を OFF
:set autoindent? " autoindent の設定を確認 (autoindent or noautoindent)autoindent を有効にすると、新しい行を追加したときに、前の行のインデントが引き継がれるようになります。
ただそれだけのシンプルなインデントモードです。
新しい行の追加は例えば、以下のような入力があった場合が対象になります。
oコマンド(あるいはOコマンド)- インサートモード時の Enter
インサートモードのまま、インデントの量を変えるには CTRL-T、CTRL-D などのコマンドを使用します。
下記は、:help index からのキーマップ説明の抜粋です。
i_CTRL-T: 現在の行にshiftwidth分のインデントを挿入する。i_CTRL-D: 現在の行からshiftwidth分のインデントを削除する。
smartindent の有効化
:set smartindent " smartindent を ON
:set nosmartindent " smartindent を OFF
:set smartindent? " smartindent の設定を確認 (smartindent or nosmartindent)
smartindent は、C-like な言語を編集するときに、下記のようにそれっぽく字下げや字上げを自動化してくれるインデントモードです。
{ごとにインデントを深くし、}ごとにインデントを浅くする。- 前の行が
cinwordsに設定されたキーワードで始まっているときにインデントを深くする(cinwordsのデフォルト値はif,else,while,do,for,switch)。
ただし、C 言語風のプリプロセッサのために、# で始まる行はインデント数を 0 にするといった特殊ルールも設定されています。
cindent の有効化
:set cindent " cindent を ON
:set noindent " cindent を OFF
:set cindent? " cindent の設定を確認 (cindent or nocindent)
cindent を有効にしておくと、C/C++ や Java などの言語構文をより厳密に考慮して、非常に賢いインデントを自動で行ってくれます。
例えば、if ブロックを {} で囲まなかった場合に、次の一行だけインデントを深くする、といったことを行ってくれます。
cindent が設定されている場合は、smartindent の設定は無効になります。
cindent の詳しい設定方法は、:help C-indenting で参照できます。