在vim我通常使用quickfix列表作为todo列表的类型来修复错误或重构代码.但是我的工作流程有一些问题:
:cn多次跳转来比较代码的其他部分,那么查找最后编辑的条目:cp很困难.:cw有帮助,但在更大的清单上,它也变得困难.删除固定条目会很有帮助.所以我希望找到一个简单的命令:help quicktext来添加一个位置到quickfix列表或删除已经修复的条目.但我能找到的只是:cbuffer或:caddb.但是在:cw我收到消息后编辑缓冲区时,它是不可修改的.帮助文本提供了以下解决方案(但我真的不想编写临时文件):
注意:在quickfix窗口中进行更改不会影响错误列表.'可修改'是为了避免进行更改.如果您仍然删除或插入行,则文本和错误号之间的关系会混乱.如果您真的想这样做,可以将quickfix窗口的内容写入文件并使用":cfile"将其解析并用作新的错误列表.
也许:cad有人可以添加当前行?还是有人在考虑其他工作流程?
这是一种无需使用插件或定义函数即可实现相同目的的更短方法...
只需将其弹出到ftplugin/qf.vim. 对于 Neovim,将此文件放在~/.config/nvim/after/ftplugin/qf.vim.
此语法dd仅向 quickfix 文件类型添加键绑定。这将从列表中删除当前行。
例如,用于:cope打开一个 quickfix 缓冲区并dd在那里尝试。
nnoremap <buffer> <silent> dd
\ <Cmd>call setqflist(filter(getqflist(), {idx -> idx != line('.') - 1}), 'r') <Bar> cc<CR>
Run Code Online (Sandbox Code Playgroud)
注意:我相信该<Cmd>地图仅在 Neovim 中可用,在这种情况下,:如果您在常规 vim中,您只需删除它并添加一个。
我在特别寻找从快速修复列表中删除项目的能力时发现了您的问题。我不太擅长vimscript,因此可能有一个更优雅的解决方案,但这就是我想到的。
这将覆盖ddquickfix列表(由于modifiable已关闭,因此无论如何几乎没有用),以从quickfix列表中删除当前行(光标的当前行,而不是当前的quickfix项)。
我无法弄清楚如何以编程方式确定当前的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>
Run Code Online (Sandbox Code Playgroud)
更新:我已经修复了使用上述功能发现的一些问题。
从21.8.2018(补丁:8.1.0311)开始,插件cfilter$VIMRUNTIME本身已分发。它记录在下:h cfilter-plugin。
必要时加载插件cfilter或始终将其加载到vimrc中
:packadd cfilter
Run Code Online (Sandbox Code Playgroud)
筛选快速修复列表
:Cfilter DPUST
Run Code Online (Sandbox Code Playgroud)