如何确定使用 gVim 从外部更改了哪个缓冲区?

如何确定使用 gVim 从外部更改了哪个缓冲区?

.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

这似乎很有效。

相关内容