在单个项目中搜索所有有用文件的最简单方法是什么?


28

在整个项目中搜索当前项目中所有文件的正则表达式,跳过无用的文件的最简单方法是什么?

没用的文件是诸如编译文件,导入的库,版本控制文件等之类的东西。

我知道rgrep,但是它只会搜索所有内容。是否有一个程序包可以“智能地”搜索并知道几种不同的编程语言,所以我不必为每个单独的项目进行配置?


关于“仅搜索所有内容”的注释rgrep会有些混乱,因为默认情况下它会排除所有符合“无用文件”条件的文件。
phils 2015年

Answers:


32

Emacs中基于项目的搜索可以使用射弹完成。

它允许按项目配置忽略文件(在<projectroot>\.projectile文件中),或指定子目录来监视和忽略所有其他目录。

它可以在定义的项目内的文件上运行grepack(需要ack-and-a-half.el)和agag.el)(基于该.projectile文件或通过找到受支持的VC文件来定义项目根目录)。

有用的命令

(关于搜索有用的文件)

根据弹丸自述文件

  • C-c p s g :: grep在项目中的文件上运行。
  • C-c p s a :: ack在项目上运行。要求使用ack-and-a-half。
  • C-c p s s :: ag在项目上运行。需要存在ag.el。
  • C-c p f ::显示项目中所有文件的列表。
  • C-c p d ::显示项目中所有目录的列表。
  • C-c p a ::在项目中具有相同名称但扩展名不同的文件之间切换。
  • C-c p o:: multi-occur在当前打开的所有项目缓冲区上运行。

这些只会作用于定义为项目一部分的文件(或在生成/重新生成缓存时找到的文件)。


谢谢,我可以为此使用的投射命令是什么?
马拉巴巴2014年

编辑它以包括命令的子集(处理搜索,查找文件和Dired的命令)。完整列表在软件包自述文件中。
乔纳森·里奇·佩平2014年

13

可以使用agaka_silver_searcher在项目范围内仅搜索相关文件。

为什么要?

  • 它忽略文件模式从你的.gitignore.hgignoresvn:ignore您可以使用-U开关从版本控制忽略列表中选择不使用忽略列表。
  • 如果您不想搜索源仓库中的文件,只需将其模式添加到.agignore文件中。
    • .agignore可以将全局文件放入您的文件$HOME,然后可以.agignore在项目根目录中放入更多项目特定的文件。

设置ag和emacs

  • 在系统上安装agaka the_silver_searcher
  • 设置.agignore文件。我更喜欢.agignore在自己的文件中有一个全局文件$HOME
  • 安装ag软件包(在Melpa上可用)。
  • 然后,您可以使用包附带的ag-projectag-project-regexp函数ag来进行项目范围内的文件搜索。
    • 默认情况下,这些功能使用VCS存储库的根目录作为搜索目录。您可以通过设置或自定义来覆盖此功能ag-project-root-function
    • 即使您的项目不受git控制,也可以通过在项目根目录中放置一个空文件夹来为基于ag-project/ ag-project-regexp的搜索标记.git项目根目录。然后,您不必进行自定义ag-project-root-function

4

如果您的项目使用Git,则只需要counsel https://github.com/abo-abo/swiper

  • counsel-git 查找文件

  • counsel-git-grep 到grep

唯一的依赖是git

文本抓取比银色搜索器(ag)快

律师还提供其他强大的工具。例如,运行后counsel-git-grep,您可以按C-c C-oC-x C-q进入wgrep-mode以轻松替换项目范围内的文本。

有一篇文章https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/解释了详细信息。该文章使用了counsel-ag(顾问中内置的另一个命令),但是cousnel-git-grep使用了完全相同的工作流程。


但是,为什么文本抓取比AG快?您能详细说明一下吗?
denis631

1
ag也是grep程序,例如git-grep。我不能说哪个更快。参见github.com/BurntSushi/ripgrep,它比较了流行的grep程序(包括aggit-grep)的性能
chen bin

1

第一个答案很漂亮,但是却省略了有关现代版本的Emacs的一些关键细节。我自己对Emacs知道,所以其他新手可能不会意识到这一点。鉴于您的目标是在PROJECT中的文件内搜索文本,那么您将首先使用MELPA信息库安装Projectile。

这会将软件包安装在.emacs.d中,并在$ USER目录中的.emacs中添加一些基本配置(假设您已经创建了.emacs文件),例如在Emacs安装中需要Projectile。

但是,您仍然需要启用它并关联键映射前缀,以便可以在迷你缓冲区中调用它。

接受的答案提到以下命令:

C-c p s g

除非您使用此键盘映射前缀配置Projectile,否则这将无法工作。但是我将其配置为使用Cc Cp作为.emacs中Project的命令:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

现在,我可以使用grep在项目中的文件中执行文本搜索:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

要对其进行分解, C-c C-p将调用Projectile,然后s g执行grep搜索。假设您的搜索是visit_contact并且您正在项目中搜索Ruby的rspec,您将获得如下所示的漂亮输出:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.