Есть ли в Emacs (repeat-last-command)?


143

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

(Повтор последней команды)

выполнить последнюю C- или M-команду, которую я только что выполнил (чтобы вернуться к клавише fn)

или иногда связанные:

(Описывают-последний-функции)

какое нажатие клавиши я просто ошибочно произвожу, эффект от которого я хотел бы добавить к моей сумке трюков. ключ описания близок, но требует знания того, что я напечатал.

Я просто слишком много спрашиваю у моего верного помощника?


1
Cx z (repeat)и Cx Mz (repeat-complex-command). Смотрите также (repeat-matching-complex-command).
Хатшепсут

Ответы:


62

в отношении « description-last-function »:

Есть переменная, last-commandкоторая установлена ​​на символ, представляющий последнее, что вы сделали. Так что этот фрагмент elisp (describe-function last-command)- должен привести документацию для того, что произошло немедленно.

Таким образом, вы могли бы сделать тривиальную работу, describe-last-functionкак так

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

Поместите этот elisp .emacsили эквивалентный, и у вас будет Mx description -last-function .

Если вы нажали несколько клавиш или сделали что-то, что изменило последнюю команду, начиная с интересующей вас вещи, эта command-historyфункция может представлять интерес. Вы можете получить это с помощью Mx command-history


168

Функциональность повтора обеспечивается repeat.elпакетом Emacs Lisp, который включен в стандартные дистрибутивы Emacs. Из repeat.elдокументации:

Этот пакет определяет команду, которая повторяет предыдущую команду, какой бы она ни была, включая ее аргументы, какими бы они ни были. Эта команда связана с ключом Cx z. Чтобы повторить предыдущую команду один раз, введите Cx z. Чтобы повторить это второй раз сразу после, введите просто z. Набирая z снова и снова, вы можете повторять команду снова и снова.

Чтобы увидеть дополнительную информацию о команде повтора, введите C-h F repeat RETEmacs.


160

Повторите последнюю команду

C-xz

Как только вы нажали его, просто нажмите только z после этого, и он будет повторяться (без необходимости C-xповторного нажатия ).


Именно то, что я ожидал.
Васанта Ганеш К,

81

Да, есть повторная команда. Это называется repeat:

  • Вы можете повторять команды с помощью C-x zи нажимать, zчтобы продолжать повторять.

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


2
похож на Mx Mp за исключением того, что repeat-complex-command повторяет предыдущие аргументы.
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Привязки по умолчанию слишком громоздки, чтобы печатать снова и снова.
remcycles

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>, можно, вероятно, найти лучшую привязку для repeat-command. На Mac я бы предложил Command (super) -Y, поскольку в некоторых приложениях уже существует соглашение об использовании этого в противоположность «отменить».
Бригид Макдоннелл

0

Это старое, но Google выскакивает сообщение об этом первым, когда я искал последнюю команду, которую я набрал в приглашении Emacs. Ни один из этих ответов не сработал для меня, поэтому я решил внести свои два цента для тех, кто может наткнуться на это позже, как и я. Я использую Portacle, но я нашел то , что искал в здесь , так что я надеюсь , что это родовое достаточно для работы с различными установками. Во всяком случае, то, что работало для меня, использует C-↑и C-↓циклически перемещаться по истории. Использовать M-pи M-nработать так же хорошо, но я предпочитаю использовать стрелки, так как я использую Bash совсем немного.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.