You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:10:11