我该如何简单地使用grep搜索所有可用的文档内容?

6
我相信Emacs的自我文档很棒,但我似乎无法理解它应该如何使用。由于我需要的信息在搜索引擎上只需要几秒钟就可以找到,所以我通常会选择这种方式 - 这并不完全令人满意!(而且在离线时根本无法使用,而我喜欢在旅行等情况下离线)这让我想知道:为什么我不能通过所有本地安装的文档进行“谷歌”搜索,给我任何看起来像我正在搜索的字符串的东西?我认为这甚至可以通过从命令行中简单地grep文件来实现,但这不可能是正确的方法。apropos听起来应该做类似的事情,但它没有...我从来没有用过那个命令找到过我不知道的任何内容。
3个回答

6
以下是我之前写的一些答案,可能会帮助你找到正确的方向。并没有一个单一(默认)的命令可以搜索所有文档来源,但这在大多数情况下都没问题。
(我从未调查过这个领域的第三方库;可能会有一些东西能够更全面地搜索文档。)
M-x elisp-index-search 和 M-x emacs-index-search 是很好的首选。

M-x info-apropos 不太为人所知,但非常有用,因为它可以搜索系统中所有已知 Info 文件的索引。当然,它相应地比其他功能慢。

最重要的是确保您知道如何使用 Info 阅读器!(查看这些链接以了解更重要的细节)。

我使用以下绑定快速获取 apropos 命令(一定要阅读 C-h v apropos-do-all,它的行为可以通过向其提供命令前缀参数来触发)。

;; Custom 'apropos' key bindings
(global-set-key (kbd "C-h C-a") 'my-apropos-prefix)
(define-prefix-command 'my-apropos-prefix nil "Apropos (a,d,f,i,l,o,v,C-v)")
(define-key my-apropos-prefix (kbd "a")   'apropos)
(define-key my-apropos-prefix (kbd "C-a") 'apropos)
(define-key my-apropos-prefix (kbd "d")   'apropos-documentation)
(define-key my-apropos-prefix (kbd "c")   'apropos-command)
(define-key my-apropos-prefix (kbd "f")   'apropos-command)
(define-key my-apropos-prefix (kbd "i")   'info-apropos)
(define-key my-apropos-prefix (kbd "l")   'apropos-library)
(define-key my-apropos-prefix (kbd "o")   'apropos-user-option)
(define-key my-apropos-prefix (kbd "v")   'apropos-variable)
(define-key my-apropos-prefix (kbd "C-v") 'apropos-value)

我也经常使用这些:

(global-set-key (kbd "C-h C-l") 'find-library)
(global-set-key (kbd "C-h C-f") 'find-function)
(global-set-key (kbd "C-h C-k") 'find-function-on-key)
(global-set-key (kbd "C-h C-v") 'find-variable)

这些函数用于查看源代码,虽然在大多数文档中describe-*命令更有用,但对于尚未在Info手册中涵盖的库,在其源代码开头有良好的评论也并不罕见。因此,上述函数和绑定为访问源代码以检查此类文档提供了非常方便的快捷方式。
当然,在C-h帮助前缀(或如果您喜欢,则为<f1>)上有大量默认绑定,包括一些(但不是全部!)上述的describe-*命令。键入C-h C-h并阅读它列出的所有选项。您可能不关心其中的一些,而您可能会突然发现它们比您上次查看时更加有趣。
还要检查M-x apropos-command RET ^describe- RET
最后,请查看“帮助”菜单!特别是“搜索文档”子菜单,但如上所述,请注意其他项目。

最后,有时我确实需要在 Emacs 源代码中使用 grep。如果你的文件全部未压缩,则像往常一样可以使用 M-x rgrep。但是,如果所有的 elisp 文件都被压缩了,你就需要使用 M-x zrgrep(对一些人来说,这个命令的存在可能是一个新闻)。


那肯定已经好很多了。我想通过这些组合,大部分时间我都能得到我需要的。 ...它不应该很容易“捆绑”它们吗?例如,首先简单搜索apropos-command,如果这没有自动提供有用信息,则继续使用更慢的资源? - leftaroundabout
我想这取决于你如何定义(和检测)“产生任何有用的东西”,但我确实同意有明确的空间可以编写类似的内容。 - phils

1
安装像recoll这样的工具,然后您可以全文搜索整个硬盘,如果需要的话。
Recoll是一种桌面搜索工具,提供高效的全文搜索(从单词到任意复杂布尔搜索),使用友好的GUI,在最少的技术复杂度和少数必需的外部依赖的情况下。它在许多类Unix操作系统下运行,并且大多独立于桌面环境。

我看到这个也有一个Helm接口:https://github.com/emacs-helm/helm-recoll - phils

0

我将提到如何使用 Icicles 来搜索 Info 手册。简单来说,Icicles 的补全功能,无论是针对索引条目、节点名称还是菜单项,都可以使用正则表达式,并且它允许您通过添加更多的搜索模式逐步缩小搜索范围。而对于 g,您可以同时匹配节点名称或节点内容。

更详细的答案在这里:如何高效地搜索 Info 文档

Icicles 的 Info 增强文档页面在这里。它还提到了一种将手册或部分手册展平,然后使用预处理正则表达式仅搜索您定义的上下文的方法。搜索上下文可以像单独的行一样简单(类似于grep),来自正则表达式.*,也可以像您喜欢的那样复杂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接