emacs中的两个关键快捷键而不压缩第一个键?

时间:2011-09-26 19:16:22

标签: emacs elisp

假设我定义了以下快捷方式

(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"

6 个答案:

答案 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-cmdswide-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"))))