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

379
ysap

Ich verwende den folgenden automatischen Vim-Befehl 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 (siehe diese Frage ). Wenn jedoch mehrere Fenster mit mehreren Puffern geöffnet werden, editfunktioniert der Befehl im letzten aktiven Fenster und nicht in dem Fenster, in dem sich der Puffer befindet, der geändert wurde.

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

1

2 Antworten auf die Frage

4
Ingo Karkat

Von :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 suchen, in dem die entsprechende Datei bearbeitet wird. Dafür ist die Puffernummer (in <abuf>) noch einfacher:

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

Gleiches gilt für den Puffernamen. ersetzen

let MyBn = bufname("%") 

mit

let MyBn = expand('<afile>') 
Ich habe "edit MyBn" anstelle des "edit" -Befehls verwendet. Wenn Sie jedoch die Schaltfläche "Laden" auswählen, wird der Fehler "E811" angezeigt, und der Puffer wird nicht aktualisiert. Ich denke, meine alternative Antwort ist direkter. ysap vor 10 Jahren 0
Ich frage mich, warum es einen Unterschied zwischen den beiden Edit-Formularen gibt. Die `edit`-Version (no args) funktioniert, wenn der letzte aktive Puffer derjenige war, der die geänderte Datei hatte. ysap vor 10 Jahren 0
versuchte auch `bearbeiten aber bekam die gleiche Antwort ysap vor 10 Jahren 0
Sie müssten "Ausführen" bearbeiten "fnameescape (MyBn)", aber ich sehe, Sie haben eine einfachere Alternative gefunden. Ingo Karkat vor 10 Jahren 0
Leider scheitert auch diese Variante. ysap vor 10 Jahren 0
0
ysap

Danke an @ IngoKarkats Antwort. 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 

Dies scheint den Trick zu tun.