Как Emacs определяет единицу работы для отмены - PullRequest
29 голосов
/ 06 июля 2011

Когда вы вводите команду C - / , Emacs отменяет часть ваших недавних изменений в буфере.Когда вы вводите C - / снова, это отменяет другой кусок работы.

Я прочитал ручную запись Emacs в Undo , но она неясна, как именноработает.В руководстве говорится «Последовательные команды вставки символов обычно группируются в одну запись отмены», но не объясняется, как оно определяет количество команд вставки символов, которые составляют группу.Число символов, которые он помещает в группу, кажется случайным.

Кто-нибудь может объяснить алгоритм, который Emacs использует для группировки символов в записи отмены?

1 Ответ

34 голосов
/ 06 июля 2011

Логика для установки границ отмены в основном в self-insert-command, которая реализована в cmds.c.Вам придется прочитать код для полной истории, но в основном:

  • Пока вы только печатаете символы, каждые 20 символов, которые вы вводите, есть граница отмены.
  • Но если вы введете другую команду редактирования (например, вы убьете слово), это приведет к немедленному добавлению границы отмены и сбросу счетчика символов.
  • Определенные «волосатые» вставки (как определено internal_self_insert) вызывает немедленное добавление границы отмены и сброс количества символов.При чтении кода это выглядит так: (1) в overwrite-mode, если вы перезаписали символ с другим, имеющим другую ширину, например, набрав текст на вкладке;(2) если введенный символ вызвал расширение аббревиатуры;(3) если введенный символ заставил auto-fill-mode вставить отступ.
  • Кроме того, любая команда редактирования, которая решит, что было бы неплохо иметь границу отмены, может запросить ее, вызвав undo-boundary.Это не приводит к сбросу счетчика символов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...