Gibt es in Emacs einen (Repeat-Last-Command)?

143

Häufig habe ich mich in apropos und docs umgesehen und nach etwas wie dem Folgenden gesucht, nur um aufzugeben, um zur eigentlichen Aufgabe zurückzukehren:

(Befehl zum Wiederholen des letzten Befehls)

Führen Sie den letzten C- oder M-Befehl aus, den ich gerade ausgeführt habe (um auf eine fn-Taste zurückgebunden zu werden).

oder manchmal die verwandten:

(letzte Funktion beschreiben)

Welchen Tastenanschlag habe ich fälschlicherweise ausgegeben, dessen Wirkung ich meiner Trickkiste hinzufügen möchte. Der Beschreibungsschlüssel ist nah, erfordert jedoch das Wissen, was ich eingegeben habe.

Frage ich einfach zu viel von meinem treuen Kumpel?

ack
quelle
1
Cx z (repeat)und Cx Mz (repeat-complex-command). Siehe auch (repeat-matching-complex-command).
Hatschepsut

Antworten:

62

in Bezug auf ' beschreiben-letzte-Funktion ':

Es gibt eine Variable, last-commanddie auf ein Symbol gesetzt ist, das für das steht, was Sie zuletzt getan haben. Also sollte dieses Elisp-Snippet - (describe-function last-command)- die Dokumentation für das, was sofort passiert ist, aufrufen .

So haben Sie eine triviale Arbeits machen könnte describe-last-functionwie so

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

Wenn Sie dieses Elisp .emacsoder ein gleichwertiges Element eingeben , erhalten Sie eine Mx-Funktion zum Beschreiben der letzten Funktion .

Wenn Sie ein paar Tasten gedrückt oder etwas getan haben, das den letzten Befehl seit dem, woran Sie interessiert sind, geändert hat, ist die command-historyFunktion möglicherweise von Interesse. Sie können dies durch Mx-Befehlsverlauf erhalten

cms
quelle
168

Die Wiederholungsfunktionalität bietet das repeat.elEmacs Lisp-Paket, das in Standard-Emacs-Distributionen enthalten ist. Aus repeat.elder Dokumentation:

Dieses Paket definiert einen Befehl, der den vorhergehenden Befehl wiederholt, unabhängig davon, was dies war, einschließlich seiner Argumente, unabhängig davon, was sie waren. Dieser Befehl ist mit der Taste Cx z verbunden. Um den vorherigen Befehl einmal zu wiederholen, geben Sie Cx z ein. Um es unmittelbar danach ein zweites Mal zu wiederholen, geben Sie einfach z ein. Wenn Sie immer wieder z eingeben, können Sie den Befehl immer wieder wiederholen.

Geben Sie C-h F repeat RETin Emacs ein, um zusätzliche Informationen zum Wiederholungsbefehl anzuzeigen.

Emerick Rogul
quelle
160

Wiederholen Sie den letzten Befehl

C-xz

Sobald Sie es gedrückt haben, drücken Sie einfach z danach und es wird wiederholt (ohne C-xerneut drücken zu müssen).

Johannes Schaub - litb
quelle
Genau das, was ich erwartet hatte.
Vasantha Ganesh K
81

Ja, es gibt einen Wiederholungsbefehl . Es heißt repeat:

  • Sie können Befehle mit wiederholen C-x zund drücken z, um die Wiederholung fortzusetzen.

Ein bisschen schockierend, niemand erwähnt repeat-complex-command, erhältlich über die Schlüsselbindung C-x ESC ESC.

Ashawley
quelle
2
ähnlich wie Mx Mp, außer dass der Befehl repeat-complex-previous vorherige Argumente wiederholt.
Yoo
5
Auch auf C-x M-:(Mnemonik: wie, M-:aber mit dem für Sie bereits ausgefüllten Elisp-Ausdruck).
Phils
6
Ja, in der Tat schockierend . Die akzeptierte Antwort ist hier nicht die beste Antwort, IMO (aber das OP glaubt anscheinend, dass sie ihrer Frage am besten entspricht). Für mich kommt diese Antwort der schriftlichen Frage am nächsten (letzter Befehl wiederholen). Und die Möglichkeiten, die von repeat.el(welche subsumiert C-x z z z...) geboten werden, sind die zweitnächsten. Bei der zweiten Frage, welche Tastenanschläge zuletzt gedrückt wurden, lautet die beste Antwort C-h l( view-lossage). Ein describe-last-commandBefehl nützt wenig, IMHO .
Drew
Sie können es auch C-x M-:als Teil eines Tastaturmakros verwenden, was praktisch sein kann. Die Standardbindungen repeat-complex-commandsind etwas zu umständlich, um sie immer wieder einzugeben.
Remcycles
24

Außerdem M-x view-lossagezeigt Ihnen die letzten hundert (?) Tastatureingaben Sie eingegeben haben . So können Sie sehen, wo sich der Befehl befindet. Es ist das, was ich verwendet habe, bis ich gerade herausgefunden habe, mit M-x command-historywelchem ​​ich es C-h wjetzt verwenden werde.

Quodlibetor
quelle
18

Ich bin mir nicht sicher, aber vielleicht suchen Sie nach diesem?

Der Befehl C-xz( repeat) bietet eine weitere Möglichkeit, einen Emacs-Befehl viele Male zu wiederholen. Dieser Befehl wiederholt den vorherigen Emacs-Befehl, was auch immer das war. Das Wiederholen eines Befehls verwendet dieselben Argumente wie zuvor. Es werden nicht jedes Mal neue Argumente gelesen.

Emacs-Handbuch, 8.11 Wiederholen eines Befehls

Echox
quelle
2
und wie von Johannes Schaub bemerkt, werden nachfolgende Pressen von allein zdie Wiederholung fortsetzen.
Phils
9

Vielleicht würde das auch helfen ... Von emacs Hilfe wörtlich:

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.
Murali VP
quelle
4

Persönlich fand ich Sebastians Idee nützlich. Hier ist eine Arbeitsversion

(global-set-key "\C-r" #'(lambda () (interactive)
                                 (eval (car command-history))))
Sabof
quelle
2
Wenn man bedenkt, dass isearchund isearch-backwardwichtige Navigationsbefehle sind und dass letzterer standardmäßig an <kbd> Cr </ kbd> gebunden ist, könnte man wahrscheinlich eine bessere Bindung für Wiederholungsbefehle finden. Auf einem Mac würde ich Command (super) -Y vorschlagen, da einige Apps bereits die Konvention haben, dies als das Gegenteil von "Rückgängig" zu verwenden.
Brighid McDonnell
0

Dies ist alt, aber Google veröffentlicht dies zuerst, als ich den letzten Befehl abrufen wollte, den ich an der Emacs-Eingabeaufforderung eingegeben habe. Keine dieser Antworten hat bei mir funktioniert, deshalb habe ich beschlossen, meine zwei Cent für diejenigen einzusetzen, die später wie ich darauf stoßen könnten. Ich verwende Portacle, aber ich fand , was ich in gesucht hier so ist es allgemein genug , um die Arbeit mit verschiedenen Setups Ich hoffe. Wie auch immer, was für mich funktioniert hat, ist die Geschichte zu nutzen C-↑und durch sie C-↓zu radeln. Verwenden M-pund M-nfunktionierte auch, aber ich bevorzuge die Pfeile, da ich Bash ziemlich oft benutze.

Doug F.
quelle