emacs - Elisp:从代码中调用键盘映射?

标签 emacs elisp

这是让事情顺利进行的最小片段:

(define-prefix-command 'foo)
(define-key foo "a" 'bar)
(define-key foo "b" 'baz)
(global-set-key (kbd "C-M-r") 'foo)

现在我可以“调用”foo当我按 C-M-r 时的键盘映射。
但我想知道如何从代码中做到这一点,例如就像是:
(funcall (lambda-from-keymap 'foo))

在这次通话之后,我希望焦点在小缓冲区中,期望
a, 或 b 或 C-h 被输入。
这样的事情可能吗?

最佳答案

您可以使用 read-key-sequencelookup-key实现这一点:

(defun call-keymap (map &optional prompt)
  "Read a key sequence and call the command it's bound to in MAP."
  ;; Note: MAP must be a symbol so we can trick `describe-bindings' into giving
  ;; us a nice help text.
  (let* ((overriding-local-map `(keymap (,map . ,map)))
         (help-form `(describe-bindings ,(vector map)))
         (key (read-key-sequence prompt))
         (cmd (lookup-key map key t)))
    (if (functionp cmd) (call-interactively cmd)
      (user-error "%s is undefined" key))))

如果你按 C-h read-key-sequence仍然等待您完成序列。我认为您可以通过循环使用 read-key 来模拟 Emacs 的正常行为。相反,它更复杂一些。

像这样使用它:
(defun bar () (interactive) (message "you called bar"))
(defun baz () (interactive) (message "you called baz"))

(define-prefix-command 'foo)
(define-key foo "a" 'bar)
(define-key foo "b" 'baz)
(global-set-key (kbd "C-M-r") 'foo)

(defun call-foo ()
  (interactive)
  ;; Note: pass the symbol form of the keymap so we can give nice help
  (call-keymap 'foo "enter a foo command: "))

(global-set-key (kbd "C-c f") 'call-foo)

关于emacs - Elisp:从代码中调用键盘映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24914202/

相关文章:

emacs - 学习 Elisp - 阅读源代码的最高质量库是什么?

emacs - 禁用 lisp 模式的 cedet/语义代码完成

Emacs24 不会下载 marmalade-repo.org 文件

Emacs 将备用文件扩展映射到 .ini 语法突出显示

emacs - 突出显示区域时仅删除一个字符

emacs - 如何通过覆盖 Emacs 中的 set-face-attribute 来禁用粗体字体?

regex - Emacs 查询替换正则表达式多行

c++ - 让 Emacs 高亮语法关键字对

emacs - 追踪emacs中的max-specpdl-size错误

emacs - 在emacs中的点替换文件