Vim Advent Calendar 2013 110日目: Vim script からキー入力を呼び出す

この記事は Vim Advent Calendar 2013 110日目の記事になります。
1つ飛んでいるような気がしますが書きたい方がいれば教えて下さい。
さて、今回は Vim script からキー入力を呼び出す方法について簡単に書きます。

[:normal {commands} を使う]

{commands} を実行します。
これは {commands} がノーマルモードからキー入力され時と同じように実行されます。

" カーソル行を "a に保存する
" ! を付けた場合はマップを展開しない
normal! "add

" 特殊キーを含める場合は execute "\" を利用する必要がある
execute "normal! :echo 42\<CR>"
" <Plug> したキーマップを呼び出したり
execute "normal \<Plug>(hoge)"


基本的にはこのコマンドを使用するとよいと思います。

[feedkeys({string} [, {mode}]) を使う]

normal と同じように {string} がキー入力された時と同じように実行します。
ただし、normal とは違いこの入力は処理キューに入れられ、現在の処理が終了してから呼び出されます。

" {mode} が "n" の場合はマップを展開しない
" "m" の場合はマップを展開する(既定値)
call feedkeys("yiw", "n")

" 特殊キーを含める場合は、normal と同じように \ を使用する
call feedkeys(":echo 42\<CR>")

function! Hlsearch()
    " 関数の呼び出し後に処理される
    call feedkeys(":set hlsearch\<CR>", "n")
endfunction


関数などが呼び出された後に処理を行いたい場合に利用する事ができます。

[おまけ:入力されたキーをコマンドラインに表示しない]

execute "normal :let hoge = 12\<CR>"

などを実行するとコマンドライン

let hoge = 12

と表示されます。
これを表示されないようする場合は、

silent execute "normal :let hoge = 12\<CR>"

という風に silent を使用する事で実現する事ができます。


また、feedkeys() の場合はもう少し工夫が必要で

" 処理が表示されないように <silent> でマップする
nnoremap <silent> <Plug>(hoge) :let hoge = 42<CR>
" <silent> で定義したマップを呼び出す
call feedkeys("\<Plug>(hoge)")

このように一度、 へマップして、それを呼び出す形になります。