В: Как мне вставить / изменить текст в буфере, не undo
замечая этого?
Вот пример использования. У меня есть блок комментариев в начале каждого файла, который, помимо прочего, обновляет временную метку для самого последнего изменения в файле. Я хотел бы иметь возможность изменять эту временную метку, не undo
обращая на это внимания.
Причина, по которой я хочу закорачивать undo
здесь, связана со следующим краевым случаем, который возникает при редактировании / компиляции документов LaTeX (и, возможно, других, но это тот, который сводит меня с ума чаще всего):
- Сделайте небольшое изменение в файле, чтобы увидеть, как это повлияет на скомпилированный документ
- Сохраните файл (который обновляет отметку времени)
- Запустите
latex
файл - Решите, что изменение плохое
undo
перемены
Проблема на этапе (5) ( undo
) состоит в том, что он не отменяет изменения, сделанные на этапе (1), а скорее отменяет обновление метки времени на этапе (2). Это не будет беспокоить меня (я мог бы просто еще undo
раз), за исключением того, что оно также перемещает точку до отметки времени в верхней части файла, которая почти всегда на много-много строк от фактического существенного изменения. Это очень неприятно и полностью нарушает мою концентрацию.
Я задаю вопрос относительно файла, который я посещаю, но в целом он касается модификации буферов.
Итак: как я могу не undo
заметить конкретную модификацию буфера?
undo
отменяет оба.atomic-change-group
.with-undo-collapse
макрос, который был очень полезен: emacs.stackexchange.com/a/7560/2418Ответы:
Ответ @ stsquad вывел меня на правильный путь. В основном, шаги:
buffer-undo-list
undo
undo
и восстановитьbuffer-undo-list
Итак, вот эскиз такой функции:
Изменить: на самом деле, оказывается, что более простое решение по-прежнему просто
let
-bind,buffer-undo-list
так что изменения в теле в телеlet
get-clobreded при восстановлении исходного списка:Основным ограничением этого является то, что он работает для модификаций, которые не изменяют количество символов в буфере (например, изменяя «котята» на «щенки», но не «кошки»), потому что в остальном отмена отменяется. список теперь ссылается на неправильные точки. Следовательно, это только частичное решение .
источник
Операция отмены объединяет несколько элементов из списка отмен .
nil
Запись в списке обозначает границу между двумя группами изменений. Удаливnil
в начале списка, который автоматически вставляется циклом верхнего уровня¹, вы можете сгруппировать обновление метки времени с последним изменением буфера, которое технически не соответствует вашему запросу, но практически должно решить проблему в вашем сценарии.(Предупреждение: непроверенный, список отмен может потребовать большего массажа.)
Вы также можете по-другому поиграть со списком отмен, изменив запись позиции (целое число) для обновления метки времени.
¹ делает аналогичное удаление для групповых вставок.
self-insert-command
источник
Проблема с тем, что вы предлагаете, состоит в том, что дерево отмены - это список дельт, которые вы получаете от того, где вы находитесь, где вы хотите быть. Хотя вполне возможно отключить отслеживание отмены в буфере, я не уверен, каким будет эффект неактивной записи изменений. В настоящее время у меня есть переключатель для включения / выключения отмены в определенном буфере, поскольку нет смысла иметь информацию об отмене в растущем журнале или обновлении страницы. Однако он отменяет изменения при переключении:
buffer-disable-undo на самом деле просто устанавливает buffer-undo-list на ноль . Может быть, если вы сохраните состояние буфера-отмены-списка при переключении, вы сможете восстановить его позже?
источник