Vim6スクリプトお勉強スレat UNIX
Vim6スクリプトお勉強スレ - 暇つぶし2ch61:1
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 にしたほうがいいのかも。

あと、ハイライトが崩れないようにコメントで調整しているところもポイント!

なんかスクリプトの要領が若干つかめてきた感じがするなー


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch