有没有办法从grep / ack / ag输出模式使用查询替换?


31

我知道find-grep-dired,标记了相应的文件,然后按Q来运行dired-do-query-replace-regexp标记的文件。不幸的是,这需要重新启动grep,并且不再使用git-grep,ack或ag并切换到使用find-grep具有不同搜索语法的使用。

我也知道multi-occuroccur-edit-mode,但是这要求重新启动搜索并使用发生。最后,ag-dired似乎与文件名匹配,而不与文件内容匹配。

我当前的方法是生成grep输出,然后运行一个从grep缓冲区开始的宏,并访问每个匹配项并对其进行更改。我希望query-replace直接在找到的匹配项上使用。

我想这样做是要么快速构建从现有的grep输出dired缓冲区,这样我可以标记对他们的相应文件和电话查询,正则表达式,或者变换grep的输出入缓冲区的列表multi-occur,这样我可以使用occur-edit-mode来在适当位置编辑它并query-replace在该缓冲区上运行。

是否存在此功能,或者有其他工作流程可以解决此问题?

Answers:


28

@Malabarba提到了使用wgrep软件包来编辑grep / ack / ag结果。

我想写一个详细的演练,介绍如何使用ag软件包和wgrep-ag软件包来使用软件包来编辑“ ag”结果multiple-cursors

这些软件包可通过Melpa获得。您还需要在系统上安装agaka the_silver_searcher

本演练适用于您正在寻找一种在所有/选定位置进行单行编辑的方法的情况ag

  • 安装ag系统和上述emacs的包上。

  • ag支持搜索内容与您指定的正则表达式匹配的文件。告诉ag项目根目录的最简单方法是在其中放置一个空.git文件夹。然后使用搜索M-x ag-project-regexp

  • 默认情况下,ag搜索的结果缓冲区不可编辑。要使其可编辑,请执行M-x wgrep-change-to-wgrep-mode或使用wgrep-default绑定C-c C-p

  • 现在,如果您需要在所有文件中将“ abcdef”更改为“ ghijkl”,则将搜索“ abcdef”,ag结果缓冲区将显示包含该字符串的所有行。然后,使该缓冲区可编辑,并手动更改那些字符串,这些更改将在执行M-x wgrep-finish-edit或使用默认绑定时反映在实际的文件缓冲区中C-c C-e。您也可以使用query-replace-regexp该搜索替换。

  • 我更喜欢使用multiple-cursors快速重构,这样我就可以实时看到我的多个编辑同时发生的位置的反馈。突出显示要替换的字符串M-x mc/mark-all-like-this,然后在结果缓冲区中进行调用,然后敬畏地进行编辑,因为您会看到同时在多个点上对内容进行编辑。

  • 如上所述,一旦您对编辑感到满意,就C-c C-e可以“反映”实际缓冲区中的更改。缓冲区尚未保存。

  • 为了保存所有缓冲区,我通常使用emacs默认C-x s !绑定一次完成一次。

这是带有屏幕截图的示例用例:

它显示了替换my中所有bind-to-modi-mapto 实例的过程。bind-to-my-map~/.emacs.d/

当我bind-to-modi-map在emacs设置文件夹中搜索时,得到以下“ ag”结果:ag结果,未修改

该缓冲区是只读的。

M-x wgrep-change-to-wgrep-mode,高亮显示,之后-modi-map,使用选择该选择的所有实例,M-x mc/mark-all-like-this并将这些选择编辑为-my-map,如下所示: ag结果,使用多光标修改

蓝色高亮显示当我按时将修改哪些行C-c C-e

点击时C-c C-e,您可以在此屏幕快照中看到反映在实际文件中的更改: 完成修改后的结果

然后,我将使用保存所有修改的文件C-x s !


这确实是进行字符串替换的最佳方法。包含在一个项目中,介意不包含在批处理中,易于批处理,仍然能够验证您要替换的是正确的东西。
PascalVKooten '16

13

我想做的就是从现有的grep输出中快速构建一个干燥的缓冲区,或者将grep输出转换为用于多次出现的缓冲区列表。

您无需将grep结果缓冲区转换为任何东西,已经有一种专门用于编辑grep输出的模式(当然,还可以反映文件上的更改)。

  1. 从Melpa 安装wgrep软件包。
  2. (require 'wgrep) 在您的init文件中。
  3. 完成grep搜索后,点击C-c C-p并进行编辑!
  4. 保存您的编辑 C-c C-e

它甚至也可以与ack和ag一起使用。


2
那就是我所做的(使用ag.el)。与magnars多光标编辑一起,简单的重构确实非常容易。
汤姆·雷格纳

4

此功能存在于弹丸projectile-replace)中。如果可用(按此顺序),它将使用ag / ack / git grep / grep来查找事件并tags-query-replace执行查询替换。


这遭受了与find-grep-dired相同的问题。它不使用现有的grep输出。弹丸多发也有类似的问题。我希望在查看匹配列表之后开始查询替换,而不更改基础搜索的方法。它是一个替代工作流程。
dgtized

您所描述的声音听起来很容易,只需制作一个非常快速的宏来替换文本并重复调用即可M-g n C-x e(即,用于next-error滚动出现的事件)。
shosti 2014年

1

这是使用Icicles的另一种方法。

在您的Emacs *grep*输出缓冲区中,点击Cc`(即Cc反引号),在冰柱模式下,该Cc 被绑定*grep*到command的缓冲区中icicle-compilation-search。这样一来,您就可以grep以任意顺序快速浏览所选的任何搜索匹配项。

输入您输入的微型缓冲区可动态过滤(缩小)搜索结果集,并且您可以使用渐进补全来连续匹配多个模式(例如,子字符串,正则表达式)来缩小搜索范围。

在搜索匹配中导航时,您可以根据需要替换任何匹配-整个匹配(行)或仅匹配当前迷你缓冲区输入的部分。

请参阅冰柱搜索-编译或Grep。以一个介绍冰柱搜索是在这里,并在左右更换比赛信息冰柱搜索是在这里


0

我用我写的xah_find.el这个 工具

我写它的原因是:

  • 纯elisp。无需担心Windows上的grep或emacs与操作系统之间的Unicode传输。emacs grep问题
  • 如果您是大量的unicode用户,则unix工具会出现一些半错误。linux uniq问题
  • 我每周都会在5k文件上查找/替换。我使用dired-do-query-replace-regexp多年了。我发现交互性确实缩短了我的时间,但我确实需要检查更改的结果。因此,我的解决方案现在可以批量运行,但是有一个不错的报告,可以扫描所有查找/替换结果,并可以选择写入文件。

这个elisp util可能比在emacs中调用unix grep慢5到10倍,但对我来说还可以。

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.