我有一个autocmd,如果ft
是qf
,它会调用一些函数来修改get/setqflist()
我知道还有另外一对函数get/setloclist()
来处理位置列表。
我的问题是,如何知道当前缓冲区是qf-list
还是location-list
(它们都有filetype
qf
)以便我知道应该调用哪些函数?
到目前为止,我能想到的是,假设loc和qf列表都不为空,在qf-list上做一些更改,并与当前缓冲区进行比较,如果当前缓冲区也被更改,则为qf-list,否则它应该是位置列表。最后回滚更改。但我觉得这很愚蠢......应该有更好的方法来做出决定。
我是否错过了一些函数/标志/变量?
答案 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
跳回位置列表(如果需要)。