Emacs memiliki repeat
dan repeat-complex-command
, yang menarik perintah yang berbeda dari sejarah perintah dan terikat pada kunci yang berbeda. Bagaimana Anda mengulangi setiap perintah terakhir - apakah itu kompleks atau tidak - dengan tombol tunggal? Dengan kata lain, perintah berulang seperti itu akan berperilaku seperti repeat-complex-command
jika perintah terakhir membutuhkan input, jika tidak maka akan berperilaku seperti repeat
.
EDIT : Dengan kata lain, saya mencari cara untuk membaca perintah terakhir, kompleks atau tidak, dan kemudian memanggil salah satu repeat-complex-command
atau repeat
di atasnya, mana yang sesuai. Sebagai contoh, katakanlah bahwa perintah baru itu terikat <f8>
. Kemudian:
(meniru
C-x M-: (repeat-complex-command)
denganM-z (zap-to-char)
):C-u M-z a <f8> <f8>
akan setara denganC-u M-z a C-x M-: RET C-x M-: RET
(meniru
C-x z (repeat)
denganC-f (forward-char)
):C-u C-f <f8> <f8>
akan setara denganC-u C-f C-x z z
Sekarang, repeat-complex-command
mengharuskan Anda untuk mengkonfirmasi formulir Lisp yang akan dieksekusi. Untuk memungkinkan pengulangan perintah yang kompleks tanpa konfirmasi, saya telah menulis versi alternatif dari repeat-complex-command
, yang disebut repeat-complex-command-no-confirm
(lihat di bawah untuk implementasinya). Masalahnya adalah saya tidak mengerti bagaimana menentukan apakah saya harus menelepon repeat
atau repeat-complex-command-no-confirm
ketika menekan <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")))))