отменить проблему с событиями bufwritepre, bufwritepost в Vim - PullRequest
1 голос
/ 25 ноября 2010

Я пытаюсь изменить файл в 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, кажется, указывают на то, что простая «отмена» - это все, что нужно.Но это не работает для меня.Любые советы приветствуются.

1 Ответ

1 голос
/ 25 ноября 2010

Я наконец-то отменил эту ошибку самостоятельно. Каким-то образом было введено две записи как для BufWritePre, так и для BufWritePost, поэтому обе они вызывались дважды, и вторая отмена отменяла дополнительное время. Я все еще не уверен, как это происходило, но использую au! очистка автокоманд перед их выдачей приводит к регистрации только одного набора au-команд. Я также не уверен, почему даже с двумя наборами была проблема с отменами, так как я удостоверился, что по крайней мере одно изменение было сделано в BufWritePre каждый раз, когда это вызывалось. В любом случае, похоже, сейчас все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...