0

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

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

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

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

然后,我尝试BufEnter了 ,但没有参数就无法捕捉:split到,显然与BufWinEnter. 另外,quickfix第一次打开时不会捕捉到command

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

编辑 4

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

编辑 3

好吧,我看不到如何在窗口或 buf 入口时从下面的EDIT 2中检查内容,但我想可以在之后再次检查它们。我想出了一个想法,要抓住terminal,再次TerminalOpen检查,并通过检查它来解决问题,嗯,。这些都是巨大的解决方法,但我还看不到另一种解决方法。不幸的是,问题仍然存在。commandCmdWinEnterquickfixfiletypeFileType:split

编辑 2

我已经对主要问题进行了详细说明,并对所有这些内容进行了更多尝试。好像command line被抓住了。但是终端行为很奇怪。WinEnter因此,具有和的不同窗口的行为BufEnter如下:

|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:)
4

2 回答 2

1

您不必处理缓冲区并因此使用:help 'buftype'.

:help win_gettype()告诉你一个窗口是否是:

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

:help getwininfo()告诉你一个窗口是否是:

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

将这些相关信息拆分在两个命名不一致的函数之间是最丑陋的,但是很好……</p>

于 2021-06-16T13:51:38.413 回答
1

您可以查看:h :buffers显示所有缓冲区的内容。

:buffers[!] [flags]where[flags]限制要列出的缓冲区。例如

" Show all active buffers
buffers! a

" Show regular active buffers
buffers a

" Show special(unlisted) active buffers
buffers au

您还可以:filter通过显示的缓冲区名称进行缓冲区

filter /\.vim/ buffers a

获取所有缓冲区的另一种方法是getbufinfo()提供更多详细信息。

于 2021-06-17T05:23:53.953 回答