Unlock the door to Creation

Personal space for TLC (a.k.a. Thomas λχ, s6jrlc, s6jr)

vimscriptって意外に面倒だな、みたいな話(変数展開とか正規表現とか)

Category: vim

必須、とまではいかないんですが、vimをこれまで以上に重用すべきな状況に追い込まれまして。
開発をしやすくするためにvimscriptに手を出したんです。

そうしたら、なかなかハマる点が多い。

あと、vimのドキュメントって纏め方がよくないなと個人的に思っていて。
そういった事情もあってなかなか知りたい情報に辿り着けず。
結構頭を抱える時間が長かったので、詰まった部分を中心に覚え書きです。

exe(cute)?

function example1(...)
    new a:1
endfunction

関数の引数(この場合は可変長引数なので"a:1"が1番目の引数)をvimのコマンドに渡したくて、こういうコードを書いてみました。
流石に今見返すと莫迦かよ、とは思いますが。

困ったことに、この関数を実行すると"a:1"という名前のファイルが開きます。
ではa:1の値のファイル名で開かせるにはどうしたらいいか。

function example1(...)
    exe("new " . a:1)
endfunction

変数展開は割とありがちな形なのでさておき、execute|exeってこういう使い方するのか……
何が面倒かって、echoで使うときはecho a:1で勝手に展開してくれるくせにこれが展開されないのがもう。

vimの正規表現

function example2(...)
    if a:1 =~ "^[Hh](oge)?$"
        echo a:1
    end
endfunction

最初の引数がパターンマッチした時に分岐させる、みたいなコードを書いていたら、今度はこのトラップ。
これが機能しないとか、初見殺しだと思うんだけど。

じゃあどうするかというと……

function example2(...)
    if a:1 =~ "^[Hh]\(oge\)\?$"
        echo a:1
    end
endfunction

vimscriptで正規表現を使おうと思ったら、デフォルトではエスケープしないと本来の使い方すらできないメタ文字が結構あるのだそうです。
エスケープが必要なメタ文字はオプションによって変わり、しかもそのモードは4つ(magic, nomagic, very magic, very nomagic)。
厄介すぎるので関数内だけでもメタ文字がそのまま使えるモードにしたかったんですが、検索の時に使うオプションしか判らない。
よって仕方なく、方言丸出しの表記で妥協することに。

ボクの調べが甘いだけの線も大いにありそうなので、これをご覧になった方でスクリプト内のモード変更方法をご存じの方がいらっしゃいましたら、宜しければご教授ください……

まあ、殺意が

湧きましたね。殺意が。
今までちょっとしたショートカットをマップするくらいしかやってこなかった事実を抜きにしても、厄介なことこの上ない。
この手のコーディングでうんざりした経験も人並にあるとは思いますが、今回はひどかった。

「もしかしたら、こういうところでもっと唸るハメになってれば人に当たることも減るのかも」なんて思うくらい。

Written on 2019/05/23