Emacs có repeat
và repeat-complex-command
, rút ra các lệnh khác nhau từ lịch sử lệnh và bị ràng buộc với các khóa khác nhau. Làm thế nào để bạn lặp lại bất kỳ lệnh cuối cùng - cho dù nó phức tạp hay không - với một phím duy nhất? Nói cách khác, một lệnh lặp lại như vậy sẽ hoạt động như thế nào repeat-complex-command
nếu lệnh cuối cùng yêu cầu đầu vào, nếu không nó sẽ hoạt động như thế nào repeat
.
EDIT : Nói cách khác, tôi đang tìm cách đọc lệnh cuối cùng, phức tạp hay không, và sau đó gọi một trong hai repeat-complex-command
hoặc repeat
trên đó, tùy theo cách nào phù hợp. Ví dụ, giả sử rằng một lệnh mới như vậy bị ràng buộc <f8>
. Sau đó:
(bắt chước
C-x M-: (repeat-complex-command)
vớiM-z (zap-to-char)
):C-u M-z a <f8> <f8>
sẽ tương đương vớiC-u M-z a C-x M-: RET C-x M-: RET
(bắt chước
C-x z (repeat)
vớiC-f (forward-char)
):C-u C-f <f8> <f8>
sẽ tương đương vớiC-u C-f C-x z z
Bây giờ, repeat-complex-command
yêu cầu bạn xác nhận biểu mẫu Lisp sẽ được thực thi. Để cho phép lặp lại một lệnh phức tạp mà không cần xác nhận, tôi đã viết một phiên bản thay thế repeat-complex-command
, được gọi repeat-complex-command-no-confirm
(xem bên dưới để thực hiện). Vấn đề là tôi không thể hiểu làm thế nào để xác định xem tôi nên gọi repeat
hay repeat-complex-command-no-confirm
khi nhấn <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")))))