当前位置:  开发笔记 > 编程语言 > 正文

使用Emacs以递归方式查找和替换尚未打开的文本文件

如何解决《使用Emacs以递归方式查找和替换尚未打开的文本文件》经验,为你挑选了7个好方法。

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

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

只使用Emacs的本身(在Windows XP),而不调用任何外部工具,如何更换所有在酒吧\nbaz FOO\NBAR *.c,并*.h在某些文件夹中的文件和它下面的所有文件夹.也许Emacs不是最好的工具,但是如何通过最小的命令轻松完成?



1> Chris Conway..:

    M-x find-name-dired:系统将提示您输入根目录和文件名模式.

    t对于找到的所有文件,按"切换标记".

    Q"查询替换文件...":系统将提示您输入查询/替换正则表达式.

    继续如下query-replace-regexp:SPACE替换并转移到下一场比赛,n跳过比赛等.

    C-x s保存缓冲区.(然后您可以按y,n!立即保存所有)


`Cx s!`一次保存所有文件.
不,这是递归的.非递归版本在dired-mode中为%m.
`M-,`继续搜索和替换(例如,如果文件在磁盘上更改,则"恢复文件"提示之后).
斯蒂恩,克里斯:可能不完全不是你想要的但你可以使用'Cx s'(保存一些缓冲区),它会提示你每个修改过的文件,所以你只需要多次点击'y'.
也许是因为你正在调用C:\ WINDOWS\system32\find.exe,而不是GNU find.

2> Frank Henard..:

M-x find-name-dired RET

所有文件可能需要一些时间才能显示在列表中,滚动到底部(M->)直到" find finished"出现以确保它们都已加载

t对于找到的所有文件,按"切换标记"

Q"查询替换文件...":系统将提示您输入查询/替换正则表达式.

继续执行query-replace-regexp:SPACE或y替换并移动到下一个匹配,n跳过匹配等.

输入!替换当前文件中的所有实例而不要求,N跳过所有可能的替换当前文件的其余部分.(N仅限emacs 23+)

要在不进一步询问的情况下对所有文件进行替换,请键入Y.

调用"ibuffer"(C-x C-b如果绑定到ibuffer,或M-x ibuffer RET)列出所有打开的文件.

键入* u以标记所有未保存的文件,键入S以保存所有标记的文件

* * RET取消标记所有标记,或键入D以关闭所有标记的文件

这个答案结合了这个答案,来自这个网站,以及我自己的笔记.使用Emacs 23+.


为什么`ibuffer`当你可以`Cx s`(`save-some-buffers`)并输入`!`?我不想咆哮,只是好奇.PS plus用于描述`!`,`N`和`Y`.
`ibuffer`默认不绑定到`Cx Cb`.
我个人建议人们*做*绑定`Cx Cb`到`ibuffer`,因为它比默认绑定好得多.只需将`(global-set-key(kbd"Cx Cb")'ibuffer)`添加到.emacs文件中.如果不这样做,请在上面的说明中使用`Mx ibuffer RET`.

3> Blair Conrad..:

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

窃取源文件的一部分:

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



4> ocodo..:

提供的答案很棒,但我想我会添加一个稍微不同的方法.

这是一个更加互动的方法,并要求wgrep,rgrepiedit.二者ieditwgrep必须通过MELPA或果酱(使用安装M-x package-list-packages)

首先M-x rgrep找到你要找的字符串.

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

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

Wgrep会让你编辑rgrep的结果,因此对字符串设定的区域相匹配,并开始iedit-modeC-;(取决于你的终端上,你可能需要重新绑定此)

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

此方法的主要好处是您可以使用iedit-mode切换某些匹配M-;.您还可以使用结果rgrep跳转到文件中,例如,如果您有意外匹配.

我发现在项目中进行源编辑和重命名符号(变量,函数名称等)非常有用.

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


启动wgrep的键绑定是Cc Cp btw。

5> eflanigan00..:

弹丸非常好:Cc pr运行命令projectile-replace



6> Alex Coventr..:

使用dired递归深层目录树对于此任务来说会有点慢.您可以考虑使用tags-query-replace.这确实意味着炮轰创建一个标签表,但这通常很有用,而且很快.



7> scrapcodes..:

信息来源:1

