13

假设我使用 ag.vim 插件disabled通过多个文件搜索字符串。它在 quickfix 窗口中返回了一些结果:

1 first_file.rb|1 col 1| disabled something something
2 second_file.rb|1 col 2| disabled another something

是否可以选择快速修复结果作为输入,通过它们 grep 并在新的快速修复窗口中打开结果?换句话说,如果我输入:quickfix_grep first_file,新的 quickfix 只会弹出一个条目:

1 first_file.rb|1 col 1| disabled something something
4

4 回答 4

20

更新

为此要求编写了一个 vim 插件:https ://github.com/sk1418/QFGrep


原答案:

我对您的目标的理解是:

您的 grep 结果在您的快速修复中不知何故很大,您想缩小对它的看法。通过输入带有正则表达式的命令,过滤 grep 结果。过滤后的结果也应该显示在 QuickFix 窗口中,以便您可以打开/跳转到文件。

如果以上是您想要的,请查看以下内容:

源这个函数和命令行:

function! GrepQuickFix(pat)
  let all = getqflist()
  for d in all
    if bufname(d['bufnr']) !~ a:pat && d['text'] !~ a:pat
        call remove(all, index(all,d))
    endif
  endfor
  call setqflist(all)
endfunction
command! -nargs=* GrepQF call GrepQuickFix(<q-args>)

然后在您的快速修复中的 grep/ack/whatever 显示内容之后,您可以键入

:GrepQF <regex>

在您的快速修复中进行过滤。

这里我添加了一个 GIF 动画。我正在使用Ack而不是grep,但这没有区别。给定的正则表达式将匹配文件名和 quickfix 中显示的文本。我做了两次过滤来证明这一点。

在此处输入图像描述

希望能帮助到你。

于 2013-03-14T12:20:12.017 回答
7

新的官方 vim 插件cfilter

21.8.2018(补丁:8.1.0311)以来,插件cfilter与 vim 在$VIMRUNTIME. 它记录在 下:h cfilter-plugin

在需要时加载插件cfilter或总是在你的 vimrc 中加载它

:packadd cfilter

过滤快速修复列表

:Cfilter DPUST
于 2018-08-22T07:55:32.537 回答
5

我对这个问题的解决方案一直是让 quickfix 缓冲区默认可修改:

:autocmd BufReadPost quickfix set modifiable

(上面的命令要放在.vimrc文件中。)

这样做为对 grepping 结果的任何适当编辑打开了一系列可能性,例如手动删除不相关的条目或使用:globaland:vglobal命令过滤(免费提供问题中所需的功能);对相关条目进行分组和重新排序;以自由形式添加空行或注释;等等

于 2013-03-14T21:20:23.683 回答
4

这是@Kent 答案的更短更简洁的版本:

function! GrepQuickFix(pat)
  call setqflist(filter(getqflist(), "bufname(v:val['bufnr']) !~# a:pat"))
endfunction
command! -nargs=* GrepQF call GrepQuickFix(<q-args>)

它是相同的代码,只是更简洁更短,我不认为它值得一个单独的插件。

于 2013-12-16T07:33:35.593 回答