01/12/31 14:04
引き続き foo.vim の解読。
class Klass { などとタイプすると、
//-------------------- class Klass
class Klass {
};
となるスクリプト。
まず発動の準備。
augroup Foo
autocmd BufEnter *.cpp,*.h inoremap { {<Esc>:call ClassHeader("-")<CR>a
autocmd BufLeave *.cpp,*.h iunmap {
" Keep your braces balanced!}}}
augroup END
*.cpp または *.h のバッファに移動した瞬間に挿入モードの時に { を
タイプすると、どさくさに ClassHeader("-") を実行する。
バッファから抜けた時(BufLeave)には { での発動を解除。
fun! ClassHeader(leader)
if getline(".") !~ "^\\s*class"
return
endif
normal yyP$x
let width = 80
if exists("&tw")
let width = &tw
endif
execute "normal " . (width-virtcol(".")-3) . "I" . a:leader . "\<Esc>"
execute "normal a \<Esc>"
execute "normal I//\<Esc>"
" Keep your braces balanced!{
execute "normal! jo};\<Esc>"
normal k$
endfun
行頭に空白が含まれるかもしれない class がある行じゃなかったら終了。
で、行を二重化(yyP)して、行末移動($)して "}" を削除(x)。
widthはデフォルトで80にしたけど、tw オプションがあればそっちを有効に。
virtcol(".") は画面上のカーソルX座標。col(".") とはチョット違う。
で、"60I-<ESC>" みたいなのが実行されて - がたくさん挿入されて
"a <ESC>" は右隣に一文字スペース挿入して、下移動(j)、下に一行挿入(o)して
}; を入力して、上の行の最後に移動(k$)。
って、これじゃ読んでる人わけわからんだろうーな。
ちなみに tw オプションが 0 なら上のスクリプトは "-" を負の個数分挿入する事に
なってうまく動作しないので exist("&tw") && &tw != 0 にしたほうがいいのかも。
あと、ハイライトが崩れないようにコメントで調整しているところもポイント!
なんかスクリプトの要領が若干つかめてきた感じがするなー