Quickfix列表,如何添加和删除条目

时间:2017-03-20 13:35:05

标签: vim

在vim中我通常使用quickfix列表作为todo列表来修复错误或重构代码。但是我的工作流程中存在一些问题:

  • 如果我必须多次使用:cn向前跳转来比较代码的其他部分,则很难找到带有:cp的最后编辑条目。 :cw会有所帮助,但在更大的列表中,它也会变得困难。删除固定条目会很有帮助。
  • 在重构时,我偶尔会遇到一些我希望稍后返回的代码。使用全局标记是可以的,但将当前位置添加到quickfix列表会更有帮助。

所以我希望找到一个带:help quicktext的简单命令,为quickfix列表添加一个位置或删除已经修复的条目。但我能找到的只有:cbuffer:caddb。但是在:cw之后编辑缓冲区我得到一条消息时,它是不可修改的。帮助文本提供了以下解决方案(但我真的不想编写临时文件):

  

注意:在quickfix窗口中进行更改不会影响列表   错误。 '修改'是为了避免做出改变。如果删除或插入   无论如何,文本和错误号之间的关系搞砸了。   如果你真的想这样做,你可以编写quickfix的内容   窗口到文件并使用":cfile"将其解析并用作新错误   列表。

也许使用:cad可以添加当前行?或者有没有人考虑过替代工作流程?

6 个答案:

答案 0 :(得分:4)

通常使用:help setqflist():help getqflist()在quickfix列表中添加和删除条目。

您还有:help :caddexpr,其中包含的示例与您尝试的内容非常相似,但遗憾的是没有对称的:cremoveexpr

由于我们处于此状态,我的插件vim-qf可让您过滤,保存,修改,合并和恢复quickfix列表,以便可能对您有用。从qf / loc列表中添加/删除任意项目听起来像是一个可能的功能......

答案 1 :(得分:4)

我发现你的问题时特别注意从quickfix列表中删除项目的能力。我不擅长vimscript,所以可能是一个更优雅的解决方案,但这就是我想出来的。

这会覆盖quickfix列表中的dd(因为modifiable已关闭,因为dd已关闭)以删除当前行(光标的当前行,而不是当前的quickfix项)来自quickfix列表。

我无法弄清楚如何以编程方式确定当前的quickfix项目,这是我决定使用" 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> 的方式,以使其更明显地应用于游标行。

我希望你会发现这很有用。

function scroll() {
   var scrolldown = element.all(by.css(".className"));
   browser.controlFlow().execute(function () {
      browser.executeScript('arguments[0].scrollIntoView(true)', 
      scrolldown.getWebElement());
   });
}

scroll();

更新:我已经修复了我在上述功能中发现的一些问题。

答案 2 :(得分:4)

更新:新的官方vim插件cfilter

21.8.2018 (patch: 8.1.0311)起,插件 cfilter 本身就分布在$VIMRUNTIME中。它记录在:h cfilter-plugin下。

在需要时加载插件 cfilter 或始终将其加载到vimrc中

:packadd cfilter

使用...过滤快速修复列表

:Cfilter DPUST

答案 3 :(得分:1)

:set modifiable:set ma 使缓冲区可修改,因此您可以将 dd 行排除在 quickfix 列表之外。

答案 4 :(得分:0)

这是无需使用插件或定义函数即可实现同一目的的一种较短方法。

只需将其弹出到ftplugin/qf.vim

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

注意:我相信 <Cmd>地图仅在Neovim中可用,在这种情况下,您只需将其删除并添加一个{{1} }(如果您使用的是常规vim。

答案 5 :(得分:0)

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

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

...将从列表中删除第一项。

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

...将删除最后一个。

您还可以使用 + 来连接数组,所以...

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

...也能用!