假设我定义了以下快捷方式
(global-set-key (kbd "C-d C-j") "Hello!")
是否可以配置emacs,这样如果我输入"C-d C-j C-j C-j"
,我会得到“你好!你好!你好!”而不必键入"C-d C-j C-d C-j C-d C-j"
?
答案 0 :(得分:11)
我认为您不能配置Emacs以便它为所有命令执行此操作。但是,您可以在命令本身中实现此功能。这是为 C-x e 所做的。 这是我刚刚编写的一个宏(由GNU Emacs 23.1.1中kmacro-call-macro
的标准定义指导),可以很容易地将此功能添加到您自己的命令中:< /强>
(defmacro with-easy-repeat (&rest body)
"Execute BODY and repeat while the user presses the last key."
(declare (indent 0))
`(let* ((repeat-key (and (> (length (this-single-command-keys)) 1)
last-input-event))
(repeat-key-str (format-kbd-macro (vector repeat-key) nil)))
,@body
(while repeat-key
(message "(Type %s to repeat)" repeat-key-str)
(let ((event (read-event)))
(clear-this-command-keys t)
(if (equal event repeat-key)
(progn ,@body
(setq last-input-event nil))
(setq repeat-key nil)
(push last-input-event unread-command-events))))))
以下是您使用它的方式:
(defun hello-world ()
(interactive)
(with-easy-repeat
(insert "Hello, World!\n")))
(global-set-key (kbd "C-c x y z") 'hello-world)
现在您可以键入 C-c x y z z z 以插入Hello, World!
三次。
答案 1 :(得分:4)
如果您正在寻找适用于所有命令的通用名称,我无法看到它是如何工作的 - 如果您正在开始新命令或想要重复之前的命令,emacs将如何知道。一个更好的例子是“C-c h”,如果你之后键入“h”,emacs会重复命令还是插入一个h?
也就是说,emacs已经有了这种机制 - 通用论证。
尝试以下密钥序列:
C-u 3 C-d C-j
它比C-d C-j C-j C-j C-j更少的按键
答案 2 :(得分:2)
尝试这样的事情:
(global-set-key (kbd "C-c C-j") (lambda()
(interactive)
(insert "Hello!")
(message "Type j to print Hello!")
(while (equal (read-event) ?j)
(insert "Hello!"))
(push last-input-event unread-command-events)))
来自kmacro-call-macro
答案 3 :(得分:1)
没有。 序列“ctrl-d ctrl-j”是绑定到字符串“Hello!”的内容。 Emacs将序列作为一个整体绑定到给定的字符串。以下是关于该主题的一些好消息:
http://xahlee.org/emacs/keyboard_shortcuts.html
另一方面,如果您想要只有三个“Hello!”实例,那么可以将该序列C-d C-j C-d C-j C-d C-j
定义为“Hello!您好!你好!“,但是为你想要的字符串定义一个更简单的序列会更短。
答案 4 :(得分:0)
我一直都在使用它。你需要库repeat.el
(GNU Emacs的一部分)来使用它。
(defun make-repeatable (command) "Repeat COMMAND." (let ((repeat-message-function 'ignore)) (setq last-repeatable-command command) (repeat nil))) (defun my-hello () "Single `hello'." (interactive) (insert "HELLO!")) (defun my-hello-repeat () (interactive) (require 'repeat) (make-repeatable 'my-hello))
现在绑定my-hello-repeat
:
(global-set-key(kbd“”)'my-hello-repeat)
现在只需按住 home 键重复 HELLO!。
我在多个库中使用相同的技术,包括Bookmark+,thing-cmds和wide-n。
答案 5 :(得分:0)
smartrep就是你想要的一切
(require 'smartrep)
(defvar ctl-d-map (make-keymap)) ;; create C-d map
(define-key global-map "\C-d" ctl-d-map)
(smartrep-define-key
global-map "C-d"
'(("C-j" . (insert "hello"))))