Vim の自動インデント機能について

必要になっていろいろ調べてみると、思いのほか分かっていなかったのでまとめました。上から調べて行って該当するものが使われるようです。


  1. 'equalprg' オプションが空でなければ指定された外部プログラムが使われる。

  2. 'lisp' オプションがオンなら組み込みで定義された lisp 標準(の一種)のインデントがなされる。

    • 'autoindent' をオンにする必要がある。
  3. 'indentexpr' が空でなければ 'indentexpr' の評価によってインデント深さを計算する。

    • ユーザーが Vim script によってインデントを定義することができる。
    • :filetype indent on によって有効になるインデントの多くは $VIMRUNTIME/indent/{ファイルタイプ名}.vim で定義されるインデント関数を 'indentexpr' に設定することによって実現される。
    • 'indentkeys' オプションによってトリガーとなるキーを設定できる。
  4. 'cindent' がオンなら組み込みのC言語向けインデントを行う。

    • 'cinkeys' オプションによってトリガーとなるキーを設定できる。
    • 'cinoptions' オプションによって細かい調整ができる。
    • 'cinwords' に登録されたキーワードに動作が依存する。
  5. 'smartindent' がオンなら組み込みのC言語風のインデントを行う。

    • 'cindent' のほうが厳密。
    • 'autoindent' をオンにする必要がある。
    • 'cinwords' に登録されたキーワードに動作が依存する。
  6. 'autoindent' がオンなら自動インデントが行われる。

    • 新しい行は常に元の行と同じインデント、という簡単なもの。
  7. 自動インデントをしない。


'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'