Как вы «повторяете» изменения после «отмены» с Emacs? - PullRequest
254 голосов
/ 20 августа 2010

В этой статье говорится, что "Emacs имеет повтор, потому что вы можете изменить направление при отмене, тем самым отменяя отмену".

Что это значит? Как пользователь может «повторить» с Emacs?

Ответы [ 7 ]

279 голосов
/ 20 августа 2010

Короткая версия: отменив отмену. Если вы отмените и затем выполните команду без редактирования, такую ​​как C-f , то следующая отмена отменит отмену, что приведет к повторению.

Более длинная версия:

Вы можете думать об отмене как о работе со стеком операций. Если вы выполняете какую-либо команду (даже команду навигации, такую ​​как C-f ) после последовательности операций отмены, все отмены помещаются в стек операций. Поэтому следующая отмена отменяет последнюю команду. Предположим, у вас есть последовательность операций, которая выглядит следующим образом:

  1. Вставить "foo"
  2. Вставить "бар"
  3. Вставить "Я люблю спам"

Теперь вы отменяете. Это отменяет последнее действие, приводя к следующему списку:

  1. Вставить "foo"
  2. Вставить "бар"

Если в этот момент вы делаете что-то, кроме отмены - скажем, C-f , стек операций выглядит следующим образом:

  1. Вставить "foo"
  2. Вставить "бар"
  3. Вставить "Я люблю спам"
  4. Отменить вставку "Я люблю спам"

Теперь, когда вы отменяете, первое, что отменено - это отмена. Получив исходную стопку (и состояние документа):

  1. Вставить "foo"
  2. Вставить "бар"
  3. Вставить "Я люблю спам"

Если вы выполняете команду изменения, чтобы разорвать последовательность отмен, эта команда добавляется после отмены и, таким образом, является первым, что впоследствии будет отменено. Предположим, вы отступили над «баром», а не нажали C-f . Тогда вы бы имели

  1. Вставить "foo"
  2. Вставить "бар"
  3. Вставить "Я люблю спам"
  4. Отменить вставку "Я люблю спам"
  5. Удалить "бар"

Это добавление / повторное добавление происходит до бесконечности. Требуется немного привыкнуть, но это действительно дает Emacs очень гибкий и мощный механизм отмены / повторения.

202 голосов
/ 20 августа 2010

Отменить: C-_

Повторить после отмены: C-g C-_

Введите несколько раз на C-_ , чтобы восстановить то, что было отменено с помощью C-_ Чтобы повторить команду emacs несколько раз, выполните свою команду, затем введите Cx z , а затем много раз введите клавишу z , чтобы повторить команду (интересно, когда вы хотите выполнить несколько раз макрос)

46 голосов
/ 22 августа 2013
  • К отменить один раз: C-/
  • Чтобы отменить дважды: C-/ C-/
  • К повторить один раз, сразу после удаления: C-g C-/
  • Повторить дважды, сразу после удаления: C-g C-/ C-/. Обратите внимание, что C-g не повторяется.
  • до отменить немедленно снова , один раз: C-g C-/
  • Чтобы отменить немедленно снова, дважды: C-g C-/ C-/
  • К повторить снова , то же самое ...

Если вы нажали какие-либо клавиши (ввод символов или просто перемещение курсора) со времени вашей последней команды отмены, нет необходимости вводить C-g перед следующей отменой / повтором. C-g - это просто безопасный ключ для нажатия, который ничего не делает сам по себе, но считается как не отмененный ключ, сигнализирующий об окончании последовательности отмены. Нажатие другой команды, такой как C-f, также будет работать; просто он будет перемещать курсор от того места, где он у вас был.

Если вы нажали C-g или другую команду, когда не хотели, и теперь вы отменяете в неправильном направлении, просто нажмите C-g, чтобы снова изменить свое направление. Вам придется полностью отменить все случайные повторы и отмены, прежде чем вы доберетесь до отмены, которую хотите, но если вы просто продолжите нажимать C-/, вы в конечном итоге достигнете желаемого состояния. Фактически, каждое состояние, в котором когда-либо находился буфер, достижимо, если вы нажмете C-g один раз, а затем нажмете C-/ достаточно раз.

Альтернативными сочетаниями клавиш для undo, отличными от C-/, являются C-_, C-x u и M-x undo.

См. Отменить в Руководстве по Emacs для более подробной информации о системе отмены Emacs.

37 голосов
/ 20 августа 2010

Для тех, кто хочет иметь более общие функции отмены / возврата, кто-то написал undo-tree.el.Он обеспечивает внешний вид отмены, не связанной с Emacs, но обеспечивает доступ ко всему «дереву» истории отмен.

Мне нравится встроенная система отмены Emacs, но я нахожу этот пакет очень интуитивным.

Вот комментарий из самого файла:

В Emacs есть мощная система отмены действий.В отличие от стандартной системы отмены / возврата в большинстве программ, она позволяет восстановить любое прошлое состояние буфера (тогда как стандартная система отмены / возврата может потерять прошлые состояния, как только вы выполните повтор).Однако эта сила имеет свою цену: многие люди находят систему отмены Emacs запутанной и трудной в использовании, порождая множество пакетов, которые заменяют ее менее мощной, но более интуитивной системой отмены / возврата.

* 1014потеря данных со стандартными отменами / повторами и путаница отмены Emacs проистекают из попытки трактовать историю отмен как линейную последовательность изменений.Это не.`Режим отмены дерева ', предоставляемый этим пакетом, заменяет систему отмены Emacs системой, которая обрабатывает историю отмен как то, что она есть: ветвящееся дерево изменений.Эта простая идея позволяет сочетать более интуитивное поведение стандартной системы отмены / возврата с возможностью никогда не потерять историю.Дополнительным дополнительным бонусом является то, что в некоторых случаях история отмен может быть сохранена более эффективно, что позволяет накопить больше изменений, прежде чем Emacs начнет отбрасывать историю.
15 голосов
/ 14 марта 2016

Остерегайтесь отменить дерево Причуда для повторить !

Многие популярные «стартовые наборы» (prelude, purcell, spacemacs) поставляются в комплекте с деревом отмены действий. Большинство (все?) Даже автоматически включают его. Как уже упоминалось, отмена дерева является удобным способом визуализации и обхода дерева отмены / повтора. Прелюдия даже дает ему клавишный аккорд (uu), а также C-x u.

Проблема в том, что кажется, что отмена дерева разрушает стандартную привязку Emacs для redo : C-g C-/.

Вместо этого вы можете использовать эти симметричные клавиши для отмены / повтора :

C-/     undo
C-S-/   redo

Они полезны, поскольку иногда вы хотите быстро повторить , не открывая визуализатор.

10 голосов
/ 20 августа 2010

Я нахожу redo.el чрезвычайно удобным для выполнения "обычной" отмены / повтора, и я обычно привязываю его к CSz и отмену к Cz, например:

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

Простоскачайте файл, поместите его в свой lisp-путь и вставьте вышеперечисленное в ваш .emacs.

0 голосов
/ 13 апреля 2019

Если вы хотите отменить последнюю операцию, выполните следующие действия.

  1. ESC
  2. Сделать еще одну отмену (C + /)
...