【问题标题】:Emacs name of current local keymap?当前本地键盘映射的 Emacs 名称?
【发布时间】:2013-01-07 12:43:53
【问题描述】:

我正在编写一个 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 ...) 将被添加到一个初始化文件中,所以尽管

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

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

【问题讨论】:

  • 你为什么要编写生成其他代码的代码?你试图解决的更深层次的问题是什么?您能否编写一些其他人可以简单地require 的库?您能否编写一个单一模式来执行这些类型的功能magically-describe-symbol,根据当前模式执行正确的操作?等
  • 我的观点/问题是,如果您可以以编程方式添加这些,您可能能够以更通用、更优雅的方式解决它 - 一种不涉及一堆 sn-ps除了模式映射之外看起来几乎相同的代码...
  • @TreyJackson 那些“一堆 sn-ps”可能是属于 .emacs 的代码片段(当然,在合理的数量范围内)。生成其他代码的代码在 Lisp 中不会受到欢迎。

标签: emacs key key-bindings major-mode


【解决方案1】:

没有直接的方法可以找到当前本地键映射的名称——更准确地说,是它的值所绑定的符号——因为键映射甚至不必绑定到符号。但是,模式键映射通常绑定到一个全局符号,并且可以通过遍历所有符号并在其值为 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

【讨论】:

  • 谢谢。我曾考虑将此作为最后的手段,但我希望有另一种方法(另外,我不确定要匹配哪些符号)。性能不是问题,因为代码只运行一次,所以这对我来说是一个解决方案。
【解决方案2】:

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

【讨论】:

  • 谢谢。我意识到了这一点。但是,正如我所提到的,我的目的是生成将添加到初始化文件中的代码。因此,在初始化时,local-set-key 不会将键绑定到预期的键映射。
【解决方案3】:

也许你可以试试:

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

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

【讨论】:

  • 谢谢。正如我所提到的,我不想依赖这个约定,但这是一个很好的猜测!我认为大多数主要模式都遵循惯例。
  • 在经历了几年的 elisp 黑客之后回到这一点,您只需 (intern (concat ...))) 将字符串作为符号进行实习
猜你喜欢
  • 2013-06-14
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多