- 86 名前:1 [02/01/06 21:42]
- >>81-84
うーん、いろいろ勉強になりますなー。 <SID>はスクリプトローカル関数を呼ぶ時の為のものだったのか、、、 で、引き続き foo.vim の解読。 2〜4行目のfooをbarに置換するには、 :2,4 s/foo/bar/g と書くけど 2 と 4 が変数a,bの場合、 :a,b s/foo/bar/g と書いてしまうと正常に動作しない。 それに対応するのが次のスクリプト。 command! -nargs=* Line \ | let Line_range = matchstr(<q-args>, '\S\+') \ | let Line_range = "(" . substitute(Line_range, ",", ").','.(", "") . ")" \ | execute "let Line_range = " . Line_range \ | execute Line_range . substitute(<q-args>, '\S\+', "", "") \ | unlet Line_range 使い方。 :let a=2 :let b=4 :Line a,b s/foo/bar/g あと範囲指定部分で演算が可能。 :Line a-1,b+1 s/foo/bar/g スクリプト解読。 -nargs=* は引数を0個以上取る。 行をまたいで定義するには \ で繋ぐ。 <q-args>は引数を一つの文字列として参照する "a,b s/foo/bar/g" \S\+ は1個以上の空白以外で matchstr は最初のにヒットするから、 matchstr("a,b s/foo/bar/g", '\S\+') は "a,b" がヒットする。 んで、ごちゃごちゃしているけど Line_range="(a).','.(b)" となって、次がポイント。 Line_range が execute で評価されて結果 "2,4" が Line_range に入る。 ちなみに let Line_range = execute(Line_range) などとは書けそうで書けない。 で、substitute(<q-args>, '\S\+', "", "") は a,b の部分を消して " s/foo/bar/g" が残る。 二つを連結して execute "2,4 s/foo/bar/g" が実行されると。
|

|