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

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

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


当前回答

M-x find-name-dired RET it may take some time for all the files to appear in the list, scroll to bottom (M->) until "find finished" appears to make sure they all have loaded Press t to "toggle mark" for all files found Press Q for "Query-Replace in Files...": you will be prompted for query/substitution regexps. Proceed as with query-replace-regexp: SPACE or y to replace and move to next match, n to skip a match, etc. Type ! to replace all occurrences in current file without asking, N to skip all possible replacement for rest of the current file. (N is emacs 23+ only) To do the replacement on all files without further asking, type Y. Call “ibuffer” (C-x C-b if bound to ibuffer, or M-x ibuffer RET) to list all opened files. Type * u to mark all unsaved files, type S to save all marked files * * RET to unmark all marks, or type D to close all marked files

这个答案结合了这个答案、这个网站和我自己的笔记。使用Emacs 23+。

其他回答

我通常使用其他工具来执行这项任务,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 Dired, t标记所有文件,Q查询替换所有文件中的文本。 在执行query-replace命令之前,可以使用i命令展开子目录。 我添加的关键信息是,如果你给I命令加一个前缀(control-u), 它会提示你输入arg,而-R参数会递归展开所有子dirs 进入干燥的缓冲器。所以现在您可以查询搜索整个目录中的每个文件。

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

投射弹真的很不错: C-c pr执行投射-替换命令

所提供的答案都很棒,但是我认为我应该添加一个稍微不同的方法。

这是一个更具交互性的方法,需要wgrep, rgrep和iedit。iedit和wgrep都必须通过MELPA或Marmalade安装(使用M-x package-list-packages)

首先运行M-x rgrep查找要查找的字符串。

您将能够指定文件类型/模式和递归的文件夹。

接下来你需要运行wgrep,用C-s C-p启动它。

Wgrep会让你编辑rgrep结果,所以在字符串上设置一个区域来匹配并使用C-启动iedit-mode;(取决于你的终端,你可能需要重新绑定这个)

所有事件都可以立即编辑。C-x C-s来提交wgrep。然后是c x s !保存已更改的文件。

这种方法的主要好处是可以使用iedit-mode关闭某些匹配M-;。您还可以使用rgrep中的结果跳转到文件中,例如,如果您有一个意外的匹配。

我发现它对于在项目中进行源代码编辑和重命名符号(变量,函数名等)非常有用。

如果你还不知道/不使用iedit模式,这是一个非常方便的工具,我强烈建议你去看看。