区分当前缓冲区的最佳方法是位置列表还是quickfix列表?

时间:2013-08-29 22:39:38

标签: vim

我有一个autocmd,如果ftqf,它会调用一些函数来修改get/setqflist()

的quickfix列表

我知道还有另外一对函数get/setloclist()来处理位置列表。

我的问题是,如何知道当前缓冲区是qf-list还是location-list(它们都有filetype qf)以便我知道应该调用哪些函数?

到目前为止,我能想到的是,假设loc和qf列表都不为空,在qf-list上做一些更改,并与当前缓冲区进行比较,如果当前缓冲区也被更改,则为qf-list,否则它应该是位置列表。最后回滚更改。但我觉得这很愚蠢......应该有更好的方法来做出决定。

我是否错过了一些函数/标志/变量?

4 个答案:

答案 0 :(得分:6)

仅针对新用户:截至目前,getwininfo()会返回包含键quickfix的字典,可用于检查。还要注意loclist键。

由于getwininfo返回字典列表,因此您可以使用:

getwininfo(win_getid())[0]['quickfix']

当它是快速修复程序或位置列表窗口时为1。还有

getwininfo(win_getid())[0]['loclist']

仅在位置列表中为1。

答案 1 :(得分:4)

w:quickfix_title变量告诉您​​使用什么命令生成窗口中显示的列表。如果冒号后面的第一个字母是l,那么您就在位置列表中。

答案 2 :(得分:2)

有办法做到这一点。方法如下:

您将获得“ls”命令的输出,该命令显示当前活动的缓冲区。然后,您只需搜索该输出以查找所需窗口的存在/状态。

下面的示例将告诉您是否关注Quickfix或Location列表窗口:

function! example()
    exec 'redir @a | ls | redir END'
    if match(@a,'%a-  "\[Location List\]"') >= 0
            exec 'echo "Location list focused!"'
    elseif match(@a,'%a-  "\[Quickfix List\]"') >= 0
            exec 'echo "Quickfix list focused!"'
    else
            exec 'echo "Neither Location or Quicklist focused!"'
    endif
endfunction

感谢您提出这个问题,我注意到您甚至试图在其他地方寻求帮助:http://vim.1045645.n5.nabble.com/detect-QuickFix-window-list-or-LocationList-td4952180.html

我也环顾了互联网,一无所获。我认为这个答案可以解决问题。

答案 3 :(得分:0)

我找到的唯一可靠方法是存储当前窗口编号,然后发出:copen命令。如果活动窗口号更改,则您位于位置列表而不是quickfix列表中。如果它没有改变,那么你已经在quickfix列表中。

您还希望存储打开的窗口数,并将其与新打开的窗口数进行比较。然后,您可以关闭quickfix窗口(如果尚未打开)。

最后,您可以使用存储的窗口编号和wincmd w跳回位置列表(如果需要)。