我正在编写一个elisp函数,它将给定键永久绑定到当前主模式键映射中的给定命令。例如,
(define-key python-mode-map [C-f1] 'python-describe-symbol)
从用户交互地收集命令和键序列。但是,我无法生成与当前主模式相对应的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)
似乎有效,它不能作为初始化文件上的代码。
答案 0 :(得分:10)
没有直接的方法来查找当前本地键映射的名称 - 更确切地说,是其值绑定的符号 - 因为键映射甚至不必绑定到符号。但是,模式键映射通常绑定到全局符号,并且可以通过迭代所有符号并在值为eq
的键符号对象上停止来找到它是哪一个。
这必须查看所有符号(虽然它对每个符号都做了最小的工作),但具有不依赖于任何特定命名约定的优点。
(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
答案 1 :(得分:3)
函数local-set-key
的存在是为了绑定当前本地键映射中的键。
答案 2 :(得分:2)
也许你可以试试:
(define-key (concat (symbol-name major-mode) "-map") [C-f1] 'python-describe-symbol)
编辑:虽然这会产生正确的STRING,但它仍应转换回符号。