Web Application Security Memo

ウェブセキュリティに関するメモ書き

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’

“indent” プログラム

  • 分からなかった。これ何だろう?

内部フォーマット機能の組み込みについて

  • vim のコンパイルオプションに —with-features=xxx があり、ここに tiny, small, normal, big, huge などを指定することにより、組み込まれる機能が変わる。
  • インデントに関する機能である +cindent, +smartindent は「normal」以上で組み込まれる。
  • 参照:Vim documentation: usr_90
  • 参照:Vim documentation: various