Как «повторить» изменения после «отмены» с Emacs?

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

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

259
задан phils 19 February 2012 в 14:56
поделиться

4 ответа

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

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

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

  1. Вставить "foo"
  2. Вставить "bar"
  3. Вставить "I love spam"

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

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

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

  1. Вставить "foo"
  2. Вставить "bar"
  3. Вставить "I love spam"
  4. Отменить вставку "I love spam"

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

  1. Вставить "foo"
  2. Вставить "bar"
  3. Вставить "I love spam"

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

  1. Вставить "foo"
  2. Вставить "bar"
  3. Вставить "I love spam"
  4. Отменить вставку "I love spam"
  5. Удалить "bar"

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

284
ответ дан 23 November 2019 в 02:39
поделиться

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

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

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

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

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

38
ответ дан 23 November 2019 в 02:39
поделиться

Я нахожу 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.

11
ответ дан 23 November 2019 в 02:39
поделиться

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

Для повтора после отмены: C-g C-_

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

202
ответ дан 23 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: