Как вы "переделаете" изменения после "отмены" с помощью Emacs?

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

Что это значит? Как пользователь может "переделать" с помощью Emacs?

Ответ 1

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

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

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

  • Вставить "foo"
  • Вставить "bar"
  • Вставить "Я люблю спам"

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

  • Вставить "foo"
  • Вставить "bar"

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

  • Вставить "foo"
  • Вставить "bar"
  • Вставить "Я люблю спам"
  • Отменить вставку "Я люблю спам"

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

  • Вставить "foo"
  • Вставить "bar"
  • Вставить "Я люблю спам"

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

  • Вставить "foo"
  • Вставить "bar"
  • Вставить "Я люблю спам"
  • Отменить вставку "Я люблю спам"
  • Удалить "bar"

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

Ответ 2

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

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

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

Ответ 3

  • В отменить один раз: 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-/ достаточно времени.

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

Подробнее о системе устранения Emacss см. Undo в руководстве Emacs.

Ответ 4

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

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

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

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

Обе потери данных со стандартными отменить/повторить, и путаница Emacs ' отменить, от попыток лечения отменить история как линейная последовательность изменения. Не это. `undo-tree-mode ', обеспечиваемый этим пакет заменяет систему отмены Emacs с системой, которая обрабатывает историю отмены как это: ветвящееся дерево изменения. Эта простая идея позволяет более интуитивное поведение стандартная система отмены/повтора в сочетании с силой никогда теряя всякую историю. Добавленная сторона бонус - это то, что история отмены может в некоторых случаи хранятся более эффективно, позволяя больше изменений накапливать перед тем, как Emacs начнет отбрасывать история.

Ответ 5

Остерегайтесь undo-tree quirk для повтора!

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

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

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

C-/     undo
C-S-/   redo

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

Ответ 6

Я нахожу 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 -path и вставьте выше в свой .emacs.

Ответ 7

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

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