上下文:我想制作一个次要模式,在这种模式下,f
快速按下两次会导致当时按下 的(
应该做的任何事情。这并不总是意味着只插入(
. 例如,在启用了 paredit 模式或 autopair 模式的缓冲区中,按下(
通常会导致插入()
. 在 paredit 模式缓冲区中,有时会导致选择的文本换行:例如,如果我选择a b
并按下(
,这应该会导致将选择替换为(a b)
.
为了检测f
被按下两次,我只需要在http://www.emacswiki.org/emacs/electric-dot-and-dash.el中的短代码中获取逻辑
所以唯一缺少的是一个 Lisp 代码片段,它告诉 Emacs “(
现在触发按下!”
我想到的第一件事是片段应该做
- 找到绑定到键的命令
(
- 然后在该命令上以交互方式调用 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)
不过,触发按键在其他情况下可能仍然有用。