LoginSignup
2
1

More than 3 years have passed since last update.

Vim スクリプトの autocmd 実行中に、インサートモードに入って CTRL キーを入力する何かを実行したい

Posted at

はじめに

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 コマンドで、ia キーからではなく、コマンドからインサートモードに入ります。

次に | に続けて、インサートモード後に実行する関数を指定します。

指定した関数は組み込み関数の一種である feedkeys 関数です。この関数で、指定された文字列をユーザーがタイプしたかのように処理キューに入れてくれます。

キーの中で<C-R><CR> という特殊なキー入力がありますが、そのキー入力をシミュレートするにはダブルクォートと "\..." 記法を使うというのがミソでした。
マニュアルに書かれていますが、ダブルクオートで囲った文字列の中で、\<C-R>CTRL-R\<CR>Enter の押下を表してくれます。

上記を指定しておくと、Vim 起動時にインサートモードで 20200111 のような日付が挿入されると思います。

おわりに

実現のために知らない関数を探したりするのが大変でしたが、実現できるととても面白いなと感じました。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1