因此,我需要在进入新窗口时检查窗口类型和缓冲区,以便我可以根据上述内容的类型自动执行一些操作。
例如,当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
检查,并通过检查它来解决问题,嗯,。这些都是巨大的解决方法,但我还看不到另一种解决方法。不幸的是,问题仍然存在。command
CmdWinEnter
quickfix
filetype
FileType
: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:)