gVim で外部的に変更されたバッファを判別するにはどうすればよいでしょうか?

gVim で外部的に変更されたバッファを判別するにはどうすればよいでしょうか?

ファイル内で次の Vim 自動コマンドを使用しています.gvimrc:

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>".

対応するファイルが編集されているウィンドウを見つける必要があります。そのためには、バッファ番号 (in <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

これでうまくいくようです。

関連情報