上下文:我想创建一个次要模式,其中快速按 f
两次会导致当时按 (
应该执行的操作。这并不总是意味着只需插入 (
。例如,在启用了 paredit 模式或自动配对模式的缓冲区中,按 (
通常会导致插入 ()
在 paredit 模式缓冲区中,有时会导致换行所选文本:例如,如果我选择 a b
并按 (
,则应将所选内容替换为 (a b)
.
为了检测f
被按下两次,我只需要采用http://www.emacswiki.org/emacs/electric-dot-and-dash.el中的短代码中的逻辑即可。
所以唯一缺少的部分是一个 Lisp 代码片段,它告诉 Emacs“现在触发按下 (
!”
我想到的第一件事是该代码片段应该这样做
- 查找绑定(bind)到按键的命令
(
- 然后对该命令进行交互调用。
但是,如果自动配对包(autopair 或 paredit 或其他类似包)将 (
绑定(bind)到具有查找用于调用该命令的键的逻辑的命令,或者如果包只是依赖于 post-self-insert-hook 或 post-command-hook 而不是绑定(bind) (
.
更新
我查阅了 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)
不过,触发按键在其他情况下可能仍然有用。
最佳答案
您可能会喜欢Key Chord用于将功能绑定(bind)到双按键的库。 (请注意,如果您用英语写作,我不建议使用 f
;但是 YMMV。)
self-insert-command
,post-self-insert-hook
仍会运行。 post-command-hook
在任何情况下都会运行,但如果您担心它看到不正确的函数和/或输入事件,您可以操纵这些...
查找绑定(bind)后,您的函数可以将 this-command
设置为您要交互调用
的函数,并将 last-command-事件
到所需的键。例如:
(defun my-fake-paren ()
(interactive)
(let ((command (key-binding "(")))
(setq last-command-event ?\()
(setq this-command command)
(call-interactively command)))
关于emacs - 如何在 Emacs Lisp 中模拟特定按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905382/