如何在Vim的quickfix窗口中列出缓冲区?


13

使用vim编辑器,一个常见的任务是浏览缓冲区。我现在使用标准命令,例如:ls:bnext。实际上,我在.vimrc中设置了:

"move amongs buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

我想以MRU插件实现的简单(优秀)方式在quickfix窗口中以列表形式浏览缓冲区。

是否有像MRU一样简单但作用于缓冲区的插件?

好的,可能的解决方案可能是使用:CtrlpBuffers命令,该命令是Ctrlp插件的一部分,但我不是Ctrlp的忠实拥护者,因为有时我不完全了解奇怪的行为(模糊模式选择...);所以我正在寻找一些真正简单的MRU插件。

顺便说一句,我开玩笑说:cexpr {expr},尝试用:buffers列表内容填充quickfix窗口,但是没有成功(可能是因为我的无知编程vimscripts)

有什么建议吗?


您是:bnext不是要说:cnext
tommcdo

您是否特别需要将其作为quickfix窗口?还是只希望能够在窗口中看到打开的缓冲区?(因为有多个插件可以完成后者)。
丰富

我希望能够浏览窗口中的打开缓冲区。事实上,和quickfix不reuired
乔治Robino

@tommcdo:是的,抱歉,我通常的错别字。我的意思是:bnext,我更新了问题
Giorgio Robino

Answers:


18

您可以使用每个缓冲区填充快速修复列表,如下所示:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()接受一个字典项目列表,描述每个错误(文件名,行号,位置等)。在这种情况下,我们指定了最少的信息集:缓冲区号
  • map()接受一个List和一个表达式(字符串),并返回应用于输入List的每个项目的表达式的新List。在这里,我们获取列出的缓冲区编号的列表,并将其格式化以用于setqflist()'{"bufnr": v:val}',其中v:val是列表中项目的值)
  • filter()过滤列表,删除不满足给定表达式的元素。这里的表达式是buflisted(v:val),表示存在并列出了缓冲区号,即出现在:ls输出中
  • range(a, b)生成的数字从一个列表ab
  • bufnr()返回给定缓冲区名称的编号。如果参数为'$',则返回最高的缓冲区号

键入的内容很多,而且不是很令人难忘,因此您可以将其包装在vimrc中的命令中:

command! Qbuffers call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr":v:val}'))

现在,您可以使用:Qbuffers来填充快速修复列表。


如果要在添加新缓冲区时自动更新它,可以执行以下操作:

autocmd BufAdd * Qbuffers

但是,我不建议这样做,因为它将使Quickfix列表对于诸如:make或的东西非常不可用:grep


1
感谢您的解释,Tommcdo。Qbuffers很漂亮!也许我会在通话的最后添加一个:copen来立即打开quickfix窗口,也许报告光标位置可能很有用。我必须研究一下vimscript :-)
Giorgio Robino

9

您应该尝试以下映射:

nnoremap gb :ls<CR>:b<Space>

在提示符下,键入所需的缓冲区号,然后按Enter。

b


关于在quickfind窗口中列出缓冲区的问题。
VeXii

是的,我的答案提供了一个轻量级的选择。
romainl

1
OP声明他了解缓冲区列表,但希望将其保存在quickfix窗口中。而您的解决方案就是只使用bufferlist?
VeXii

1

看一下bufexplorer插件。它会在边栏中打开所有缓冲区的可浏览列表,类似于提到的MRU插件。此外,vim.org上还有更多这样的插件。

PS:您在Stack Overflow上曾问过同样的问题;请不要将相同的问题同时提交给多个网站!


tks Ingo,我测试了一下bufexplorer,我喜欢它。我也在这里发布,因为建议进行stackoverflow
Giorgio Robino

1
是的,我看到了。我希望您先删除原始的SO帖子,或者至少将其链接到交叉发布。
Ingo Karkat 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.