Vim函数内执行的命令无法被@:重复,如何解决?
Vim函数内命令无法用
@:重复的解决方法 直接在Vim命令行执行以下命令后,输入@:可以正常重复执行:
:windo silent/foo/|wincmd w @:
但将相同逻辑封装到函数后,执行@:会提示E30: No previous command line,无法重复命令,相关代码如下:
function! Find_In_Multiple_Windows(pattern) if !empty(a:pattern) execute ":windo silent /" . a:pattern . "/|wincmd w" endif endfunction nnoremap <silent>fw :call Find_In_Multiple_Windows(input("Search for:"))<CR>
问题原因
直接在命令行执行的命令会被自动存入Vim的命令历史,@:正是调用这个历史里的最近命令;但通过execute在函数内执行的命令不会被自动记录到命令历史,导致@:找不到可重复的内容。
解决方法
修改函数,手动将执行的命令添加到命令历史,并设置@:寄存器指向这条命令:
function! Find_In_Multiple_Windows(pattern) if !empty(a:pattern) let cmd = "windo silent /" . a:pattern . "/|wincmd w" execute cmd histadd('cmd', cmd) let @: = cmd endif endfunction nnoremap <silent>fw :call Find_In_Multiple_Windows(input("Search for:"))<CR>
histadd('cmd', cmd):将拼接好的命令添加到Vim的命令历史列表中let @: = cmd:直接设置重复寄存器@:的值为目标命令,确保@:能立即调用
修改后再执行fw输入搜索内容,随后输入@:即可正常重复执行对应命令。
内容的提问来源于stack exchange,提问作者Roy Fulbright
相关产品推荐
相关产品推荐

