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

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

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

6 ответов


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

больше вариант:

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

  1. вставить "foo"
  2. вставить "bar"
  3. вставить "я люблю спам"

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

  1. вставить "foo"
  2. вставить "bar"

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

  1. вставить "foo"
  2. вставить "bar"
  3. вставить "я люблю спам"
  4. отменить вставку "я люблю спам"

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

  1. вставить "foo"
  2. вставить "bar"
  3. вставить "я люблю спам"

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

  1. вставить "foo"
  2. вставить "bar"
  3. вставить "я люблю спам"
  4. отменить вставку "я люблю спам"
  5. удалить "bar"

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


чтобы отменить: C -_

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

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


  • до отменить после: 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 чтобы снова изменить направление. Вам придется отменить весь путь через случайные повторы и отмены, прежде чем вы доберетесь до undos вы хотите, но если вы просто продолжаете бить C-/, вы в конечном итоге достигнете состояние, которое вы хотите. Фактически, каждое состояние буфера когда-либо было доступно, если вы нажмете C-g один раз, а затем нажмите C-/ достаточно раз.

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

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


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

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

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

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

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


остерегайтесь отменить-дерево бзик на повтор!

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

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

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

C-/     undo
C-S-/   redo

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


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