Запретить Vim обновлять дерево отмены

У меня есть функция Vimscript, которая вызывается BufWritePre для проверки целостности файла. Обычно это включает обрезку пробелов и проверку того, что структура сгиба является «действительной» (в соответствии с соглашениями моей компании).

Моя проблема в том, что если я редактирую файл, а затем сохраняю его, дерево отмены содержит изменения, сделанные функцией проверки. Есть ли простой способ сказать, что я не хочу, чтобы функция изменяла дерево отмены? Или я могу сохранить его состояние в начале функции и восстановить в конце?


person Prince Goulash    schedule 05.10.2012    source источник


Ответы (2)


С помощью :undojoin вы можете объединить свои изменения с последними изменениями, сделанными пользователем (хотя я бы счел это более запутанным, чем их разделение). В общем, отмена — это последовательность шагов; вы не можете просто пропустить промежуточные шаги, это было бы неинтуитивно и трудно реализуемо в движке отмены.

В любом случае, что плохого в том, чтобы включить автоматическое переформатирование в историю отмен? Насколько я понимаю, он будет повторно применен при следующем сохранении, когда пользователь отменит свои последние изменения.

person Ingo Karkat    schedule 05.10.2012
comment
Спасибо, вы делаете несколько хороших замечаний. Мне нужно переосмыслить то, чего я пытался достичь. Команда undojoin может пригодиться. - person Prince Goulash; 18.12.2012

Если ваше действие BufWritePre выполняет манипуляции, в результате которых ваш файл не изменяется, вы можете:

:wundo <tmpfile>

... Внесите изменения, оставив после этого файл без изменений...

:rundo <tmpfile>

Это оставит вам историю отмен до временного изменения, однако, если файл не соответствует своему предыдущему состоянию, вы получите сообщение об ошибке File contents changed, cannot use undo info.

Если вы хотите, чтобы изменения, сделанные во время BufWritePre, нельзя было отменить, вы можете:

:set noundofile

.. Выполнить изменения...

:set undofile

Однако при этом будет потеряна вся история до BufWritePre

person Benj    schedule 05.10.2012
comment
Это выглядит великолепно, спасибо. Почему это будет работать только в том случае, если файл не изменился? В общем файл изменится, но я не хочу иметь возможность отменить изменения. - person Prince Goulash; 05.10.2012
comment
@PrinceGoulash Хотите иметь возможность отменить изменения до действия BufWritePre? - person Benj; 05.10.2012
comment
да. Поэтому, если я добавлю слово, а затем сохраню, u должен удалить слово, независимо от любых изменений пробелов, вызванных сохранением. - person Prince Goulash; 05.10.2012
comment
@PrinceGoulash Насколько я вижу, это невозможно, формат файла отмены основан на последовательности различий и, следовательно, не может содержать отсутствующую информацию, иначе он не сможет воспроизвести промежуточное состояние. - person Benj; 05.10.2012
comment
Я думал, что это может быть так. Однако ваше решение wundo/rundo, кажется, работает в простых случаях, которые я только что пробовал. Спасибо за ваш полезный ответ. - person Prince Goulash; 05.10.2012