Emacs当前本地键映射的名称?

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

没有直接的方法来查找当前本地键映射的名称 - 更确切地说,是其值绑定的符号 - 因为键映射甚至不必绑定到符号.但是,模式键映射通常绑定到全局符号,并且可以通过迭代所有符号并停止其值为eqkeymap对象的符号来找到它是哪一个.

这必须查看所有符号(尽管它对每个符号起作用最小),但具有不依赖于任何特定命名约定的优点.

(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)


phi*_*ils 5

该函数的local-set-key存在是为了绑定当前本地键盘映射中的键。