捕获中断/中断命令

mMo*_*ntu 5 vim

我正在尝试中断for循环,例如下面的代码,

for num in buffer_number_list
    " Select the buffer
    exe 'buffer' num
    " Run the command that's passed as an argument
    exe a:command
    " Save if necessary
    update
endfor
Run Code Online (Sandbox Code Playgroud)

当是 a exe a:command时,而不是仅中断线路。a:command:s/// command

目的是更改响应中的代码How to do search & Replace with ack in vim?

我尝试用 / 块包围该行exe a:command,但它不起作用,可能是因为该命令处理了中断信号而没有重新抛出它trycatch

尝试重新映射CTRL-c来更改某些变量(将在循环内部检查),但它不起作用:

let original_Ctrl_c = maparg('<c-c>', 'n')
exe 'nnoremap <c-c> :call <SID>BreakLoop()<CR>' . original_Ctrl_c
Run Code Online (Sandbox Code Playgroud)

当中断信号被捕获时,映射似乎没有触发。

有任何想法吗?

编辑:

看来这个问题只出现在gVim中(感谢@ib。)

ib.*_*ib. 1

尝试重现您描述的行为我构建了以下测试用例。它包括使用命令创建的两个相同的文件

$ echo -e "skip\npat\npat" | tee tmp1 >tmp2
Run Code Online (Sandbox Code Playgroud)

并在 Vim 中打开,除了获取包含命令实现的文件之外,无需任何初始化:QFDo

$ vim -u NONE -S qfdo.vim
Run Code Online (Sandbox Code Playgroud)

或者

$ gvim -u NONE -U NONE -S qfdo.vim
Run Code Online (Sandbox Code Playgroud)

在这两个文件中搜索模式,

:vimgrep /pat/ tmp{1,2}
Run Code Online (Sandbox Code Playgroud)

填充可用于运行相关命令的快速修复窗口的内容,

:QFDo v/skip/s/pat/rep/gce
Run Code Online (Sandbox Code Playgroud)

在第一次替换(发生在文件中)之后使用Ctrl+中断此命令会终止整个 命令,因此文件保持不变。这一事实意味着您试图克服的行为是由某些 自定义或插件引起的。要找到实际的配置破坏 +行为,请禁用所有插件并尝试每次运行上述测试用例时一一启用它们。Ctmp1:QFDotmp2.vimrcCtrlC