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.