vimscript - 使用自动命令检查新窗口的 win 和 buf 类型的可靠方法

标签 vim autocommand

因此,我需要在进入新窗口时检查窗口和缓冲区的类型,以便我可以根据上述内容的类型自动执行一些操作。

例如,当quickfix打开时,我需要知道它是它,与command窗口、help等相同.换句话说 - 我需要知道何时打开的新窗口是一个带有常规缓冲区的常规窗口。

我受伤的唯一方法是结合使用 win_gettype()&buftype 选项。

我尝试的第一件事是一个明显的 WinEnter 事件,该事件无法正常工作,因为我无法检查缓冲区的类型。

然后,我尝试了 BufEnter,但是没有参数就无法捕获 :split,显然与 BufWinEnter 类似。此外,第一次打开时不会捕获 quickfix命令

那么,来到问题 - 当打开新窗口时,是否有任何可靠的方法可以自动验证窗口和缓冲区的类型,而不考虑它的方式开在?总结一下 - 有两个问题 - 1)如果使用不带参数的 :split 打开窗口,则根本无法捕获窗口,2)无法可靠地捕获类型(请参阅编辑 2)。

编辑4

好吧,考虑到 EDIT 3WinEnter 可以正常工作并符合预期。但这仍然是一个巨大的解决方法。如果有人有足够的解决方案,我们将保留这个问题。

编辑3

嗯,我看不到如何在窗口或 buf 入口处检查下面的编辑 2 中的内容,但我想可以在事后再次检查它们。我想出了一个想法,用 TerminalOpen 捕获 terminal,用 CmdWinEnter 再次检查 command,然后修复quickfix问题,用FileType检查其'filetype。这些都是巨大的解决方法,但我还看不到解决这个问题的另一种方法。不幸的是,:split 问题仍然存在。

编辑2

我已经详细阐述了主要问题,并对所有这些内容进行了更多讨论。看起来命令行被捕获了。但终端行为很奇怪。因此,使用 WinEnterBufEnter 的不同窗口的行为如下:

|Window    |WinEnter|BufEnter|
|:---------|:-------|:-------|
|quickfix  |   -    |+, 2    |
|command   |   -    |    +   |
|help      |   -    |    +   |  
|terminal  | +, 1   |+, 1    |

   

1 - 但前提是打开另一个终端窗口(第一个终端窗口未被捕获);

2 - 但在 Vim 启动后第一次失败。

对表格感到抱歉,由于某种原因它迫使我缩进它,并且它破坏了页面上所有漂亮的视觉效果。

编辑 1

添加一段代码。我想做的整个想法是存储有关当前打开的所有窗口的信息,这些窗口是具有常规缓冲区的常规窗口。每次打开新窗口或关闭旧窗口时,我都需要自动更新此信息。核心代码如下:

function HandleNewWindow()
    let winid = win_getid()
    let wi = getwininfo(winid)[0]
    let bufnr = wi.bufnr

    if !CorrectBufAndWinTypes(bufnr, winid)
        return 1
    else
        " add winid to the list of regular windows' IDs
    endif
endfunction

function CorrectBufAndWinTypes(bufnr, winid)
    let wt = win_gettype(a:winid)
    let bt = getbufvar(a:bufnr, "&buftype")
    let wi = getwininfo(a:winid)[0]
    let is_terminal = wi.terminal
    let is_quickfix = wi.quickfix

    echom "WT - " wt "BT - " bt is_terminal is_quickfix

    if wt !=? "" || bt !=? "" || is_terminal || is_quickfix
        return 0
    else
        return 1
    endif
endfunction

" I was trying to handle it with the autocommands below:

" autocmd BufEnter * call HandleNewWindow()
"     cannot detect quickfix window at first try
"   (subsequent tries are positive, though)
"     can detect help, but only via &buftype

" autocmd WimEnter * call HandleNewWindow()
"     cannot detect quickfix at all
"     cannot detect help at all

"     both cannot handle command window (q:)

最佳答案

您不必处理缓冲区,因此可以使用 :help 'buftype'

:help win_gettype() 告诉您窗口是否:

  • 弹出窗口
  • 预览窗口
  • 命令行窗口

:help getwininfo() 告诉您窗口是否:

  • 快速修复窗口
  • 终端窗口

将这些相关信息分割在两个命名不一致的函数之间是很丑陋的,但也很好......

关于vimscript - 使用自动命令检查新窗口的 win 和 buf 类型的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68001855/

相关文章:

Vim 跳转到错误的标签

vim - 在 Vim 中查找哪个突出显示用于特定字符串

vim - Tmux 与 iTerm2 分割 Pane

c++ - 在 Vim 中调用层次结构 Eclipse 功能?

vim - 特定文件类型的新文件的自动命令

vim - 在 Vim 上的新选项卡上打开缓冲区

vim - 在 Vim 中写作业的文档格式