对于emacs专业版用户:

    调用dired列出目录中的文件,或者如果需要所有子目录,则调用find-dired。

    标记所需的文件。您可以通过键入?%m?来用正则表达式标记。

    键入Q以调用dired-do-query-replace-regexp。

    输入查找正则表达式并替换字符串。?? 常见的elisp正则表达式模式?

    对于每次出现,请键入y替换,输入n跳过。输入?Ctrl + g?中止整个操作。

    输入!要在不询问的情况下替换当前文件中的所有匹配项,请N跳过当前文件其余部分的所有可能替换。(N仅是emacs 23)

    要对所有文件进行替换而无需进一步询问,请键入Y。(仅适用于Emacs 23)

    调用ibuffer列出所有打开的文件。输入?* u?要标记所有未保存的文件,请键入S以保存所有已标记的文件,键入D以将其全部关闭。

Emacs初学者分步指南

选择目标文件

通过在命令行界面提示符中键入“ emacs”来启动emacs。(或者,如果您在“图形用户界面”环境中,则双击Emacs图标)

在目录中选择文件

首先,您需要选择要进行替换的文件。使用图形菜单“文件”?打开目录?Emacs将要求您提供目录路径。键入目录路径,然后按Enter。

现在,将显示文件列表,现在您需要标记要使正则表达式查找/替换可继续使用的文件。您可以通过将光标移动到所需文件来标记文件,然后按m。按下u取消标记。(要列出子目录,请将光标移动到目录并按i。子目录的内容将在底部列出。)要用正则表达式标记所有文件,请键入“%m”,然后键入您的正则表达式模式。例如,如果要标记所有HTML文件,则键入?%m?。然后是.html $。(您可以在图形菜单“标记”中找到标记命令的列表(当您处于转向模式时,将显示此菜单)。

在目录及其所有子目录中选择文件

如果要查找/替换目录中的文件(包括数百个子目录),请使用以下方法选择所有这些文件。

致电查找。(您可以通过按?Alt + x来调用命令),然后键入目录名称?/用户/玛丽/我的文件

注意:如果要在Unix非图形文本终端上使用emacs,并且?Alt + x?不起作用,等效的击键是“ Esc x”。

Emacs将提示您“ Run find(with args):”。如果需要对所有HTML文件进行替换,请键入-name“ * html”。如果您不关心哪种文件,而只关心该目录下的所有文件,请输入“ -type f”。

现在,如上所述标记文件。

交互式查找/替换

现在,您准备好进行交互式查找替换。为了简单起见,假设您只想用“ super”代替“ quick”。现在,调用dired-do-query-replace-regexp。它将提示您输入正则表达式字符串和替换字符串。输入“快速”,输入,然后输入“超级”。

现在,emacs将使用您的模式并检查文件,并在发生匹配时停止并向您显示。发生这种情况时,emacs会提示您,您可以选择进行更改或跳过更改。要进行更改,请键入y。要跳过,请键入n。如果您只是想让emacs继续并对当前文件进行所有此类更改,请键入!。

如果要取消整个操作而不保存所做的任何更改,请键入“ Ctrl + g”,然后使用菜单“文件”退出emacs。退出Emacs吗?

保存更改的文件

现在,在经历了上述考验之后,您还需要执行另一个步骤,那就是保存更改后的文件。

如果您使用的是emacs 22版或更高版本,请调用ibuffer进入缓冲区列表模式,然后键入?* u?标记所有未保存的文件,然后键入S保存所有文件。(就是shift-s)

如果使用的是emacs版本21,则可以执行以下操作:调用list-buffers,然后将光标移至要保存的文件并键入s。它将标记文件以供以后保存操作。输入u取消标记。完成后,键入x以执行所有标记为保存的文件的保存。(在emacs中,打开的文件称为“缓冲区”。忽略那里的其他内容。)

除了上述选项之外,您还可以调用save-some-buffers“ Ctrl + xs”。然后emacs将显示每个未保存的文件,并询问是否要保存。

注意:emacs的正则​​表达式与Perl或Python的正则表达式不同,但相似。有关摘要和常见模式,请参阅:Emacs Regex。


这个答案应该比我希望投票最多的答案更适合新手。顺便说一句,感谢我激励我把整个事情而不是链接。
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有