Vim の自動インデント機能について
必要になっていろいろ調べてみると、思いのほか分かっていなかったのでまとめました。上から調べて行って該当するものが使われるようです。
'equalprg'
オプションが空でなければ指定された外部プログラムが使われる。'lisp'
オプションがオンなら組み込みで定義された lisp 標準(の一種)のインデントがなされる。'autoindent'
をオンにする必要がある。
'indentexpr'
が空でなければ'indentexpr'
の評価によってインデント深さを計算する。- ユーザーが Vim script によってインデントを定義することができる。
:filetype indent on
によって有効になるインデントの多くは$VIMRUNTIME/indent/{ファイルタイプ名}.vim
で定義されるインデント関数を'indentexpr'
に設定することによって実現される。'indentkeys'
オプションによってトリガーとなるキーを設定できる。
'cindent'
がオンなら組み込みのC言語向けインデントを行う。'cinkeys'
オプションによってトリガーとなるキーを設定できる。'cinoptions'
オプションによって細かい調整ができる。'cinwords'
に登録されたキーワードに動作が依存する。
'smartindent'
がオンなら組み込みのC言語風のインデントを行う。'cindent'
のほうが厳密。'autoindent'
をオンにする必要がある。'cinwords'
に登録されたキーワードに動作が依存する。
'autoindent'
がオンなら自動インデントが行われる。- 新しい行は常に元の行と同じインデント、という簡単なもの。
自動インデントをしない。
'lisp'
と 'smartindent'
が 'autoindent'
を要求するのは知らなかったのですが 'smartindent'
は 'autoindent'
なしでも動いているような? あと 'equalprg'
って具体的にどういうプログラムを指定するんでしょう?
たまに見る
vimrc に
set noautoindent
書いたのに自動インデントがオフにならない。
のようなのは、ファイル読み込みのときにバッファローカルな 'indentexpr'
が設定されているような気がします。
:verbose setlocal indentexpr
を実行して 'indentexpr'
が空でなければ vimrc に
augroup vimrc autocmd FileType {ファイルタイプ名} setlocal indentexpr= augroup END
と書くか、あるいは ~/.vim/after/indent/{ファイルタイプ名}.vim
あたりに
setlocal indentexpr=
と書くのがよいでしょう。 vimrc に書く場合 :filetype indent on
より後に書かなければ有効になりません。
さらにそれでもまだ自動でインデントされるなら、
verbose setlocal equalprg? verbose setlocal lisp? verbose setlocal cindent? verbose setlocal smartindent? verbose setlocal autoindent?
を順に実行して犯人探しというのが筋ですが、 ~/.vim/after/indent/{ファイルタイプ名}.vim
あたりに
setlocal equalprg= setlocal nolisp setlocal indentexpr= setlocal nocindent setlocal nosmartindent setlocal noautoindent
と書くのが手っ取り早いですね。'equalprg'
が空でなかったり 'lisp'
がオンの場合はなかなかないので上二行はいらないかもしれません。
参考
- :help =
- :help 'equalprg'
- :help 'lisp'
- :help 'indentexpr'
- :help 'cindent'
- :help 'smartindent'
- :help 'autoindent'