.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
这似乎很有效。