Як ви "повторюєте" зміни після "скасувати" з Emacs?


268

У цій статті йдеться про те, що "Emacs повторився, оскільки ви можете повернути напрямок під час скасування, тим самим скасовуючи скасування".

Що це означає? Як користувач може "повторно" повторюватися за допомогою Emacs?


3
Відповідь під прийнятою відповіддю говорить вам про те , як , якщо саме тому ви дивитесь на цю відповідь, то, враховуючи те, як написано, я б очікував, що більшість людей насправді шукають цього.
Аарон Холл

Я просто натискаю на пробіл, а потім скасовує пробіл та скасовує пробіл та повторює те, що ви зробили, поки він не закінчиться, а потім знову починає повертатися назад ... Я знаю, що є набагато складніші способи, але це швидко і легко, і ось так я котиться.
nroose

Відповіді:


294

Коротка версія: скасування скасування. Якщо ви скасуєте, а потім виконаєте таку команду, що не редагує, як 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. Видалити "панель"

Це додавання / повторне додавання відбувається ad infinitum. До цього потрібно трохи звикнути, але це дійсно надає Emacs надзвичайно гнучкий і потужний механізм скасування / повторення.


117
На випадок, якщо це здається прикро, головна перевага полягає в тому, що ви завжди зможете повернути попередній стан. У більшості редакторів скасування кількох змін, а потім випадкове введення символу не залишить вас "на межі", не маючи змоги повторити те, що ви скасували. Emacs робить це дрібницею.
філс

3
Я думаю, що у вашій конструкції людині хотілося зробити це на папері, вам знадобляться два стеки. Тому що, якщо, наприклад, у місці, де ви написали "Тепер, ви скасуєте. Це скасовує останню дію, в результаті чого випливає таке list: "ви (зрозуміло) не показали скасування, і якби він зробив багато скасованих, ви б не показували їх, поки щось не було зроблено для порушення послідовності скасування, тоді ви додали їх. Ще один спосіб показати, що це було б мати один список і додати undos до списку ще до того, як вони будуть розбиті потім, але зазначити, де знаходиться курсор у списку, тож ми знаємо, звідки ундос працює назад
barlop

25
Це звучить прикро.
Феліпе

13
Я не знаю, чому цю відповідь прийняли, коли вона навіть не розповідає, ЯК .
Зал Аарона

8
На жаль, ця відповідь нічого не говорить про команду повтору, яка є Cg C- /.
vishnuprasanth

211

Щоб скасувати: C-_

Щоб повторити після скасування: C-g C-_

Введіть кілька разів, C-_ щоб повторити те, що було скасовано. C-_ Щоб повторити команду emacs кілька разів, виконайте свою команду, а потім введіть C-xzта введіть багато разів zклавішу, щоб повторити команду (цікаво, коли ви хочете виконати кілька разів макрос)


4
Для повторення матеріалів ви також можете використовувати C-u, наприклад C-u 8 *(вставляє вісім *, де є каре). Таким чином, ви можете використовувати C-u x C-_для скасування кроків x .
Патрік

10
Це не має нічого спільного з оригінальним запитанням, але відразу після виконання макросу клавіатури (з C-x e) ви можете просто натискати eстільки разів, скільки потрібно, щоб виконати його ще раз.
Крістіан Берг

7
Також є C-/і C-x uальтернативні прив'язки ключів, що еквівалентно C-_. Я вважаю за краще, C-/оскільки це легше вдарити.
Rory O'Kane

8
Попередження: коли в цій відповіді сказано, що C-g C-_"повториться після скасування", це застосовується лише при першому натисканні комбінації. Після цього повторіть клавішу скасування без C-g. Отже, щоб повторити три рази відразу після скасування, наберіть C-g C-_ C-_ C-_. Якщо ви введете текст C-g C-_ C-g C-_ C-g C-_, ви просто пройдетеся по колах, відміняючи повтор скасування ...
Rory O'Kane

@ RoryO'Kane Я не знаю багато про emacs, тому, будь ласка, виправте мене, де я помиляюся, але, враховуючи, що Cg C-_ не має жодного ефекту після повтору, чи може це бути, тому що він працює лише після скасування (як, наприклад, ваш опис "повторити після скасування". Тому не так багато, що це відбувається в колі, переробляючи скасування чи повтор тощо), це не робить нічого, тому що скасування не було зроблено раніше, ніж Cg C- _ Cg C-_ не йде по колу після першого, він буквально нічого не робить
barlop

56
  • Щоб скасувати один раз: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.


38

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

