emacs - 如何在 Emacs Lisp 中模拟特定按键

标签 emacs elisp key-bindings

上下文:我想创建一个次要模式,其中快速按 f 两次会导致当时按 ( 应该执行的操作。这并不总是意味着只需插入 (。例如,在启用了 paredit 模式或自动配对模式的缓冲区中,按 ( 通常会导致插入 ()在 paredit 模式缓冲区中,有时会导致换行所选文本:例如,如果我选择 a b 并按 (,则应将所选内容替换为 (a b).

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

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

我想到的第一件事是该代码片段应该这样做

  1. 查找绑定(bind)到按键的命令(
  2. 然后对该命令进行交互调用。

但是,如果自动配对包(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。)

如果绑定(bind)是 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/

相关文章:

emacs - 在 Emacs 中自动高亮符号

emacs - 在 Shell 模式下将击键转发到 Shell

方案和 Lisp 最佳实践 : recursion yes for Scheme, Lisp 没有?

emacs - 如何设置 Emacs 主题?

assembly - 在 Emacs Lisp 中使用 asm-mode 识别 C++ 风格的注释

emacs - 在 Lisp/Emacs 中打印彩色字符

python - 如何使用键盘获取 tkinter treeview 选定的行值?

WPF MVVM KeyBinding 无法立即被识别并且并不总是有效

string - 如何用 emacs lisp 生成一串双引号?

java - PhpStorm 未知 key 代码 : 0x0