11

我正在编写一个 elisp 函数,它将给定键永久绑定到当前主要模式的键盘映射中的给定命令。例如,

    (define-key python-mode-map [C-f1] 'python-describe-symbol)

命令和键序列从用户交互收集。但是,我无法生成与当前主要模式相对应的 KEYMAP 名称(例如“python-mode-map”)。

我试过这个函数(current-local-map),但是这个函数返回的是keymap对象本身,而不是它的名字。

我知道许多主要模式键映射是根据约定“主要模式名称”-模式映射“命名的,但是,情况并非总是如此(例如,python-shell-map),所以我宁愿我的代码不依赖这个约定。(我什至不确定如何访问当前主要模式的名称)。

(define-key ...)被添加到一个 init 文件中,所以虽然

(define-key (current-local-map) key command)

似乎工作,它不能作为初始化文件上的代码工作。

4

3 回答 3

14

没有直接的方法可以找到当前本地键映射的名称——更准确地说,是其值所绑定到的符号——因为键映射甚至不必绑定到符号。但是,模式键映射通常绑定到全局符号,并且可以通过遍历所有符号并停止其值为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
于 2013-01-23T21:50:06.130 回答
5

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

于 2013-01-23T22:02:27.463 回答
2

也许你可以尝试:

(define-key (concat (symbol-name major-mode) "-map") [C-f1] 'python-describe-symbol)

编辑:虽然这会产生正确的字符串,但仍应将其转换回符号。

于 2013-01-23T21:46:53.070 回答