【发布时间】:2013-08-07 12:05:27
【问题描述】:
我正在为 gvim 编写一个小插件,它可以根据垂直分割的数量自动增加或减少 gui 的宽度。该插件的工作原理是这样的
if has("gui_running")
augroup resize
autocmd WinEnter * call <SID>ResizeSplits()
autocmd WinLeave * call <SID>ResizeSplits()
autocmd BufLeave * call <SID>ResizeSplits()
augroup END
endif
这里ResizeSplits()是调整gui窗口大小的函数:
function! s:ResizeSplits()
let l:count = 0
windo if winwidth(winnr()) < &columns |
\ let l:count += 1 |
\ endif
if l:count > 0
let l:totwidth = l:count - 1 + l:count*80
else
let l:totwidth = 80
endif
if &columns != l:totwidth
execute 'set co=' . l:totwidth
endif
endfunction
该插件几乎可以按我的意愿工作,但并不完全。似乎BufLeave 事件(和类似事件)有时会在窗口关闭之前执行。例如,当我执行<c-w>o 或:only 时,这是一个问题。问题是ResizeSplits 函数不起作用,因为它仍然计算旧的窗口数。
是否有另一个自动命令可用于检测窗口数量何时发生变化,或者保证在窗口被销毁/删除后执行的类似BufLeave 的事件?
让我的插件与映射一起工作是微不足道的,但我无法让它与 :only 和 :close 等 ex 命令可靠地工作。
【问题讨论】:
-
一种解决方法是将
<c-w>c重新映射为<c-w>c:call ...<cr>(其他相关映射类似)。这确实对我有用,但感觉就像一个相当丑陋的黑客攻击。 -
请提供更多背景信息;你的最终目标是什么?当一个问题只是一个很小的技术步骤时,很难提供一个好的答案。如果你不告诉我们为什么你想要这个,很容易屈服于XY problem。
-
啊,我发现我之前的假设是错误的:自动命令确实执行了,所以我真的屈服于 XY 问题。我已经用更具体的细节和更多的背景更新了这个问题。
-
我没有 gvim 进行测试,但我不久前为某人写了类似的东西。我想它遇到了和你一样的问题(可能更多,因为我只使用 WinEnter)。不过,看到实现上的差异可能会很有趣。 stackoverflow.com/questions/7955473/…
-
是的,情况是一样的(至少在原则上),我怀疑你的代码和我的代码有同样的问题。