Vimの「={motion}」機能(フィルタコマンド)について調べてみた。
※当サイトにはプロモーションが含まれています。
インデントが適切でないプログラムソースファイルがあった場合、Vim でそのファイルを開いて「gg=G」とすると適切にインデントされる。これは、「gg」でファイルの先頭にカーソルを移動させ、「=G」でファイル末尾までのインデントを指示している。
この「=」の機能について少し調べてみた。
helpでの説明
これはフィルタコマンドらしい。 Vimを開いて「:help =」とすると以下のように説明されている。
英語版(:help =@en)
={motion}
Filter {motion} lines through the external program given with the ‘equalprg’ option. When the ‘equalprg’ option is empty (this is the default), use the internal formatting function C-indenting and ‘lisp’. But when ‘indentexpr’ is not empty, it will be used instead indent-expression. When Vim was compiled without internal formatting then the “indent” program is used as a last resort.
日本語版(:help =@ja)
={motion}
{motion} の行を、オプション ‘equalprg’ で指定された外部プログラムでフィルタ処理する。‘equalprg’ が空のとき(これが既定) は、組み込みの整形機能の C-indenting と ‘lisp’ を使う。しかし ‘indentexpr’ が空でないときは、それが使われる indent-expression。Vim が内部フォーマット機能なしでコンパイルされているときは、最後の手段として “indent” プログラムが使われる。
つまり擬似プログラムで説明すると以下となる。
if ‘equalprg’ が存在
equalprg でフィルタ処理する
else
if ‘indentexpr’ が存在
indent-expression が使われる
else
if Vim にインデントフォーマットが組み込まれている(コンパイル時)
C-indenting と ‘lisp’ が使われる
else
“indent” プログラムが使われる
end
end
end
それぞれ使用される機能
equalprg
- Vimのオプション
- ”=” コマンドで使用される外部プログラムを指定できる。
- 参照:Vim documentation: options
indent-expression (indentexpr)
- Vimのオプション
- 適切なインデントを得るために評価される表現(Expression)。
- 例えば、Rubyの場合だと”GetRubyIndent(v:lnum)“といったように関数が指定されるようだ。
- 参照:Vim documentation: options
C-indenting と ‘lisp’
- C-indentingは、Vimに組み込まれているCソースコードのインデント機能。
- ‘lisp’は、Lisp mode のためのVimオプション。
- 参照:Vim documentation: options
- 参照:Vim documentation: indent
“indent” プログラム
- 分からなかった。これ何だろう?
内部フォーマット機能の組み込みについて
- vim のコンパイルオプションに —with-features=xxx があり、ここに tiny, small, normal, big, huge などを指定することにより、組み込まれる機能が変わる。
- インデントに関する機能である +cindent, +smartindent は「normal」以上で組み込まれる。
- 参照:Vim documentation: usr_90
- 参照:Vim documentation: various
広告
