Wie kann man mit gVim feststellen, welcher Puffer extern geändert wurde?

Wie kann man mit gVim feststellen, welcher Puffer extern geändert wurde?

Ich verwende den folgenden Vim-Autobefehl in meiner .gvimrcDatei:

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

mit der Absicht, das Standardverhalten von gVim zu ersetzen, wenn eine Datei extern geändert wird (siehediese Frage). Wenn jedoch mehrere Fenster geöffnet sind, die mehrere Puffer anzeigen, editfunktioniert der Befehl im letzten aktiven Fenster und nicht im Fenster, das den geänderten Puffer enthält.

Wie kann ich feststellen, welcher Puffer das FileChangedShellEreignis verursacht hat, und den editBefehl auf diesen Puffer anwenden?

Antwort1

Aus :help FileChangedShell:

NOTE: When this autocommand is executed, the
current buffer "%" may be different from the
buffer that was changed "<afile>".

Sie müssen das Fenster finden, in dem die entsprechende Datei bearbeitet wird. <abuf>Noch einfacher ist die Eingabe der Puffernummer (in ):

let winNr = bufwinnr(0 + expand('<abuf>'))
execute winNr . 'wincmd w'
edit

Dasselbe gilt für den Puffernamen; ersetzen Sie

let MyBn  = bufname("%")

mit

let MyBn  = expand('<afile>')

Antwort2

Danke für die Antwort von @IngoKarkat. Ich habe eine alternative Lösung gefunden. Ersetzen Sie den ifBlock in der Funktion durch:

  if MyTest == 2
    let v:fcs_choice = "reload"
  else
    let v:fcs_choice = ""
  endif

Das scheint zu funktionieren.

verwandte Informationen