埃马克斯25
正如@YoungFrog在评论中提到的那样,从Emacs 25.1开始C-h k
,描述键绑定的古老方法也将告诉您找到该键的键映射。
在Emacs 25之前
还有一些代码
在这里
就这一点,但因为它没有面面俱到它是不完整的。下面是它的改进版本。
键可以以9(!)方式绑定。感谢@Drew 提供了完整列表的此链接(也由this进行了补充)。按照优先顺序,它们是:
- 特定于终端的一组键
overriding-terminal-local-map
。这由set-transient-map
功能定义。
- 缓冲区局部覆盖图
overriding-local-map
。如果设置了此项,则将跳过第3–8项(可能是为什么您看不到其中的许多项)。
- 在点通过
keymap
文本欢迎使用属性(可以去实际文本或覆盖)。
- 一个基本上模拟启用的次要模式的不同可能集的变量
emulation-mode-map-alists
。
- 主模式可以覆盖次模式的键绑定的变量
minor-mode-overriding-map-alist
。
- 实际的次要模式,其键绑定存储在中
minor-mode-map-alist
。
- 在点(再次),通过
local-map
text属性。如果存在,则跳过第8项。
- 该函数返回的标准缓冲区本地键映射(主模式或缓冲区本地键绑定所在的位置)
current-local-map
。
- 在全球键盘映射,返回的
current-global-map
。
还有一个半项目10。通过上述过程找到的任何命令也可能已被重新映射。
以下函数查询其中一些可能性(最有可能的可能性),并返回或打印结果。
(defun locate-key-binding (key)
"Determine in which keymap KEY is defined."
(interactive "kPress key: ")
(let ((ret
(list
(key-binding-at-point key)
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key))))
(when (called-interactively-p 'any)
(message "At Point: %s\nMinor-mode: %s\nLocal: %s\nGlobal: %s"
(or (nth 0 ret) "")
(or (mapconcat (lambda (x) (format "%s: %s" (car x) (cdr x)))
(nth 1 ret) "\n ")
"")
(or (nth 2 ret) "")
(or (nth 3 ret) "")))
ret))
除第一个功能外,每个功能都有内置功能,因此我们必须创建一个功能(也是上面链接的代码的改进版本)。
(defun key-binding-at-point (key)
(mapcar (lambda (keymap) (when (keymapp keymap)
(lookup-key keymap key)))
(list
;; More likely
(get-text-property (point) 'keymap)
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point)))
;; Less likely
(get-text-property (point) 'local-map)
(mapcar (lambda (overlay)
(overlay-get overlay 'local-map))
(overlays-at (point))))))
既然您说的是当附件上的指针处于活动状态,则此键绑定很有可能发生在覆盖或文本属性上。
如果那不起作用,请尝试以下命令。只需将光标放在附件上,然后执行即可M-x
keymaps-at-point
。
(defun keymaps-at-point ()
"List entire keymaps present at point."
(interactive)
(let ((map-list
(list
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point)))
(mapcar (lambda (overlay)
(overlay-get overlay 'local-map))
(overlays-at (point)))
(get-text-property (point) 'keymap)
(get-text-property (point) 'local-map))))
(apply #'message
(concat
"Overlay keymap: %s\n"
"Overlay local-map: %s\n"
"Text-property keymap: %s\n"
"Text-property local-map: %s")
map-list)))
Searching Keymaps
。另请参阅节点Functions for Key Lookup
和Active Keymaps
。