因此,我需要在进入新窗口时检查窗口和缓冲区的类型,以便我可以根据上述内容的类型自动执行一些操作。
例如,当quickfix
打开时,我需要知道它是它,与command
窗口、help
等相同.换句话说 - 我需要知道何时打开的新窗口是一个带有常规缓冲区的常规窗口。
我受伤的唯一方法是结合使用 win_gettype()
和 &buftype
选项。
我尝试的第一件事是一个明显的 WinEnter
事件,该事件无法正常工作,因为我无法检查缓冲区的类型。
然后,我尝试了 BufEnter
,但是没有参数就无法捕获 :split
,显然与 BufWinEnter
类似。此外,第一次打开时不会捕获 quickfix
和命令
。
那么,来到问题 - 当打开新窗口时,是否有任何可靠的方法可以自动验证窗口和缓冲区的类型,而不考虑它的方式开在?总结一下 - 有两个问题 - 1)如果使用不带参数的 :split
打开窗口,则根本无法捕获窗口,2)无法可靠地捕获类型(请参阅编辑 2)。
编辑4
好吧,考虑到 EDIT 3,WinEnter
可以正常工作并符合预期。但这仍然是一个巨大的解决方法。如果有人有足够的解决方案,我们将保留这个问题。
编辑3
嗯,我看不到如何在窗口或 buf 入口处检查下面的编辑 2 中的内容,但我想可以在事后再次检查它们。我想出了一个想法,用 TerminalOpen
捕获 terminal
,用 CmdWinEnter
再次检查 command
,然后修复quickfix
问题,用FileType
检查其'filetype
。这些都是巨大的解决方法,但我还看不到解决这个问题的另一种方法。不幸的是,:split
问题仍然存在。
编辑2
我已经详细阐述了主要问题,并对所有这些内容进行了更多讨论。看起来命令行
被捕获了。但终端行为很奇怪。因此,使用 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:)
最佳答案
您不必处理缓冲区,因此可以使用 :help 'buftype'
。
:help win_gettype()
告诉您窗口是否:
- 弹出窗口
- 预览窗口
- 命令行窗口
:help getwininfo()
告诉您窗口是否:
- 快速修复窗口
- 终端窗口
将这些相关信息分割在两个命名不一致的函数之间是很丑陋的,但也很好......
关于vimscript - 使用自动命令检查新窗口的 win 和 buf 类型的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68001855/