Answers:
Emacs中基于项目的搜索可以使用射弹完成。
它允许按项目配置忽略文件(在<projectroot>\.projectile
文件中),或指定子目录来监视和忽略所有其他目录。
它可以在定义的项目内的文件上运行grep
,ack
(需要ack-and-a-half.el
)和ag
(ag.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
在当前打开的所有项目缓冲区上运行。这些只会作用于定义为项目一部分的文件(或在生成/重新生成缓存时找到的文件)。
可以使用ag
aka_silver_searcher在项目范围内仅搜索相关文件。
.gitignore
,.hgignore
,svn:ignore
。您可以使用-U
开关从版本控制忽略列表中选择不使用忽略列表。 .agignore
文件中。
.agignore
可以将全局文件放入您的文件$HOME
,然后可以.agignore
在项目根目录中放入更多项目特定的文件。ag
和emacsag
aka the_silver_searcher。.agignore
文件。我更喜欢.agignore
在自己的文件中有一个全局文件$HOME
。ag
软件包(在Melpa上可用)。
wgrep-ag
软件包(也可在Melpa上获得)。当您尝试使用进行项目范围内的搜索/替换ag
时,这将有所帮助。ag-project
或ag-project-regexp
函数ag
来进行项目范围内的文件搜索。
ag-project-root-function
。ag-project
/ ag-project-regexp
的搜索标记.git
项目根目录。然后,您不必进行自定义ag-project-root-function
。如果您的项目使用Git,则只需要counsel
https://github.com/abo-abo/swiper
counsel-git
查找文件
counsel-git-grep
到grep
唯一的依赖是git
文本抓取比银色搜索器(ag)快
律师还提供其他强大的工具。例如,运行后counsel-git-grep
,您可以按C-c C-o
和C-x C-q
进入wgrep-mode
以轻松替换项目范围内的文本。
有一篇文章https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/解释了详细信息。该文章使用了counsel-ag
(顾问中内置的另一个命令),但是cousnel-git-grep
使用了完全相同的工作流程。
第一个答案很漂亮,但是却省略了有关现代版本的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
rgrep
会有些混乱,因为默认情况下它会排除所有符合“无用文件”条件的文件。