11

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

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

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

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

我错过了一些功能/标志/变量吗?

4

4 回答 4

9

仅适用于新手:截至目前,有getwininfo()返回包含quickfix可用于检查的键的字典。还要注意loclist关键。

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

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

当它是一个快速修复或位置列表窗口时,它是 1。和

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

仅当它是位置列表时才为 1。

于 2018-11-27T02:42:37.133 回答
6

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

于 2013-08-30T05:33:58.167 回答
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

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

于 2016-05-13T15:09:49.057 回答
0

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

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

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

于 2013-09-03T16:20:04.607 回答