写了一个grep小工具,方便在项目中进行文本查找

在项目中进行文本搜索是程序员的日常,projectile 自带的 projectile-grep 已经实现了这个功能:

projectile-grep 支持在当前 buffer 所在的文件 所在的项目中 进行查找。

然而,有时候项目本身比较庞大,我们希望在该项目的子目录里进行查找,即:

希望在当前 buffer 所在的文件的目录(及其子目录)里进行查找。

很可惜 projectile 没有实现这个功能,于是自己 Hack 了一个小工具:

(defun projectile-get-project-directories/override () '("./"))
(defun projectile-prepend-project-name/override (string) (format "[.] %s" string))
(defun projectile-current-directory-grep ()
  "Perform rgrep in the current directory."
  (advice-add 'projectile-get-project-directories :override #'projectile-get-project-directories/override)
  (advice-add 'projectile-prepend-project-name :override #'projectile-prepend-project-name/override)
  (call-interactively #'projectile-grep)
  (advice-remove 'projectile-get-project-directories #'projectile-get-project-directories/override)
  (advice-remove 'projectile-prepend-project-name #'projectile-prepend-project-name/override))

(defun sc/projectile-grep (c)
  "Perform grep in the current directory (by default) or project."
  (interactive
   (list
    (read-char "Grep in current directory (by default) or project (𝟭): ")))
  (if (equal c ?1)
      (call-interactively #'projectile-grep)
    (projectile-current-directory-grep)))

这个新的 sc/projectile-grep 命令类似于 projectile-grep,区别在于:

这个命令会询问用户 是想在当前目录下搜索?还是在当前项目下搜索?

想在当前项目下搜索,选1;否则,在当前目录下搜索。

:stuck_out_tongue: 赶快拷贝/粘贴上面代码到你的emacs配置,并绑上你最喜欢的快捷键吧 :stuck_out_tongue:

注:sc/projectile-grep 这个命令完全依赖于 projectile,因此你最好在一个 projectile 项目下使用它。“在当前项目下搜索”的功能,即使不在一个 projectile 项目下也可以正常 work,但是不建议这么做,因为它仍然会继承 projectile 的一些属性(比如:过滤 git, svn 目录等)。

建议:你可以通过 universal-argument 切换两种路径,像 project-find-regexp 一样 emacs/project.el at 90bd80d47b7601d8a9a3936a02d085731500c4c9 · emacs-mirror/emacs · GitHub

update 只是举例可以通过这种方式,询问我个人觉得每次要愣一下

这个命令是project.el的吧?

我没用过,我一直是使用projectile管理项目。

可能还不足以称之为「工具」。

加上 C-u 前缀不行吗?

写这么多还不如直接选择哪个目录进行搜索呢

(defun eye-search-in-dir ()
  (interactive)
  (let* ((keyword (color-rg-read-input))
         (dir (counsel-read-directory-name "Search in dir: " default-directory)))
    (color-rg-search-input keyword dir)))

Just show and share!

不是每个人都装rg。

如果有人和我有同样的需求(projectile + grep),他们可以直接拿来投入生产,而不是去尝试新包。

搜索文本,我一直用这个 GitHub - dajva/rg.el: Emacs search tool based on ripgrep , 试过几个包,还是觉得这个最顺手。

1 个赞

讲真,除非你用 openBSD on ARM,不然直接下个 binary 放 PATH 里比写个这种脚本方便。

1 个赞

推荐神器 ripgrep,doom中的 “Search project” 默认使用 ripgrep,一直在用,非常好用。

文本搜索的命令行神器ripgrep - 知乎 (zhihu.com)

1 个赞