Esiste un (ripeti-ultimo-comando) in Emacs?


143

Spesso ho scavato in documenti e documenti alla ricerca di qualcosa come il seguente solo per rinunciare a tornare al compito da svolgere:

(Repeat-last-comando)

esegui l'ultimo comando C o M che ho appena eseguito (per essere rebound a un tasto fn)

o talvolta il relativo:

(Descrivere-last-funzione)

quale sequenza di tasti ho appena emesso per errore, il cui effetto vorrei aggiungere alla mia borsa di trucchi. description-key è vicino, ma richiede di sapere cosa ho digitato.

Sto semplicemente chiedendo troppo al mio fidato aiutante?


1
Cx z (repeat)e Cx Mz (repeat-complex-command). Vedi anche (repeat-matching-complex-command).
Hatshepsut,

Risposte:


62

per quanto riguarda " descrivi-ultima funzione ":

C'è una variabile last-commandche è impostata su un simbolo rappresentativo dell'ultima cosa che hai fatto. Quindi questo frammento di elis - (describe-function last-command)- dovrebbe far apparire la documentazione per la cosa immediatamente accaduta.

Quindi potresti fare un lavoro banale in questo describe-last-functionmodo

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

Metti quell'elisp in .emacso equivalente, e avrai una funzione Mx descrivimi-ultima .

Se hai sbattuto su alcuni tasti o fatto qualcosa che ha modificato l'ultimo comando dal momento che ti interessa, la command-historyfunzione potrebbe essere di interesse. Puoi ottenerlo dalla cronologia dei comandi di Mx


168

La funzionalità di ripetizione è fornita dal repeat.elpacchetto Emacs Lisp, incluso nelle distribuzioni Emacs standard. Dalla repeat.eldocumentazione di:

Questo pacchetto definisce un comando che ripete il comando precedente, qualunque esso fosse, inclusi i suoi argomenti, qualunque cosa fossero. Questo comando è collegato al tasto Cx z. Per ripetere una volta il comando precedente, digitare Cx z. Per ripeterlo una seconda volta immediatamente dopo, digita solo z. Digitando ripetutamente z, è possibile ripetere più volte il comando.

Per vedere ulteriori informazioni sul comando repeat, digita C-h F repeat RETda Emacs.



81

Sì, c'è un comando di ripetizione . Si chiama repeat:

  • Puoi ripetere i comandi con C-x ze premere zper continuare a ripetere.

Un po 'scioccante che nessuno ha menzionato repeat-complex-command, disponibile dall'associazione dei tasti C-x ESC ESC.


2
simile a Mx Mp tranne per il fatto che il comando repeat-complex ripete argomenti precedenti.
Yoo

5
Anche su C-x M-:(mnemonico: come M-:ma con l'espressione elisp già compilata per te).
phils,

6
Sì, davvero scioccante . La risposta accettata non è la migliore risposta qui, IMO (ma a quanto pare l'OP ritiene che corrisponda meglio alla sua domanda). Per me, questa risposta è la più vicina a ciò che la domanda scritta ha chiesto (ripetere l'ultimo comando). E le possibilità offerte da repeat.el(quali sottotitoli C-x z z z...) sono le seconde più vicine. Scritta la seconda domanda, su quali battiture sono state premute l'ultima volta, la risposta migliore è C-h l( view-lossage). È poco utile, IMHO, per un describe-last-commandcomando.
Estratto il

È inoltre possibile utilizzare C-x M-:come parte di una macro di tastiera, che può essere utile. I repeat-complex-commandcollegamenti predefiniti sono un po 'troppo ingombranti per poter essere digitati più volte.
ricicla il

24

Inoltre, M-x view-lossagemostra le ultime cento (?) Sequenze di tasti immesse. Quindi, sarai in grado di vedere dove si trova il comando. È quello che ho usato fino a quando non ho scoperto subito con M-x command-historychi penso che userò C-h wora.


18

Non ne sono davvero sicuro, ma forse stai cercando questo?

Il comando C-xz( repeat) fornisce un altro modo per ripetere più volte un comando Emacs. Questo comando ripete il precedente comando Emacs, qualunque esso fosse. La ripetizione di un comando utilizza gli stessi argomenti utilizzati in precedenza; non legge nuovi argomenti ogni volta.

Manuale Emacs, 8.11 Ripetizione di un comando


2
e come notato da Johannes Schaub, le successive pressioni di zper sé continueranno la ripetizione.
phils,

9

Può essere che questo aiuterebbe anche ... Da emacs Aiutate letteralmente:

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

Personalmente ho trovato utile l'idea di Sebastian. Ecco una versione funzionante

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

2
Considerando che isearche isearch-backwardsono importanti comandi di navigazione, e che quest'ultimo è tenuto a <kbd> Cr </ kbd> per impostazione predefinita, si potrebbe probabilmente trovare una migliore vincolante per ripetere il comando. Su un Mac, suggerirei Command (super) -Y, poiché alcune app hanno già una convenzione di usarlo come l'opposto di "annulla".
Brighid McDonnell,

0

Questo è vecchio, ma Google pop post prima questo quando stavo cercando di recuperare l'ultimo comando che ho digitato al prompt di Emacs. Nessuna di queste risposte ha funzionato per me, così ho deciso di mettere i miei due centesimi per coloro che potrebbero inciampare su questo in seguito, come ho fatto io. Sto usando Portacle, ma ho trovato quello che cercavo qui, quindi spero che sia abbastanza generico per funzionare con diverse configurazioni. Ad ogni modo, ciò che ha funzionato per me è usare C-↑e C-↓scorrere la storia. Anche usando M-pe ha M-nfunzionato, ma preferisco usare le frecce dato che uso abbastanza Bash.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.