はじめに
Vim スクリプトの autocmd
で実行するコマンド中に、インサートモードに入ってから CTRL キーを押すコマンドをどうやって実行すればいいかがわからなかったので、そのやり方を調べてみました。
やりたかったこと
Vim を起動すると同時に、インサートモードである文字列を入力したい場合を考えます。
例として、ノーマルモードで <C-H><C-H>
と入力するとインサートモードで日付を入力する場合は以下の通りです。
nmap <C-H><C-H><ESC>a<C-R>=strftime("%Y%m%d")<CR>
<ESC>a
でインサートモードに入り、<C-R>=
で指定された評価式 strftime("%Y%m%d")
の評価結果を挿入します。最後の <CR>
は入力されたコマンドを実行することを表します。
上記を実行すると、20200111
のような日付が挿入されます。
しかし、これを autocmd
内で実行する方法がわかりませんでした。
tl;dr
調べた結果、以下のような形で実現できました。
autocmd VimEnter * startinsert |call feedkeys("\<C-R>=strftime("%Y%m%d")\<CR>")
まず autocmd VimEnter *
で、Vim の起動完了後に指定されたコマンドを実行します。
指定された関数は startinsertコマンドで、i
や a
キーからではなく、コマンドからインサートモードに入ります。
次に |
に続けて、インサートモード後に実行する関数を指定します。
指定した関数は組み込み関数の一種である feedkeys関数です。この関数で、指定された文字列をユーザーがタイプしたかのように処理キューに入れてくれます。
キーの中で<C-R>
や <CR>
という特殊なキー入力がありますが、そのキー入力をシミュレートするにはダブルクォートと "\..."
記法を使うというのがミソでした。
マニュアルに書かれていますが、ダブルクオートで囲った文字列の中で、\<C-R>
は CTRL-R
、 \<CR>
は Enter
の押下を表してくれます。
上記を指定しておくと、Vim 起動時にインサートモードで 20200111
のような日付が挿入されると思います。
おわりに
実現のために知らない関数を探したりするのが大変でしたが、実現できるととても面白いなと感じました。