当前本地密钥映射的Emacs名称?

当前本地密钥映射的Emacs名称?,emacs,key,key-bindings,major-mode,Emacs,Key,Key Bindings,Major Mode,我正在编写一个elisp函数,该函数将当前主模式的keymap中的给定键永久绑定到给定命令。比如说, (define-key python-mode-map [C-f1] 'python-describe-symbol) 命令和键序列以交互方式从用户处收集。但是,我在生成与当前主模式对应的键映射的名称(例如“python模式映射”)时遇到了问题 我尝试过这个函数(当前本地映射),但是这个函数返回的是keymap对象本身,而不是它的名称 我知道许多主模式键映射是根据约定“major-mo

我正在编写一个elisp函数,该函数将当前主模式的keymap中的给定键永久绑定到给定命令。比如说,

    (define-key python-mode-map [C-f1] 'python-describe-symbol)
命令和键序列以交互方式从用户处收集。但是,我在生成与当前主模式对应的键映射的名称(例如“python模式映射”)时遇到了问题

我尝试过这个函数(当前本地映射),但是这个函数返回的是keymap对象本身,而不是它的名称

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

(define key…
将添加到init文件中,因此

(定义键(当前本地映射)键命令)

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

也许您可以尝试:

(定义键(concat(符号名称主模式)“-map”)[C-f1]“python描述符号)


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

没有直接的方法可以更精确地找到当前本地键映射的名称,即其值绑定到的符号,因为键映射甚至不必绑定到符号。然而,模式键映射通常绑定到一个全局符号,通过迭代所有符号并在键映射对象的值为
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

本地设置密钥功能
用于绑定当前本地密钥映射中的密钥。

谢谢。我知道这一点。但是,正如我提到的,我的目的是生成将添加到初始化文件中的代码。因此,在初始化时,
本地设置密钥
不会将密钥绑定到预期的密钥映射。谢谢。我曾考虑尝试将此作为最后手段,但我希望有另一种方法(同时,我也不确定要匹配哪些符号)。性能不是问题,因为代码只运行一次,所以这是我的解决方案。为什么要编写生成其他代码的代码?你想解决的更深层次的问题是什么?您是否可以编写一些其他人可能需要的库?您是否能够编写一个单一模式,使这些函数能够神奇地描述符号,并根据当前模式执行正确的操作?等等。我的观点/问题是,如果你能以编程的方式添加这些,你也许能够以一种更一般、更优雅的方式来解决它-一种不涉及一堆除了模式映射之外看起来几乎相同的代码片段的方式…@TreyJackson那些“一堆代码片段”可能是属于一个人的
。emacs
(当然,在合理的数字范围内)。在Lisp中,生成其他代码的代码是不受欢迎的。谢谢。正如我提到的,我不想依赖这个约定,但这是一个很好的猜测!我认为大多数主要模式都遵循这个约定。经过几年的elisp hackery之后,回到这个问题上,你只需要(intern(concat…)
将字符串作为符号插入