Я пытаюсь изменить файл в BufWritePre при записи на диск, а затем отменить эти изменения в BufWritePost, чтобы текст в рабочем буфере оставался неизменным.Проблема в том, что операция отмены всегда, кажется, отменяет последнюю операцию отмены перед тем, что было сделано в BufWritePre, вместе с изменениями, сделанными в BufWritePre.
Вот код:
" 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
Требуется ли что-то отличное от простой отмены?Учитывая эти две функции, как они есть, если я постоянно выполняю команду «: w», то состояние моего буфера будет постепенно увеличиваться назад, по одной отмене каждый раз, когда я запускаю команду w.
Чтобы объяснить проблему по-другомуТо, что я вижу в своем буфере, когда я постоянно выполняю команды :w
, идентично тому, что я видел бы, если бы я выполнял команды :undo
.Изменения действительно вносятся в функцию BufWritePre при записи, но при отмене они всегда отменяют изменения BufWritePre, а также еще одну отмену, которая перемещает реальное состояние буфера назад.
Я пытался изменить функции, чтобы явно ссылаться насостояние отмены (как показано ниже), но это тоже не работает:
" 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
Я предполагаю, что упускаю что-то простое о том, как отмена должна работать между этими двумя событиями, но я не могу понять,какие.Документы для BufWritePost, кажется, указывают на то, что простая «отмена» - это все, что нужно.Но это не работает для меня.Любые советы приветствуются.