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

Jisang Yoo

上下文:我想创建一个次要模式,在该模式下,f快速按下两次将导致此时按的(操作无效。这并不总是意味着仅插入(例如,在启用了paredit模式或autopair模式的缓冲区中,按(通常会插入()在paredit模式的缓冲区中,有时会导致包装所选文本:例如,如果我选择a b并按(,则应导致将所选内容替换为(a b)

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

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

我想到的第一件事是代码段应该

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

但是如果自动配对程序包(自动配对或paredit或其他类似程序包)绑定(到具有查找用于调用该命令的键的逻辑的命令,或者该程序包仅依赖于自我插入后,该操作就会失败-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)

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

菲尔

您可能会喜欢Key Chord库,库将功能绑定到两次按键。(请注意,我不建议您使用f英语书写,而是使用YMMV。)

post-self-insert-hook如果绑定为,则仍会运行self-insert-commandpost-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)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在ExtendScript中模拟按键?

来自分类Dev

如何在junit测试中模拟按键?

来自分类Dev

如何在JavaScript中模拟按键?

来自分类Dev

如何在JS中模拟按键

来自分类Dev

如何在JS中模拟按键

来自分类Dev

如何在Shell中运行emacs lisp解释器?

来自分类Dev

如何在Emacs Lisp中的光标处替换字符

来自分类Dev

如何在Emacs中显示标签

来自分类Dev

如何在Emacs中恢复默认功能?

来自分类Dev

如何在Emacs中处理文件路径?

来自分类Dev

如何在Emacs中设置框架字体

来自分类Dev

如何在emacs中安装melpa?

来自分类Dev

如何在Emacs中写入标准输出

来自分类Dev

如何在Emacs中查看git登录?

来自分类Dev

如何在Emacs中检索框架的名称?

来自分类Dev

如何在emacs中查找别名

来自分类Dev

如何在Emacs中实时预览降价?

来自分类Dev

如何在emacs中获得代码完成?

来自分类Dev

如何在Emacs中定义文本“变量”?

来自分类Dev

如何在.emacs文件中定义变量?

来自分类Dev

如何在Emacs中写入标准输出

来自分类Dev

如何在Emacs中设置框架字体

来自分类Dev

如何在Emacs中处理文件路径?

来自分类Dev

如何在Emacs中调用命令

来自分类Dev

如何在emacs中管理字体?

来自分类Dev

如何在Emacs中对角移动光标?

来自分类Dev

如何在emacs中退出MELPA?

来自分类Dev

如何在 Emacs 中禁用 HTML 模式?

来自分类Dev

如何在C ++中模拟指定的键盘按键?