Чи є в Emacs (повторення-остання команда)?


143

Часто я заглиблююсь у підходи та документи, шукаючи щось подібне лише для того, щоб відмовитись, щоб повернутися до завдання, що знаходиться під рукою:

(повторити-остання команда)

виконайте останню команду C- або M-, яку я щойно виконав (щоб відскочити на клавішу fn)

або іноді пов'язані:

(опис-остання функція)

який натискання клавіші я просто помилково видав, ефект якого я хотів би додати до мішка хитрощів. ключ-опис близький, але вимагає знати, що я набрав.

Я просто прошу занадто багато від свого довірливого напарника?


1
Cx z (repeat)і Cx Mz (repeat-complex-command). Дивіться також (repeat-matching-complex-command).
Хатшепсут

Відповіді:


62

стосовно " опису-останньої функції ":

Існує змінна, last-commandяка встановлюється символом, що репрезентує останнє, що ви зробили. Отже, цей фрагмент Elisp - (describe-function last-command)- повинен створити документацію на те, що негайно сталося.

Таким чином , ви могли б зробити тривіальну роботу describe-last-functionяк так

(defun describe-last-function() 
  (interactive) 
  (describe-function last-command))

Покладіть цей елісп .emacsабо еквівалент, і ви будете мати функцію опису-останнього Mx .

Якщо ви натиснули на кілька клавіш або зробили щось, що змінило останню команду з моменту, що вас цікавить, ця command-historyфункція може зацікавити. Ви можете отримати це за допомогою Mx-історії команд


168

Функціонал повторень забезпечується repeat.elпакетом Emacs Lisp, який входить до стандартних дистрибутивів Emacs. З repeat.elросійської документації:

Цей пакет визначає команду, яка повторює попередню команду, що б там не було, включаючи її аргументи, якими б вони не були. Ця команда підключена до ключа Cx z. Щоб повторити попередню команду один раз, введіть Cx z. Щоб повторити це вдруге одразу після, наберіть просто z. Вводячи z знову і знову, ви можете повторювати команду знову і знову.

Щоб побачити додаткову інформацію про команду повтору, введіть C-h F repeat RETв межах Emacs.



81

Так, є команда повторення . Це називається repeat:

  • Ви можете повторювати команди з C-x z, і натискайте, zщоб продовжувати повторюватися.

Трохи шокуюче ніхто не згадував repeat-complex-command, доступний із прив'язки ключів C-x ESC ESC.


2
аналогічно Mx Mp, за винятком того, що команда "повтор-комплекс" повторює попередні аргументи.
Yoo

5
Також на C-x M-:(мнемонічне: на кшталт, M-:але з виразом elisp вже заповнений для вас).
філ

6
Так, насправді шокуюче . Тут прийнята відповідь не найкраща відповідь, ІМО (але ОП, мабуть, вважає, що вона найкраще відповідає її питанню). Мені ця відповідь найбільш близька до того, про що писали запитання (повторити останню команду). А можливості, що пропонуються repeat.el(які C-x z z z...надходять), є другими найближчими. Розмістіть друге запитання, про те, які натискання клавіш були останніми, найкраща відповідь - C-h l( view-lossage). ІМХО мало користі для describe-last-commandкоманди.
Дрю

Ви також можете використовувати C-x M-:як частину макросу клавіатури, що може бути зручно. repeat-complex-commandПрив’язки за замовчуванням трохи занадто громіздкі, щоб набирати знову і знову.
рецикли

24

Також M-x view-lossageпоказує вам останні сто (?) Клавіш, які ви ввели. Отже, ви зможете побачити, де знаходиться команда. Це те, чим я користувався, поки я просто зараз не дізнався, про M-x command-historyщо я думаю, що зараз буду використовувати C-h w.


18

Я не дуже впевнений, але, можливо, ви шукаєте саме цього?

Команда C-xz( repeat) забезпечує ще один спосіб повторити команду Emacs багато разів. Ця команда повторює попередню команду Emacs, що б там не було. При повторенні команди використовуються ті ж аргументи, що і раніше; вона не читає нових аргументів кожен раз.

Посібник Emacs, 8.11 Повторення команди


2
і, як зазначає Йоханнес Шауб, наступні натискання тільки zсамостійно продовжать повторення.
філс

9

Можливо, це теж допоможе ... Від emacs Довідка дослівно:

C-x M-ESC runs the command repeat-complex-command
  which is an interactive compiled Lisp function in `simple.el'.
It is bound to <again>, <redo>, C-x M-:, C-x M-ESC.
(repeat-complex-command ARG)

Edit and re-evaluate last complex command, or ARGth from last.
A complex command is one which used the minibuffer.
The command is placed in the minibuffer as a Lisp form for editing.
The result is executed, repeating the command as changed.
If the command has been changed or is not the most recent previous command
it is added to the front of the command history.
You can use the minibuffer history commands M-n and M-p
to get different commands to edit and resubmit.

4

Особисто я вважав ідею Себастьяна корисною. Ось робоча версія

(global-set-key "\C-r" #'(lambda () (interactive)
                                 (eval (car command-history))))

2
З огляду на , що isearchі isearch-backwardважливі навігаційні команди, і що останній зобов'язаний <KBD> Cr </ KBD> за замовчуванням, можна , ймовірно , знайти більш обов'язковими для повторення-команди. На Mac я б запропонував Command (super) -Y, оскільки деякі програми вже мають угоду використовувати це як протилежне "скасувати".
Брігід МакДоннелл

0

Це старе, але Google pops публікує це першим, коли я шукав отримати останню команду, яку я набрав у вікні Emacs. Жоден із цих відповідей не працював для мене, тому я вирішив покласти два центи для тих, хто може натрапити на це пізніше, як я. Я використовую Portacle, але я знайшов те , що шукав в тут , так що я сподіваюся , що це родове досить для роботи з різними установками. У будь-якому випадку, те, що для мене працювало, використовує C-↑і C-↓прокручувати історію. Використовував M-pі M-nпрацював так само, але я вважаю за краще використовувати стрілки, оскільки я використовую Bash зовсім небагато.

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