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

时间:2013-01-23 21:37:07

标签: emacs key key-bindings major-mode

我正在编写一个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)

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

3 个答案:

答案 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,但它仍应转换回符号。