options about indent

AviSynth窓使いの憂鬱をいじってるときに自動的に comment 開始文字列が挿入されなかったり indent してくれなかったりしたので色々調べて設定してみたら出来るようになった。他に適当なところがなかったので ftplugin で設定してるんだけどいいのかな ?

以下 indent に関する option 群。 :help するときの keyword として知っておくといざというとき困らないはず。というか :help って調べたいことを vim での言い方で的確に指定しないと役に立たないから使いづらいんだよな…。ある程度わかってこないとわからないことがわからないという二律背反。

  • 'formatoptions'
    • text を自動的に整形する timing と方法を指定する。 comment まわりもここで指定するので最初わからなくてけっこう時間かかった。歴史的な経緯もあるんだろうけどもう少しわかりやすくならんかなぁ。
  • 'cindent'
    • C 言語 like な言語ならこれを指定しとけば大体いい感じにやってくれる。
  • 'cinoptions'
    • cindent で indent が行われる際 ( ≠ cindent が有効。 indentexpr だとか場合によっては equalprg なんかも考慮されて indent 時に使われる方法が決定されるらしいので単純に :set cindent したからといって cindent で indent が行われるとは限らない ) に細部の挙動を変更することが出来る。default じゃ丸カッコまわりは indent されないのでこれで指定しておくと整形厨も幸せになれる。
  • 'cinkeys' / 'indentkeys'
    • insert mode でここに指定した key を押すと indent する。あんまりいじる必要ないかなと思うんだけどたまに変な設定がされてる filetype もあるのでこれで補正する。あと Kaoriya さんとこの Windowsgvim だと ftplugin で indentkeys を設定しても反映されないという bug があるんだけど ( 単に version の問題だと思う ) autocmd の FileType event 経由で :set すれば問題ない。
  • 'indentexpr'
    • どう考えても C 言語っぽくない言語で indent を決定するための関数を指定する。けど変態的自作言語とかじゃない限り大体 cindent で済んだりすでに indentexpr が設定済みだったりするので自分でいじることはたぶんない、はず。
  • 'comments'
    • comment の形式指定。くくる type か特定の文字以降を comment とみなす type かとかいろいろ指定できる。てかこういう option があるのに syntax は別途指定しないといけないんだね。仕方ないね。

あと xhtml で closing tag を補完 ( http://github.com/januswel/dotfiles/blob/cdb2dfd8cf5c6c839f919b22ea868cedf28a31bd/.vim/ftplugin/xhtml.vim の InsertHTMLCloseTag() 関数 ) したときに indent が崩れてたんだけど補完後に強制的に reindent させる code ( 以下 ) を .vimrc に書いたらいい感じになった ( "^b" は <C-v><C-b> で入力するやつ ) 。

" reindent by <C-b>
" cludge: setting 'indentkeys' at ftplugin don't work in gvim
autocmd FileType html,xhtml :setlocal indentkeys& indentkeys+=!^b

" key mappings
" ftplugin: html.vim
" complete closing tab
autocmd FileType html,xhtml :inoremap <buffer><C-f> <Esc>:call InsertHTMLCloseTag()<CR>a<C-b>

代案として InsertHTMLCloseTag() で closing tag を挿入したあとに normal mode で == する ( :call InsertHTMLCloseTag()==a ) というのも考えられるんだけどそうすると cursor 位置が吹っ飛んでしまって補正しようにもめんどかったので ( 補完される文字列と同じのがすでにあった場合どこに cursor を持っていけばいいかの判断がちょう大変 ) こんな形で落ち着きました。てか filetype が html / xhtml の場合 indentkeys に ! flag 付きの key 指定がないので自前で indentkeys に追加しなきゃいけなかったという経緯で。

あー default にあわせて を indent 用にして あたりに InsertHTMLCloseTag() を map すべきかな…。いやでも は Tab の alias だからつぶすのはちょっと…、というか Insert mode であいてるのが だけだったからこんなになったわけで。うぅむ。