Emacsにはとがrepeat
ありrepeat-complex-command
、コマンド履歴からさまざまなコマンドを描画し、さまざまなキーにバインドされています。単一のキーで、最後のコマンドを(複雑であるかどうかにかかわらず)どのように繰り返しますか?つまり、このような繰り返しコマンドはrepeat-complex-command
、最後のコマンドが入力を必要とする場合と同様に動作し、それ以外の場合はと同様に動作しますrepeat
。
EDIT:つまり、私は複雑かどうか最後のコマンドを、読むための方法を探していますし、その後のいずれかを呼び出すrepeat-complex-command
かrepeat
適切な方、それに。たとえば、そのような新しいコマンドがにバインドされて<f8>
いるとしましょう。次に:
(と模倣
C-x M-: (repeat-complex-command)
するM-z (zap-to-char)
):C-u M-z a <f8> <f8>
と同等になりますC-u M-z a C-x M-: RET C-x M-: RET
(と模倣
C-x z (repeat)
するC-f (forward-char)
):C-u C-f <f8> <f8>
と同等になりますC-u C-f C-x z z
ここで、repeat-complex-command
実行されるLispフォームを確認する必要があります。確認なしで複雑なコマンドを繰り返すことを可能にするためにrepeat-complex-command
、と呼ばれるの代替バージョンを作成しましたrepeat-complex-command-no-confirm
(実装については以下を参照)。問題は、を押すrepeat
かrepeat-complex-command-no-confirm
、を押すかを判断する方法が理解できないこと<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")))))