在项目中进行文本搜索是程序员的日常,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;否则,在当前目录下搜索。
赶快拷贝/粘贴上面代码到你的emacs配置,并绑上你最喜欢的快捷键吧
注:sc/projectile-grep
这个命令完全依赖于 projectile,因此你最好在一个 projectile 项目下使用它。“在当前项目下搜索”的功能,即使不在一个 projectile 项目下也可以正常 work,但是不建议这么做,因为它仍然会继承 projectile 的一些属性(比如:过滤 git, svn 目录等)。