![如何确定使用 gVim 从外部更改了哪个缓冲区?](https://linux22.com/image/1402281/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E4%BD%BF%E7%94%A8%20gVim%20%E4%BB%8E%E5%A4%96%E9%83%A8%E6%9B%B4%E6%94%B9%E4%BA%86%E5%93%AA%E4%B8%AA%E7%BC%93%E5%86%B2%E5%8C%BA%EF%BC%9F.png)
.gvimrc
我在我的文件中使用以下 Vim 自动命令:
augroup MyAuGroup
autocmd MyAuGroup FileChangedShell * call FileChanedEvent_BuffUpdate()
augroup END
function FileChanedEvent_BuffUpdate()
let MyBn = bufname("%")
let MyStr = "Warning: File \"".MyBn."\" has changed since editing started\nSee \":help W11\" for more info."
let MyTest = confirm(MyStr, "&OK\n&Load File", 2, "W")
if MyTest == 2
edit
else
endif
endfunction
目的是在文件被外部更改时替换 gVim 的默认行为(请参阅这个问题)。但是,如果打开了多个窗口并显示多个缓冲区,则该edit
命令将作用于最后一个活动窗口,而不是包含已更改缓冲区的窗口。
我如何确定哪个缓冲区导致了该FileChangedShell
事件,并将edit
命令应用于该缓冲区?
答案1
从:help FileChangedShell
:
NOTE: When this autocommand is executed, the current buffer "%" may be different from the buffer that was changed "<afile>".
您需要找到正在编辑相应文件的窗口。为此,缓冲区编号(在 中<abuf>
)甚至更容易:
let winNr = bufwinnr(0 + expand('<abuf>'))
execute winNr . 'wincmd w'
edit
缓冲区名称也是如此;替换
let MyBn = bufname("%")
和
let MyBn = expand('<afile>')
答案2
感谢@IngoKarkat的回答。我找到了另一种解决方案。将if
函数中的块替换为:
if MyTest == 2
let v:fcs_choice = "reload"
else
let v:fcs_choice = ""
endif
这似乎很有效。