Vim 快速修复列表,如何添加和删除条目

Vim 快速修复列表,如何添加和删除条目,vim,Vim,在vim中,我通常使用快速修复列表作为todo列表的一种类型来修复错误或重构代码。但我的工作流程中有几个问题: 如果我必须使用:cn多次向前跳转以比较代码的其他部分,则很难使用:cp找到最后编辑的条目:cw有帮助,但在更大的列表上,这也变得很困难。删除固定条目会很有帮助 在重构时,我有时会遇到我想稍后返回的代码片段。使用全局标记是可以的,但是将当前位置添加到快速修复列表将更有帮助 因此,我希望通过:help quicktext找到一个简单的命令,将一个位置添加到快速修复列表中,或者删除一个已

在vim中,我通常使用快速修复列表作为todo列表的一种类型来修复错误或重构代码。但我的工作流程中有几个问题:

  • 如果我必须使用
    :cn
    多次向前跳转以比较代码的其他部分,则很难使用
    :cp
    找到最后编辑的条目
    :cw
    有帮助,但在更大的列表上,这也变得很困难。删除固定条目会很有帮助
  • 在重构时,我有时会遇到我想稍后返回的代码片段。使用全局标记是可以的,但是将当前位置添加到快速修复列表将更有帮助
因此,我希望通过
:help quicktext
找到一个简单的命令,将一个位置添加到快速修复列表中,或者删除一个已经修复的条目。但我能找到的只有
:cbuffer
:caddb
。但是在
:cw
之后编辑缓冲区时,我收到一条消息,它是不可修改的。帮助文本提供了以下解决方案(但我真的不想编写临时文件):

注意:在“快速修复”窗口中进行更改不会影响 错误。”“可修改”处于禁用状态,以避免进行更改。如果删除或插入 无论如何,文本和错误号之间的关系是混乱的。 如果您真的想这样做,您可以编写quickfix的内容 窗口指向一个文件,并使用“:cfile”将其解析并用作新错误 名单


也许通过
:cad
可以添加当前行?或者有人考虑过其他工作流吗?

在快速修复列表中添加和删除条目通常使用
:help setqflist()
:help getqflist()
完成

您还有
:help:caddexpr
,其中包含一个与您尝试执行的操作非常相似的示例,但遗憾的是没有对称的
:cremoveexpr



既然我们已经做到了,我的插件可以让你过滤、保存、修改、合并和恢复快速修复列表,所以它可能对你有用。从qf/loc列表中添加/删除任意项目听起来像是一个可能的功能…

我在寻找从快速修复列表中删除项目的功能时发现了您的问题。我不太擅长vimscript,所以可能有一个更优雅的解决方案,但这里是我想到的

这将覆盖快速修复列表中的
dd
(无论如何这都是非常无用的,因为
modifiable
处于禁用状态)以从快速修复列表中删除当前行(光标的当前行,而不是当前快速修复项)

我不知道如何以编程方式确定当前的quickfix项,这就是我决定使用
dd
,使其应用于光标行的方式

我希望你会觉得这很有用

" When using `dd` in the quickfix list, remove the item from the quickfix list.
function! RemoveQFItem()
  let curqfidx = line('.') - 1
  let qfall = getqflist()
  call remove(qfall, curqfidx)
  call setqflist(qfall, 'r')
  execute curqfidx + 1 . "cfirst"
  :copen
endfunction
:command! RemoveQFItem :call RemoveQFItem()
" Use map <buffer> to only map dd in the quickfix window. Requires +localmap
autocmd FileType qf map <buffer> dd :RemoveQFItem<cr>
“在快速修复列表中使用'dd'时,请从快速修复列表中删除该项。
函数!RemoveQFItem()
设curqfidx=line('.')-1
设qfall=getqflist()
调用删除(qfall、curqfidx)
调用setqflist(qfall,'r')
执行curqfidx+1.“cfirst”
:科本
端功能
:command!RemoveQFItem:调用RemoveQFItem()
“使用“映射”仅映射quickfix窗口中的dd。需要+localmap
autocmd文件类型qf映射dd:RemoveQFItem
更新:我已经修复了我在上述功能中发现的一些问题。

UPDATE:New official vim plugin 因为插件cfilter是在
$VIMRUNTIME
本身中分发的。它记录在
:h cfilter plugin

在需要时加载插件cfilter,或始终在vimrc中加载插件cfilter

:packadd cfilter
使用筛选快速修复列表

:Cfilter DPUST

这里有一个不需要使用插件或定义函数就可以实现相同功能的较短方法

只需将其弹出到
ftplugin/qf.vim
。对于Neovim,将此文件放在
~/.config/nvim/after/ftplugin/qf.vim

此语法仅将
dd
keybinding添加到quickfix文件类型。这将从列表中删除当前行

:call setqflist(getqflist()[:0])
例如,使用
:cope
打开快速修复缓冲区,然后在那里尝试
dd

nnoremap <buffer> <silent> dd
  \ <Cmd>call setqflist(filter(getqflist(), {idx -> idx != line('.') - 1}), 'r') <Bar> cc<CR>
nnoremap-dd
\调用setqflist(filter(getqflist(),{idx->idx!=line('.')-1}),'r')cc

注意:我相信
映射只在Neovim中可用,在这种情况下,如果您在常规vim中,您只需删除它并添加一个

Vimscript有一种类似python的方法来选择数组范围,因此您也可以使用
[n:n]
作为索引来选择当前的快速修复列表

:call setqflist(getqflist()[1:])
…将从列表中删除第一项

:call setqflist(getqflist()[:0])
…将删除最后一个

您还可以使用
+
对数组进行压缩,以便

:call setqflist(getqflist()[1:] + getqflist()[:0])

…也行

:set modifiable
:set ma
使缓冲区可修改,因此您可以
dd
从快速修复列表中删除行。

谢谢。我尝试了
:caddexpr
,但无法对当前行进行限制。发现作为一个很好的插件添加。我将从您的插件中查看拒绝功能。您可能希望了解以下内容:如果您使用未损坏的插件,您可以使用
]q
[q
]q
[Q
而不是
:cn
:cp
:Slat
:cfirst
很好,这是一个非常有用的小插件。我把它复制到了~/.vim/plugin/quickfix\dd.vim中,效果非常好。我更进一步,把它做成了一个插件。我刚刚修复了脚本中的几个bug;看,太棒了!谢谢@TamaMcGlinn!