让 C-h S 支持更多的 manual

C-h S (info-lookup-symbol) 可以查找某个符号在 info manual 中位置,是我常用的命令之一,尤其是在写 Emacs Lisp 的时候。它能工作在很多 major mode 下(其实主要取决于有没有相关的 info manual),在 Emacs 相关的 major mode 下,默认只用 emacs 和 elisp 这两个 manual [1],因此其它 manual 上的符号就找不到了,比如 C-h S cl-loop 就没效果。

透过参考 info.look.el,我用下面的方法添加了 cl-lib、org-mode 和 magit 的 manual:

(use-package info-look
  :defer t
  :config
  (info-lookup-add-help
   :mode 'emacs-lisp-mode
   :regexp "[^][()`'‘’,\" \t\n]+"
   :doc-spec '(("(emacs)Command Index"             nil "['`‘]\\(M-x[ \t\n]+\\)?" "['’]") ;
               ("(emacs)Variable Index"            nil "['`‘]" "['’]")
               ("(elisp)Index"                     nil "^ -+ .*: " "\\( \\|$\\)")
               ;; cl-lib
               ("(cl) Function Index"              nil "^ -+ .*: " "\\( \\|$\\)")
               ("(cl) Variable Index"              nil "^ -+ .*: " "\\( \\|$\\)")
               ;; Org
               ("(org) Variable Index"             nil "['`‘]" "['’]")
               ("(org) Command and Function Index" nil "['`‘(]" "['’)]")
               ;; Magit
               ("(magit) Command Index"            nil "(['`‘]" "['’])")
               ("(magit) Variable Index"           nil "^ -+ .*: " "\\( \\|$\\)"))))

如果还需要添加其它 manual 的话,只需要添加元素至 :doc-spec,其格式是:

(INFO-NODE TRANS-FUNC PREFIX SUFFIX)

所以需要关注相应 Index 节点的名称,以及符号在 manual 中的格式。以 magit 的变量为例:"(magit) Variable Index" 是节点名,而前缀 "^ -+ .*: "和后缀"\\( \\|$\\)"则匹配了格式,比如,magit manual 中的变量都有这个的格式:

-- User Option: magit-git-debug

另外,如果你不用 use-package 的话,把 (use-package info-look :defer t :config ...) 换成 (with-eval-after-load ...) 即可。

1: 最近添加了 cl-lib 的 manual,Emacs 25.1 应该会包含这个修改。

7 个赞

@xuchunyang

你平时写 Emacs-lisp 除了查 manual 以外,有没有用 apropos?有没有这方面的经验分享一下?

没怎么用过 apropos,要查某个符号的用法的时候,我直接用 Emacs 25 新出的 C-h o (describe-symbol),同时支持了变量、函数和 face。要是名称还不确定的话,匹配、搜索符号名称的过程在补全阶段就能完成,所以我对 apropos 没什么需求。

1 个赞

明白了,我在等 Emacs 25 的 mac port 出来,因为我的 Org 使用了 org bullet 插件,GNU Emacs 无法显示 emoji 感谢分享 c-h o