繰り返す
ノーマルモードで@:
と打つとコマンドを繰り返し実行できます。10@:
と打てば10回コマンドが繰り返し実行されます。
コマンドラインモードで :echo localtime()
を実行後、@:
を連打するか1秒以上経過してから@:
と打つと、コマンドラインに新しく現在の時刻が表示されます。
例
サンプルをいくつか載せます。
サンプル1
sample1.vim
function! Insert1() abort
normal! i1
endfunctioncall feedkeys(":call Insert1()\<CR>",'t')
Vim起動
vim -Nu NONE -i NONE -S sample1.vim
Vimを起動するとバッファに1が挿入されている状態になります。@:
を打つと繰り返して実行されます。
但し、スクリプトの中で@:
を実行したらE30が発生します。
一瞬でエラーメッセージが消えるのでエラーがなかったように見えますが:message
で確認できます。
次のサンプルを試すとE30が発生します。
sample1a.vim
function! Insert1() abort
normal! i1
endfunctioncall feedkeys(":call Insert1()\<CR>",'t')
normal! @:
Vim起動
vim -Nu NONE -i NONE -S sample1a.vim
サンプル2
sample2.vim
function! Insert1() abort
normal! i1
endfunction
command! Insert1 :call Insert1()
Vim起動
vim -Nu NONE -i NONE -S sample2.vim
Vimを起動した後に手動で:Insert1
を実行してください。
sample2.vimの中で:Insert1
を実行しても繰り返しに対応できません。@:
を打つと:Insert1
が繰り返されます。
サンプル3
sample3.vim
function! Insert1() abort
normal! i1
endfunction
command! Insert1 :call Insert1()nnoremap<C-a> :<C-u>call feedkeys(":Insert1\r",'t')<CR>
Vim起動
vim -Nu NONE -i NONE -S sample3.vim
Ctrl-a
を押した後に@:
で繰り返し実行できるようになります。
ちなみにnnoremap
とfeedkeys
と\<CR>
を組み合わせて書くとE114とE116が発生します。
nnoremap <C-a> :<C-u>call feedkeys(":Insert1\<CR>", 't')<CR>
\<CR>
の部分を \r
と書けばエラーは発生しなくなります。
繰り返せないサンプル
.viminfoの コマンドライン 項目の履歴
にコマンドを追加しても繰り返せません。
bad1.vim
call histadd(':','echo localtime()')
:history c
で確認すると確かに:echo localtime()
が履歴に追加されていますが繰り返せないようです。