Мені подобається вбудована система відміни Emacs, але вважаю цей пакет дуже інтуїтивним.

Ось коментар із самого файлу:

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

Як втрата даних зі стандартним скасуванням / повтором, так і плутанина скасування Emacs пов'язані з спробою трактувати історію скасування як лінійну послідовність змін. Це не. Режим "скасування дерева", наданий цим пакетом, замінює систему скасування Emacs системою, яка розглядає історію скасування як таку, яка вона є: гіллясте дерево змін. Ця проста ідея дозволяє інтуїтивнішу поведінку стандартної системи скасування / повторення поєднувати з силою ніколи не втрачати жодної історії. Додатковим бонусом є те, що історія скасування може в деяких випадках зберігатися ефективніше, дозволяючи накопичити більше змін до того, як Emacs почне викидати історію.


3
Фантастичний! Хто сказав, що скасувати програму Emacs було незбагненно? :-)
Пітер.O

Дивовижний! концептуально здоровий та інтуїтивно зрозумілий користувачеві. Це має бути у пакунках за замовчуванням. Один коментар: Я хотів би, щоб якесь попереджувальне повідомлення було також показане при повторному переході від точки відгалуження, а не тільки при поверненні до нього. Наприклад, коли користувач викликає повтор: "Повторення з точки відгалуження" або "Використовується за замовчуванням повторна гілка" - лише для того, щоб сповістити користувача про наявність декількох гілок.
Базель Шишані

1
Ще один підхід до цієї проблеми, який набагато простіший у реалізації та не потребує візуалізатора, - це тримати ТОЛЬКІ останню точку гілки та надавати 3 команди: скасувати, повторити, переключити гілку. Скасувати / повторити буде попереджати, коли відгалужена гілка, і перемикач-гілка буде просто перемикатися, якщо в гілці ще просто видається повідомлення "не в гілці". Якщо в будь-який час відбувається розгалуження, попередня точка гілки втрачається. Це дозволило б вирішити проблему втрат держави розумно та з мінімальною складністю.
Базель Шишані

1
Остерігайтесь, що ця помилка переростає, яка може випадково вийти з ладу: github.com/syl20bnr/spacemacs/isissue/9903 - відомо про 2014 рік
ideaman42

@ Ideman42 Мабуть, це "не-помилка": dr-qubit.org/Lost_undo-tree_history.html
Dalker

19

Остерігайтеся відкидання деревця на повтор !

Багато популярних "наборів для початківців" (прелюдія, purcell, spacemacs) в комплекті з деревом. Більшість (усі?) Навіть автовключення. Як згадувалося, скасування дерева - це зручний спосіб візуалізації та обходу дерева відміни / повтору. Прелюдія навіть надає йому акорд ( uu), а також C-x u.

Проблема полягає в тому, що скасування дерева, схоже, руйнує за замовчуванням Emacs і добре відоме прив'язку для повтору :C-g C-/ .

Натомість ви можете використовувати ці симетричні ключі для скасування / повторення :

C-/     undo
C-S-/   redo

Вони корисні, оскільки іноді потрібно швидко переробити, не відкриваючи візуалізатор.


Це. Я використовую Spacemacs і не можу зрозуміти, чому це не працює для мене. Дякую!
мгхауї

11

Я вважаю 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.


У коментарях у заголовку redo.el йдеться про те, що він зроблений для XEmacs. Чи є якісь проблеми з його використанням у GNU Emacs та інших пов'язаних Emacsen?
А. Леві

У мене ще не було жодних проблем, і я використовую це принаймні 6 місяців :)
monotux

4
Від emacswiki.org/emacs/RedoMode : Однак redo.el застарілий і часто руйнує вміст "буфера, тому що поведінка" примітивного скасування "дещо відрізняється від старої з Emacs 22. RedoPlus є вилка redo.el і правильно працює у новій версії Emacs. RedoPlus можна отримати тут: emacswiki.org/emacs/redo+.el
rofrol

2

Emacs 28 додає команду повтору (називається undo-redo).

Якщо ви хочете мати більш типові скасувати / повторити, можна використовувати наступні команди.

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

1

Якщо ви хочете повторити останню операцію, виконайте наступне.

  1. ESC
  2. Зробіть ще одне скасування ( C + /)

0

За замовчуванням повтор у програмі Emacs вимагає натискання Cg, а потім скасування.

Однак можливо використовувати вбудовану відмінку Emacs і для реалізації команди повтору.

Пакет undo-fu , використовує вбудовану функцію відміни Emacs, щоб викрити і скасувати, і повторити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.