У цій статті йдеться про те, що "Emacs повторився, оскільки ви можете повернути напрямок під час скасування, тим самим скасовуючи скасування".
Що це означає? Як користувач може "повторно" повторюватися за допомогою Emacs?
У цій статті йдеться про те, що "Emacs повторився, оскільки ви можете повернути напрямок під час скасування, тим самим скасовуючи скасування".
Що це означає? Як користувач може "повторно" повторюватися за допомогою Emacs?
Відповіді:
Коротка версія: скасування скасування. Якщо ви скасуєте, а потім виконаєте таку команду, що не редагує, як C-f, то наступне скасування скасує скасування, що призведе до повтору.
Більш дрібна версія:
Ви можете вважати скасування скасування як операцію над стеком операцій. Якщо ви виконаєте якусь команду (навіть таку команду навігації, як C-f) після послідовності скасування операцій, всі скасування будуть перенесені на стек операцій. Отже, наступне скасування скасовує останню команду. Припустимо, у вас є послідовність операцій, яка виглядає приблизно так:
Тепер ви скасуєте. Він скасовує останню дію, в результаті чого з'являється такий список:
Якщо ви робите щось, окрім скасування цього пункту - скажімо, C-fстек операцій виглядає приблизно так:
Тепер, коли ви скасуєте, перше, що скасовано, - це скасування. Отриманий вихідний стек (і стан документа):
Якщо ви виконайте команду модифікації, щоб порушити послідовність скасування, ця команда буде додана після скасування і, таким чином, це перше, що слід скасувати після цього. Припустимо, ви відступили на "бар", а не натискаючи C-f. Тоді ви мали б
Це додавання / повторне додавання відбувається ad infinitum. До цього потрібно трохи звикнути, але це дійсно надає Emacs надзвичайно гнучкий і потужний механізм скасування / повторення.
Щоб скасувати: C-_
Щоб повторити після скасування: C-g C-_
Введіть кілька разів, C-_ щоб повторити те, що було скасовано. C-_ Щоб повторити команду emacs кілька разів, виконайте свою команду, а потім введіть C-xzта введіть багато разів zклавішу, щоб повторити команду (цікаво, коли ви хочете виконати кілька разів макрос)
C-u
, наприклад C-u 8 *
(вставляє вісім *, де є каре). Таким чином, ви можете використовувати C-u x C-_
для скасування кроків x .
C-x e
) ви можете просто натискати e
стільки разів, скільки потрібно, щоб виконати його ще раз.
C-/
і C-x u
альтернативні прив'язки ключів, що еквівалентно C-_
. Я вважаю за краще, C-/
оскільки це легше вдарити.
C-g C-_
"повториться після скасування", це застосовується лише при першому натисканні комбінації. Після цього повторіть клавішу скасування без C-g
. Отже, щоб повторити три рази відразу після скасування, наберіть C-g C-_ C-_ C-_
. Якщо ви введете текст C-g C-_ C-g C-_ C-g C-_
, ви просто пройдетеся по колах, відміняючи повтор скасування ...
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.
Для тих, хто хоче мати більш поширені функції скасування / повторення, хтось написав undo-tree.el
. Він надає зовнішній вигляд скасування не Emacs, але забезпечує доступ до всього "дерева" історії скасування.
Мені подобається вбудована система відміни Emacs, але вважаю цей пакет дуже інтуїтивним.
Ось коментар із самого файлу:
Emacs має потужну систему скасування. На відміну від стандартної системи скасування / повторення у більшості програмного забезпечення, вона дозволяє відновити будь-яке минулий стан буфера (тоді як стандартна система скасування / повторення може втратити минулі стани, як тільки ви повторно). Однак ця потужність виходить ціною: багато людей вважають систему скасування Emacs заплутаною та складною у використанні, породивши ряд пакетів, які замінюють її на менш потужну, але більш інтуїтивну систему скасування / повторення.
Як втрата даних зі стандартним скасуванням / повтором, так і плутанина скасування Emacs пов'язані з спробою трактувати історію скасування як лінійну послідовність змін. Це не. Режим "скасування дерева", наданий цим пакетом, замінює систему скасування Emacs системою, яка розглядає історію скасування як таку, яка вона є: гіллясте дерево змін. Ця проста ідея дозволяє інтуїтивнішу поведінку стандартної системи скасування / повторення поєднувати з силою ніколи не втрачати жодної історії. Додатковим бонусом є те, що історія скасування може в деяких випадках зберігатися ефективніше, дозволяючи накопичити більше змін до того, як Emacs почне викидати історію.
Остерігайтеся відкидання деревця на повтор !
Багато популярних "наборів для початківців" (прелюдія, purcell, spacemacs) в комплекті з деревом. Більшість (усі?) Навіть автовключення. Як згадувалося, скасування дерева - це зручний спосіб візуалізації та обходу дерева відміни / повтору. Прелюдія навіть надає йому акорд ( uu
), а також C-x u
.
Проблема полягає в тому, що скасування дерева, схоже, руйнує за замовчуванням Emacs і добре відоме прив'язку для повтору :C-g C-/
.
Натомість ви можете використовувати ці симетричні ключі для скасування / повторення :
C-/ undo
C-S-/ redo
Вони корисні, оскільки іноді потрібно швидко переробити, не відкриваючи візуалізатор.
Я вважаю 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
.
Якщо ви хочете повторити останню операцію, виконайте наступне.
ESC
C + /
)