2010-11-25 8 views
1

Ich versuche, die Datei in BufWritePre, wenn auf der Festplatte, geschrieben zu ändern und dann diese Änderungen in BufWritePost rückgängig gemacht werden, so Text in Arbeitspuffer unverändert bleibt. Das Problem ist, dass die Operation rückgängig scheint immer die letzte rückgängig machen Operation vor, was in BufWritePre getan wurde, zusammen mit den Änderungen getan in BufWritePre. HierUndo Problem mit bufwritepre, bufwritepost Ereignissen in Vim

ist der Code:

" BufWritePre function 
function! <SID>GlobalUnconvertTags() 
    let g:save_cursor = getpos(".") 
    g/^\*\+\s/call UnconvertTags(line(".")) 
endfunction 
" BufWritePost function 
function! <SID>UndoUnconvertTags() 
    undo 
    call setpos(".",g:save_cursor) 
endfunction 

ist etwas anderes als ein einfaches Undo erforderlich? Bei diesen beiden Funktionen, wie sie sind, wenn ich ständig den Befehl ': w' die undostate meines Puffers gehen inkrementell rückwärts, ein rückgängig machen jedes Mal, wenn ich den w-Befehl.

Um das Problem auf eine andere Weise zu erklären, was ich in meinem Puffer sehe, wenn ich kontinuierlich :w Befehle ausgibt, ist identisch mit dem, was ich sehen würde, wenn ich :undo Befehle ausgeben würde. Die Änderungen werden zwar beim Schreiben in der BufWritePre-Funktion vorgenommen, aber wenn sie rückgängig gemacht werden, machen sie immer die BufWritePre-Änderungen rückgängig, plus ein weiteres Rückgängigmachen, das den tatsächlichen Pufferzustand zurückbewegt.

Ich habe versucht, die Funktionen zu verändern, um explizit eine Undo Zustand (wie unten) referance aber das funktioniert auch nicht:

" BufWritePre function 
function! <SID>GlobalUnconvertTags() 
    let g:save_cursor = getpos(".") 
    let s:undostate = changenr() 
    g/^\*\+\s/call UnconvertTags(line(".")) 
endfunction 
" BufWritePost function 
function! <SID>UndoUnconvertTags() 
    execute "undo ".s:undostate 
    call setpos(".",g:save_cursor) 
endfunction 

Ich nehme an, ich bin etwas fehlt einfach darüber, wie rückgängig gemacht werden soll zwischen diesen beiden Ereignissen zu arbeiten , aber ich kann nicht herausfinden, was. Die Dokumentation für BufWritePost scheint darauf hinzudeuten, dass ein einfaches 'Rückgängigmachen' alles ist, was benötigt wird. Aber das funktioniert nicht für mich. Alle Hinweise geschätzt.

Antwort

1

Ich habe diesen Fehler endlich selbst beseitigt. Irgendwie wurden zwei Einträge sowohl für BufWritePre als auch für BufWritePost eingegeben, so dass beide zweimal aufgerufen wurden und das zweite Rückgängigmachen eine zusätzliche Zeit rückgängig machte. Ich bin mir immer noch nicht sicher, wie das passiert ist, aber mit au! Das Löschen von Autokommandos vor dem Ausgeben führt dazu, dass nur ein Satz von au-Befehlen protokolliert wird. Ich bin mir auch nicht sicher, warum es auch bei zwei Sets ein Problem mit Undos gab, da ich bei jedem Aufruf darauf geachtet habe, dass mindestens eine Änderung in BufWritePre vorgenommen wurde. Auf jeden Fall scheint es jetzt in Ordnung zu sein.