Jis*_*Yoo 4 emacs elisp key-bindings
上下文:我想制作一个次要模式,按下f两次快速结果,无论当时(应该做什么.这并不总是意味着插入(.例如,在启用了paredit模式或autopair模式的缓冲区中,按下(通常会导致插入().在paredit模式缓冲区中,有时会导致包装所选文本:例如,如果我选择a b并按下(,则应该导致替换选择(a b).
为了检测f被按两次,我只需要在http://www.emacswiki.org/emacs/electric-dot-and-dash.el中的短代码中采用逻辑.
所以唯一缺少的部分是一个Lisp代码片段,它告诉Emacs" (现在触发按下!"
我想到的第一件事就是片段应该这样做
(但是,如果自动配对包(autopair或paredit或其他类似的包)绑定(到一个命令,该命令具有查找用于调用命令的键的逻辑,或者如果包只依赖于自我插入-hook或post-command-hook而不是绑定(.
更新
我已经查找了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)
Run Code Online (Sandbox Code Playgroud)
但是,触发按键可能在其他环境中仍然有用.
您可能会喜欢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)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1892 次 |
| 最近记录: |