Vim6スクリプトお勉強スレat UNIX
Vim6スクリプトお勉強スレ - 暇つぶし2ch86: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" が実行されると。


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