eal*_*nso 7 emacs key key-bindings major-mode
我正在编写一个elisp函数,它将给定键永久地绑定到当前主模式键映射中的给定命令.例如,
(define-key python-mode-map [C-f1] 'python-describe-symbol)
Run Code Online (Sandbox Code Playgroud)
从用户交互地收集命令和键序列.但是,我无法生成与当前主要模式相对应的KEYMAP名称(例如'python-mode-map').
我已经尝试了函数(current-local-map),但是这个函数返回了keymap对象本身,而不是它的名字.
据我所知,许多主要的模式键盘按照惯例''major-mode-name'-mode-map'命名,但是,情况并非总是这样(例如,python-shell-map),所以我宁愿我的代码不依赖于这个约定.(我甚至不确定如何访问当前主要模式的名称).
将(define-key ...)
被添加到init文件,所以虽然
(define-key (current-local-map) key command)
似乎工作,它不能作为初始化文件上的代码.
use*_*342 11
没有直接的方法来查找当前本地键映射的名称 - 更确切地说,是其值绑定的符号 - 因为键映射甚至不必绑定到符号.但是,模式键映射通常绑定到全局符号,并且可以通过迭代所有符号并停止其值为eq
keymap对象的符号来找到它是哪一个.
这必须查看所有符号(尽管它对每个符号起作用最小),但具有不依赖于任何特定命名约定的优点.
(defun keymap-symbol (keymap)
"Return the symbol to which KEYMAP is bound, or nil if no such symbol exists."
(catch 'gotit
(mapatoms (lambda (sym)
(and (boundp sym)
(eq (symbol-value sym) keymap)
(not (eq sym 'keymap))
(throw 'gotit sym))))))
;; in *scratch*:
(keymap-symbol (current-local-map))
==> lisp-interaction-mode-map
Run Code Online (Sandbox Code Playgroud)