スクリプトを使ってバッファの文字列を操作する場合は、関数 setline もしくは append を利用する。
setline は指定した行の内容を書き換え、append は指定した行の次の行に内容を挿入する。
setline(lnum, expr) の lnum は行番号を整数で、expr はその行の内容を文字列かリストで指定する。
append(lnum, expr) も同じ。
setline(11, 'foobar') は 11行目の内容を foobar という文字列に変える。
append(11, 'foobar') は 12行目に foobar という行を挿入し、元の12行目の内容は 13行目にずれる。
行の内容を書き換えたい場合に setline を、新しく行を追加したい場合に append を使う。
たとえば、カレントバッファ内の "平成" という文字列を含むすべての行において "隧道" という文字列を "トンネル" に置換したいときには、以下のようにできる。
call cursor(1,1) while (search('平成', 'W') != 0) call setline('.', substitute(getline('.'), '隧道', 'トンネル', 'g')) endwhile
複数行を挿入したい場合にはリストを用いる。
call append('.', ['いろはにほへと', 'ちりぬるを'])
これによって、たとえば HTML 文書のテンプレートの挿入などが容易にできる。
空のバッファにテンプレートを挿入するとき、append で1行目を指定すると、2行目以降に挿入されてしまう。(挿入先は指定行の次の行だから。)
かといって 0行目を指定すると、バッファ末尾に空行ができてしまう。(バッファには最低でも1行が初めから確保されていて、append の処理は挿入だから。)
だから空のバッファにそのまま文字列を入れたい場合には、setline で1行目を指定してリストを用いる。
call setline(1, ['おわあ、こんばんは。', 'おわあ、こんばんは。', 'おぎやあ、おぎやあ、おぎやあ。'])
空ではないバッファの場合には注意が必要だ。 setline の処理は書き換えだから、上の例だとバッファの 1行目から 3行目がこの 3行に置き換わる。
append は指定したリストの要素の数だけ新たに行を追加し、setline の場合はリストの要素の数だけ行を書き換える。
そんなわけで、空のバッファにテンプレートを挿入するには setline が便利と思う。