这是Emacs中的一个常见场景:我想将一个函数绑定到一个键,但我不确定它是否可能与现有的键绑定(易于检查)或"流行"模块中的键绑定发生冲突(很难什么是"受欢迎的"?)
拥有一本百科全书会很好:如果我抬起头来C-c C-t,我会发现它必然会:
org-todo 在 org-modesgml-tag 在 sgml-mode有这样的事吗?我知道我可以C-c A通过C-c-Z等等,但有时不必按下并释放Ctrl钥匙.
我从来没有遇到过这种事情的资源.包作者完全可以在他们自己的键盘映射和全局键盘映射中添加和更改键绑定.维持指数很难.
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)))))))
Run Code Online (Sandbox Code Playgroud)
回顾一下,您可以使用一些函数来设置绑定:
global-set-key
如果希望某些命令始终可用,请使用此选项.
local-set-key
设置当前缓冲区的键绑定.我喜欢在我的钩子中使用它来使键盘绑定可用于特定模式.
define-key
将命令添加到键映射.键映射必须已绑定,因此在配置中使用时往往太脆弱.
如果您担心在emacs配置中意外覆盖模式的绑定,最简单的方法是确定您是否真的需要命令是全局的.尽可能使用local-set-key.
您还可以查看key-chord(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'
Run Code Online (Sandbox Code Playgroud)