是否可以更新 emacs rgrep 命令以在整个 nodejs 项目中排除“node_modules”?

Can emacs rgrep command be updated to exclude `node_modules` throughout a nodejs project?

我最近开始使用 emacs 作为我的默认设置 editor/IDE 并且对使用 rgrep 搜索项目中的文本大体上很满意。但是,如果我使用 rgrep,我无法获得排除目录的选项,特别是 node_modules 目录。这会导致更长的搜索时间和大量无关的匹配。

当我在 js2 模式下在 emacs 中使用 rgrep 时,我可以更改基本 rgrep 命令以排除那些目录吗?

最简单的选项是自定义 grep-find-ignored-directories 用户选项。

您可能不想将其限制为 js2-mode。如果你那样限制它,你可能会选择这样的东西:

(add-hook 'js2-mode-hook 'my-js2-mode-hook)

(defun my-js2-mode-hook ()
  "Custom behaviours for `js2-mode'."
  (require 'grep)
  (setq-local grep-find-ignored-directories
              (cons "node_modules" (default-value 'grep-find-ignored-directories))))

但是,肯定会有其他缓冲区,您可能会从中启动 rgrep,同时仍在同一项目中。

目录局部变量提供了另一种方法(它可以简单地说明项目中的所有文件访问缓冲区,但仅适用于某些非文件访问缓冲区)。

实际上,除非您觉得 node_modules 可能是您 想要 在某些项目类型中搜索的目录名称,否则我倾向于只设置全局值。

我也会参考 grep-find-ignored-directories 的这个功能:

If an element is a cons cell, the car is called on the search directory to determine whether cdr should not be recursed into.

原则上,这提供了根据具体情况过滤目录的能力。不过,这不是最容易使用的东西——它需要您 已经 有代码来识别给定目录是否是 node_modules 所在项目的一部分safe/unsafe,并且该代码将再次需要在任何类型的缓冲区中工作,因此您仍在处理一些相同的问题。但是,如果您正在使用其他一些面向项目的库,那么您可能有一些现有的简单方法来建立项目 type,然后您可以将其用于该高级的自定义谓词函数过滤。

从技术上讲,这并没有回答问题。但这可能是解决实际问题的更好方法。

据推测,您已将此项目置于版本控制之下,而您忽略了 node_modules。如果你在 Emacs 中使用 ripgrep (https://github.com/BurntSushi/ripgrep) it will automatically exclude anything ignored by the VCS. Also it's way faster than grep. I prefer rg.el (https://github.com/dajva/rg.el).