この記事は 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 内での利用
execute
と normal
を併用することで、シリアライズしたマクロを実行できる。
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 件のコメント:
コメントを投稿