2024年9月4日水曜日

Vim のマクロを有効活用するためにいろいろ試してみたら、最終的に exec normal に行き着いた

この記事は Vim 駅伝 の 2024/09/04 の記事です。 前回の記事は mikoto2000 さんによる、 2024/08/30 の「Vim を pager にしたら filetype の決め方に少し詳しくなった」という記事でした。

次回は 2024/09/06 に投稿される予定です。

前提

  • OS: Windows 11 Pro 23H2 ビルド 22631.4037
  • Vim: 9.1.598

実験

記録と再生

Hello, World! と入力するマクロを作る。

記録

qqaHello, World!<ESC>q

q<レジスタ><キーストローク>q<レジスタ> にマクロが記録できる。

再生

@q

@<レジスタ><レジスタ> に記録したマクロを再生する。

マクロのシリアライズ

マクロも、「レジスタに記録されたデータ」でしかないので、ペーストできる。

レジスタ q に記録したマクロのシリアライズ

普通にペーストするだけ

"qp

先ほどの「Hello, World! と入力するマクロ」の場合、以下データがペーストされる。

aHello, World!^[

^[ は、 2 文字の文字列ではなく、 ESC の制御文字

記録したマクロを変数に格納

バッファに出力してもつまらないので、レジスタを変数に格納する。

let hello_macro = @q

これで、レジスタの値が変数 hello_macro に格納される。

なので、次のように echo するとペーストしたときと同じデータが表示される。

:echo hello_macro
-> aHello, World!^[

^[ は、 2 文字の文字列ではなく、 ESC の制御文字

Vim script 内での利用

executenormal を併用することで、シリアライズしたマクロを実行できる。

execute "normal <ここにマクロを記録したレジスタをペーストする>"

例えば、先ほどの Hello, World! を出力するマクロを実行したい場合、以下コードで実行できる。

execute "normal aHello, World!^["
-> バッファに `Hello, World!` が入力される

^[ は、 2 文字の文字列ではなく、 ESC の制御文字

コマンドにしてしまう

Vim script で使えるという事は、コマンドにもできるという事で、以下のようにコマンドにできる。

command! CommandName exec ':normal <ここにマクロを記録したレジスタをペーストする>'

そらで書くには辛いけど、たまにあると便利なマクロをコマンドとして登録しておくと幸せになるかも。

自分は今回、ケース変換処理をコマンドにした。

""" {{{ for convert case
command! ConvertToLowerCamel exec ':normal viwuve:s/\v_(.)/\u\1/g^M'
command! ConvertToUpperCamel exec ':normal viwuvUe:s/\v_(.)/\u\1/g^M'
command! ConvertToLowerSnake exec ':normal viw:s/\C\v(.)([A-Z])/\1_\l\2/g^Mvu'
command! ConvertToUpperSnake exec ':normal viw:s/\C\v(.)([A-Z])/\1_\l\2/g^MviwU'
""" }}} for convert case

^M は、 2 文字の文字列ではなく、 Enter の制御文字

結局最終成果物はコマンドになってしまったが、コマンドにマクロをペーストすることで、 「たまにある面倒な作業がコマンド一発」となるので、まぁいい感じにはなるのではないでしょうか?

以上。

0 件のコメント:

コメントを投稿