В этой статье говорится, что «Emacs выполняет повтор, потому что вы можете изменить направление при отмене, тем самым отменяя отмену».
Что это значит? Как пользователь может «повторить» с Emacs?
Краткая версия: путем отмены отмены. Если вы отмените отмену, а затем выполните команду без редактирования, например C-f, то следующая отмена отменит отмену, в результате чего произойдет повторная отмена.
Более длинная версия:
Вы можете думать об отмене как о работе со стеком операций. Если вы выполните какую-либо команду (даже навигационную, например C-f) после последовательности операций отмены, все отмены будут перенесены в стек операций. Таким образом, следующая отмена отменяет последнюю команду. Предположим, что у вас есть последовательность операций, которая выглядит так:
Теперь вы отменяете. Он отменяет последнее действие, в результате чего получается следующий список:
Если в этот момент вы сделаете что-то еще, кроме отмены - скажем, C-f, стек операций будет выглядеть так:
Теперь, когда вы отменяете, первым отменяется отмена. В результате ваш исходный стек (и состояние документа):
Если вы выполните изменяющую команду, чтобы нарушить последовательность отмены, эта команда будет добавлена после отмены и, таким образом, будет отменена первой. Предположим, вы сделали обратный пробел над "bar" вместо того, чтобы нажать C-f. Тогда у вас было бы
Это добавление/передобавление происходит бесконечно. К этому нужно немного привыкнуть, но это действительно дает Emacs очень гибкий и мощный механизм отмены/повтора.
Для тех, кто хочет иметь более общие функции отмены / повтора, кто-то написал undo-tree.el
. Он обеспечивает внешний вид отмены, отличной от Emacs, но обеспечивает доступ ко всему «дереву» истории отмены.
Мне нравится встроенная в Emacs система отмены, но этот пакет мне кажется очень интуитивно понятным.
Вот комментарий из самого файла:
Emacs имеет мощную систему отмены. В отличие от стандартной системы отмены / повтора в большинстве программ это позволяет восстановить любое прошлое состояние буфера (тогда как стандартная система отмены / повтора можете потерять прошлые состояния, как только вы повторить). Однако эта сила приходит цена: многие люди находят отмену Emacs система запутанная и сложная в использовании, порождение ряда пакетов, которые замените его менее мощным, но более интуитивно понятная система отмены / повтора.
Как потеря данных со стандартным undo / redo, и путаница Emacs ' отменить, происходит из-за попытки лечения отменить история как линейная последовательность изменения. Это не. В `undo-tree-mode ', предоставляемый этим пакет заменяет систему отмены Emacs с системой, которая обрабатывает историю отмен как то, что это: ветвящееся дерево изменения. Эта простая идея позволяет более интуитивное поведение стандартная система отмены / повтора должна быть в сочетании с силой никогда потерять любую историю.Добавленная сторона бонус в том, что история отмены может в некоторых дела хранятся более эффективно, позволяя большему количеству изменений накапливаться до того, как Emacs начнет отбрасывать история.
Я нахожу redo.el
чрезвычайно удобным для выполнения "нормального" отмены/повтора, и я обычно привязываю его к C-S-z и отмену к C-z, вот так:
(when (require 'redo nil 'noerror)
(global-set-key (kbd "C-S-z") 'redo))
(global-set-key (kbd "C-z") 'undo)
Просто скачайте этот файл, положите его в lisp-path и вставьте вышеуказанное в .emacs
.
Чтобы отменить: C-_
Для повтора после отмены: C-g C-_
Введите несколько раз C-_ , чтобы повторить то, что было отменено C-_ Чтобы повторить команду emacs несколько раз, выполните команду, затем наберите C-xz и затем много раз наберите z для повторения команды (интересно, когда вы хотите выполнить несколько раз макрос)