如何在Vim中创建一个按键映射来打开和关闭快速修复窗口

12
如果我使用:lopen,Vim会打开快速修复窗口,如果我在带有错误的窗口(或快速修复窗口本身)上使用:lcl,它将关闭该窗口。
我希望在我的.vimrc中创建一个映射,以此方式打开快速修复:
nnoremap <F2> :lopen 10<CR>

但是当我再次按下 F2 时,它使用 :lcl 关闭它。

有没有一种方法可以知道快速修复窗口是否打开,然后执行 :lcl 呢?

5个回答

18

在 Vim 的足够新版本中(其中有 getwininfo 命令),请尝试:

function! ToggleQuickFix()
    if empty(filter(getwininfo(), 'v:val.quickfix'))
        copen
    else
        cclose
    endif
endfunction

nnoremap <silent> <F2> :call ToggleQuickFix()<cr>

定制,

  • 要在垂直面板中打开窗口,请使用vertical copen
  • 对于位置列表(而不是快速修复),请将copen/cclose替换为lopen/lclose,将v:val.quickfix替换为v:val.loclist

1
如果你喜欢简洁的单行代码,可以使用以下代码进行映射:nnoremap <expr> <F2> empty(filter(getwininfo(), 'v:val.quickfix')) ? ':copen<CR>' : ':cclose<CR>' - Sakari Cajanus

6

这正好满足我的需求,谢谢。不过我还想要更简单一些的东西,不需要插件。感谢指导,这个脚本帮助我创建了自己的答案 :) - Hassek
该插件有两个功能。您可以将代码复制到您的 vimrc 中。 - kev
那确实是真的,但我不明白为什么会变得如此复杂。顺便说一下,谢谢您的迅速回答! - Hassek

2

这里有另一种方法来实现它,可能会略过一些细节但它是可行的:

function! ToggleQuickFix()
  if exists("g:qwindow")
    lclose
    unlet g:qwindow
  else
    try
      lopen 10
      let g:qwindow = 1
    catch 
      echo "No Errors found!"
    endtry
  endif
endfunction

nmap <script> <silent> <F2> :call ToggleQuickFix()<CR>

如果没有错误,lopen将不起作用,因此我使用try catch来捕获错误,以防万一打开窗口并创建一个变量。然后如果没有错误,它就会关闭窗口。
很酷的是,这种方法可以用于您想要切换的任何内容。

只要你通过这个映射打开quickfix窗口,那就没问题。但请记住,当通过其他方式(autocmds、其他插件等)打开quickfix窗口时,你的全局状态变量将无法工作。 - Ingo Karkat
是的,如果那样的话我需要按两次F2。我猜应该有一种方法可以询问快速修复窗口是否打开,这样就可以解决问题了。 - Hassek

0

0
这是一个用于在neovim中切换Quickfix列表的lua函数。
local function toggle_quickfix()
  local windows = vim.fn.getwininfo()
  for _, win in pairs(windows) do
    if win["quickfix"] == 1 then
      vim.cmd.cclose()
      return
    end
  end
  vim.cmd.copen()
end

km('n', '<Leader>qt', toggle_quickfix, { desc = "Toggle Quickfix Window" })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接