5

上下文:我想制作一个次要模式,在这种模式下,f快速按下两次会导致当时按下 的(应该做的任何事情。这并不总是意味着只插入(. 例如,在启用了 paredit 模式或 autopair 模式的缓冲区中,按下(通常会导致插入(). 在 paredit 模式缓冲区中,有时会导致选择的文本换行:例如,如果我选择a b并按下(,这应该会导致将选择替换为(a b).

为了检测f被按下两次,我只需要在http://www.emacswiki.org/emacs/electric-dot-and-dash.el中的短代码中获取逻辑

所以唯一缺少的是一个 Lisp 代码片段,它告诉 Emacs “(现在触发按下!”

我想到的第一件事是片段应该做

  1. 找到绑定到键的命令(
  2. 然后在该命令上以交互方式调用 call-。

但如果自动配对包(autopair 或 paredit 或其他类似包)绑定(到具有查找用于调用命令的键的逻辑的命令,或者该包仅依赖于 post-self-insert -hook 或 post-command-hook 而不是 binding (


更新

我查阅了 Key Chord 文档,结果发现我试图用这个问题的答案来做一个更简单的解决方案:

(require 'key-chord)
(key-chord-mode 1)

(defvar my-easy-open-paren-mode-map
  (let ((map (make-sparse-keymap)))
    (key-chord-define map ",." (kbd "("))
    map))
(define-minor-mode my-easy-open-paren-mode
  "In this mode, pressing . and , together is another way of pressing the open paren.")

(defvar my-easy-semicolon-mode-map
  (let ((map (make-sparse-keymap)))
    (key-chord-define map ";;" (kbd "C-e ;"))
    map))
(define-minor-mode my-easy-semicolon-mode
  "In this mode, pressing semicolon twice fast is another way of pressing C-e and semicolon.")

(add-hook 'prog-mode-hook 'my-easy-open-paren-mode)

(add-hook 'c-mode-common-hook 'my-easy-semicolon-mode)

不过,触发按键在其他情况下可能仍然有用。

4

2 回答 2

6

您可能会喜欢Key Chord库,用于将功能绑定到双按键。f(请注意,如果您要用英语写作,我不建议您使用;但是 YMMV。)

post-self-insert-hook如果绑定是self-insert-command. post-command-hook在任何情况下都会运行,但如果您担心它看到不正确的功能和/或输入事件,您可以操纵这些...

查找绑定后,您的功能可以设置this-command为您即将使用的功能call-interactively,以及last-command-event所需的键。例如:

(defun my-fake-paren ()
  (interactive)
  (let ((command (key-binding "(")))
    (setq last-command-event ?\()
    (setq this-command command)
    (call-interactively command)))
于 2013-09-19T22:12:21.957 回答
1

我将Key Chord用于此类事情,尽管您链接的页面似乎做同样的事情。诀窍是让调用call-interactively正常工作。我将它包装在一个重置变量的 let 中last-command-event,这样就call-interactively认为它是一个“(”。这对我来说适用于 paredit 和基本模式。

(require 'key-chord)
(key-chord-mode 1)

(defun my-paren-call ()
  (interactive)
  (let ((last-command-event ?\())
    (call-interactively (key-binding "("))))

(key-chord-define-global "ff" 'my-paren-call)
于 2013-09-19T22:44:05.817 回答