vim 区分当前缓冲区是位置列表还是快速修复列表的最好方法是什么?

xdnvmnnf  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(145)

我有一个autocmd,如果ftqf,它将调用一些函数来修改get/setqflist()的快速修复列表
我知道还有另一对函数get/setloclist(),用于处理位置列表。
我的问题是,如何知道当前的缓冲区是qf-list还是location-list(它们都有filetypeqf),以便我知道应该调用哪些函数?
到目前为止,我能想到的是,假设loc和qf列表都不为空,对qf-list做一些修改,并与当前缓冲区进行比较,如果当前缓冲区也被修改了,则是qf-list,否则应该是location list。最后回滚这些修改。但我觉得这很愚蠢...应该有更好的方法来做出决定。
我是否遗漏了某个函数/标志/变量?

9wbgstp7

9wbgstp71#

仅适用于新用户:到目前为止,有getwininfo()返回包含可用于检查的密钥quickfix的字典。还要注意loclist密钥。
由于getwininfo返回一个dict列表,因此可以用途:

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

当它是quickfix或位置列表窗口时为1。并且

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

只有当它是位置列表时才是1。
简而言之:

getwininfo() value:  'quickfix'    'loclist' 
------------------------------------------------
quickfix list            1              0
location list            1              1
xwmevbvl

xwmevbvl2#

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

n3ipq98p

n3ipq98p3#

有一种方法可以做到这一点。以下是方法:

您可以得到“ls”命令的输出,它显示了当前活动的缓冲区。然后您只需搜索该输出,以查找您想要的任何窗口的存在/状态。
下面的示例将告诉您“快速修复程序”或“位置”列表窗口是否处于焦点状态:

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
我也在网上找了找,什么也没找到。我想这个答案应该能解决问题。

tkclm6bt

tkclm6bt4#

我发现的唯一可靠的方法是保存当前窗口号,然后发出:copen命令。如果活动窗口号改变了,你就在位置列表而不是快速修复列表中。如果它没有改变,你就已经在快速修复列表中了。
您还需要存储打开窗口的数量,并将其与新的打开窗口的数量进行比较。然后,如果快速修复窗口尚未打开,则可以将其关闭。
最后,您可以使用存储的窗口编号和wincmd w跳回到位置列表(如果需要)。

相关问题