作为这个问题的后续,它试图找出如何做这样的事情,这应该很容易,这尤其阻止我更习惯于使用Emacs,而是启动我已经熟悉的编辑器。在编辑多个文件时,我经常使用这个示例。

在Ultraedit中,我用Alt+s然后p来显示一个带有选项的对话框:查找(包括跨多行使用正则表达式),替换,在文件/类型中,目录,匹配大小写,仅匹配整个单词,列出更改的文件和搜索子目录。通常我会先用鼠标点击-拖动选择我想要替换的文本。

只使用Emacs本身(在Windows XP上),不调用任何外部实用程序,如何替换所有的foo\nbar与bar\nbaz在*.c和*.h文件中的一些文件夹和它下面的所有文件夹。也许Emacs并不是最好的工具,但是如何用最少的命令就能轻松完成呢?


当前回答

M-x find-name-dired:将提示您输入根目录和文件名模式。 按t“切换标记”找到的所有文件。 按Q“查询-替换文件…”:系统将提示输入查询/替换regexp。 继续执行query-replace-regexp: SPACE替换并移动到下一个匹配,n跳过一个匹配,等等。 按C-x s保存缓冲区。(然后你可以按y表示yes, n表示no,或者!对所有人都是)

其他回答

我通常使用其他工具来执行这项任务,EmacsWiki的跨文件查找和替换条目中提到的许多方法似乎都很有用,但Findr包看起来很有前途。

窃取部分源文件:

(defun findr-query-replace (from to name dir)
  "Do `query-replace-regexp' of FROM with TO, on each file found by findr.

M-x project-query-replace-regexp RET(确保文件已保存!) M-x rgrep RET然后在每个缓冲区内查询-替换。这很好,因为你可以跟踪所有发生的事情,还因为它让你把搜索限制在某些扩展范围内。

M-x find-name-dired:将提示您输入根目录和文件名模式。 按t“切换标记”找到的所有文件。 按Q“查询-替换文件…”:系统将提示输入查询/替换regexp。 继续执行query-replace-regexp: SPACE替换并移动到下一个匹配,n跳过一个匹配,等等。 按C-x s保存缓冲区。(然后你可以按y表示yes, n表示no,或者!对所有人都是)

对于这个任务,使用dred来递归到一个深目录树将会有点慢。您可以考虑使用标记-查询-替换。这确实意味着要花费一些钱来创建一个标签表,但这通常是有用的,而且是快速的。

find-name-dired是可以的,但是:

您得到的所有文件都匹配同一个regexp。 find- dred在这方面更灵活,但它也是为使用通用规则而设计的(即使这些规则可能非常复杂)。当然find也有自己复杂的语言。 如果您希望只对find(name)-dired缓冲区中收集的文件名中的一些文件进行操作,则需要标记它们,或者删除/省略不想操作的那些行。

另一种替代方法是使用dred +命令,作用于(a)标记的文件和(b)标记子目录中所有标记的文件(或所有文件,如果没有标记)…发现递归。这为您提供了对文件选择的通用性和轻松控制。这些“here-and-below”命令都在dred模式下的前缀键M-+上。

例如,M-+ Q与Q——query-replace相同,但目标文件都是在当前目录和任何标记的子目录中标记的文件,down, down, down…

是的,使用这种“这里和下面”命令的另一种方法是递归地插入所有子dirs及其子dirs,然后使用q之类的顶级命令。但是,不使用插入的子dirs通常更方便。

要做到这一点,你无论如何都需要一种快速递归插入所有子dirs的方法。在这方面,Dired+也能提供帮助。M-+ M-i递归地插入所有标记的子dirs和它们自己标记的子dirs。也就是说,它类似于M-i(在Dired+中插入标记的subdirs),但它对subdirs递归地起作用。

(所有这样的“这里和下面”干燥+命令在菜单多个>标记在这里和下面。)

您还可以对Emacs文件集执行Dired操作,Emacs文件集是一组保存的位于任何位置的文件名。如果您使用Icicles,那么您可以为文件集或其他类型的保存文件列表中的文件打开一个Dired缓冲区。

You can also bookmark any Dired buffer, including one that you create using find(-name)-dired. This gives you a quick way to return to such a set (e.g. a project set) later. And if you use Bookmark+ then bookmarking a Dired buffer records (a) its ls switches, (b) which files are marked, (c) which subdirectories are inserted, and (d) which (sub)directories are hidden. All of that is restored when you "jump" to the bookmark. Bookmark+ also lets you bookmark an entire tree of Dired buffers --- jumping to the bookmark restores all of the buffers in the tree.