Emacs hat repeat
und repeat-complex-command
, die verschiedene Befehle aus dem Befehlsverlauf ziehen und an verschiedene Schlüssel gebunden sind. Wie können Sie einen letzten Befehl - ob komplex oder nicht - mit einer einzigen Taste wiederholen ? Mit anderen Worten, ein solcher sich wiederholender Befehl würde sich so verhalten, als repeat-complex-command
ob der letzte Befehl eine Eingabe erfordern würde, andernfalls würde er sich so verhalten repeat
.
EDIT : Mit anderen Worten, ich suche nach einer Möglichkeit, den letzten Befehl zu lesen, ob komplex oder nicht, und dann entweder repeat-complex-command
oder darauf aufzurufen repeat
, je nachdem, was angemessen ist. Nehmen wir zum Beispiel an, dass ein solcher neuer Befehl an gebunden ist <f8>
. Dann:
(imitiert
C-x M-: (repeat-complex-command)
mitM-z (zap-to-char)
):C-u M-z a <f8> <f8>
entspricht äquivalent zuC-u M-z a C-x M-: RET C-x M-: RET
(imitiert
C-x z (repeat)
mitC-f (forward-char)
):C-u C-f <f8> <f8>
entspricht äquivalent zuC-u C-f C-x z z
Jetzt repeat-complex-command
müssen Sie das Lisp-Formular bestätigen, das ausgeführt wird. Um das Wiederholen eines komplexen Befehls ohne Bestätigung zu ermöglichen, habe ich eine alternative Version von geschrieben repeat-complex-command
, die aufgerufen wird repeat-complex-command-no-confirm
(siehe unten für die Implementierung). Das Problem ist, dass ich nicht verstehen kann, wie ich bestimmen soll, ob ich anrufen soll repeat
oder repeat-complex-command-no-confirm
wann ich drücke <f8>
.
- -
(defun repeat-complex-command-no-confirm (arg)
"Like `repeat-complex-command' but does not require confirmation."
;; Adapted from `repeat-complex-command' of Emacs 24.5.1.
(interactive "p")
(let ((elt (nth (1- arg) command-history))
newcmd)
(if elt
(progn
(setq newcmd elt)
;; If command to be redone does not match front of history,
;; add it to the history.
(or (equal newcmd (car command-history))
(setq command-history (cons newcmd command-history)))
(unwind-protect
(progn
;; Trick called-interactively-p into thinking that `newcmd' is
;; an interactive call (bug#14136).
(add-hook 'called-interactively-p-functions
#'repeat-complex-command--called-interactively-skip)
(eval newcmd))
(remove-hook 'called-interactively-p-functions
#'repeat-complex-command--called-interactively-skip)))
(if command-history
(error "Argument %d is beyond length of command history" arg)
(error "There are no previous complex commands to repeat")))))