我正在尝试中断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,但它不起作用,可能是因为该命令处理了中断信号而没有重新抛出它try。catch
尝试重新映射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。)
尝试重现您描述的行为我构建了以下测试用例。它包括使用命令创建的两个相同的文件
$ 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