这里是Emacs的一个常见场景:我想将一个函数绑定到一个键,但我不确定它是否可能与现有的键绑定冲突(易于检查),或者#34;受欢迎的"中的键绑定模块(很难检查,"流行"?)
拥有一本百科全书会很高兴:如果我查了C-c C-t
,我会发现它已经被绑定了:
org-todo
中org-mode
在sgml-tag
sgml-mode
有没有这样的事情?我知道我可以使用C-c A
到C-c-Z
等,但有时不必按下并释放 Ctrl 键。
答案 0 :(得分:7)
我从来没有遇到过这种事情的资源。包作者可以完全自由地在他们自己的键盘映射和全局键盘映射中添加和更改键绑定。维持索引很难。
Emacs可以动态加载功能,因此活动键命令也是动态的,并且受您安装的功能required
的限制。例如,如果您不需要paredit,则无法检查其键盘映射。
M-x describe-bindings
将告诉您Emacs当前加载的键绑定。这是一个很长的名单!下面的show-key-bindings
函数会将其修剪为使用修饰键的绑定。
(defun get-bindings ()
(with-temp-buffer
(describe-buffer-bindings (current-buffer))
(buffer-string)))
(defun format-binding (b)
(let ((ws (split-string b)))
(apply 'format "%s\t%s" (butlast ws) (last ws))))
(defun binding? (str)
(string-match-p (rx bol (any "C" "M" "H" "S")) str))
(defun join-string-lines (lines)
(mapconcat 'identity lines "\n"))
(defun show-key-bindings ()
"Show the active keybindings for the current buffer."
(interactive)
(let* ((bs (split-string (get-bindings) "\n" t))
(fmt (mapcar 'format-binding (remove-if-not 'binding? bs))))
(save-excursion
(let ((help-window-select t))
(with-help-window "*active bindings*"
(princ (join-string-lines fmt)))))))
回顾一下,您可以使用一些函数来设置绑定:
global-set-key
如果希望某些命令始终可用,请使用此选项。
local-set-key
设置当前缓冲区的键绑定。我喜欢在我的钩子中使用它来为特定模式提供键绑定。
define-key
向键映射添加命令。键盘映射必须已绑定,因此在配置中使用时往往太脆弱。
如果您担心意外覆盖emacs配置中的模式绑定,最简单的方法是确定您是否真的需要命令 global 。尽可能使用local-set-key
。
您还可以查看键和弦(M-x package-install key-chord
)之类的软件包,或者如果您发现自己的密钥用完了,则可以使用自定义键盘映射定义自己的次要模式。
使用一些virtuosic shell脚本或elisp,应该可以解析elisp文件列表并提取它们定义的键绑定。我可能会稍后调查一下。
与此同时,以下unix shell命令将在目录树中找到对上述键绑定表单的所有引用。您可以在.emacs.d中运行它来检查elpa包中设置的键绑定。
tree -fxi -P '*.el' | xargs egrep -s 'local-set-key|define-key|global-set-key'