Emacs如何在多个文件中使用正则表达式进行查找和替换(使用find-name-dired + Q),但不保存我的缓冲区?

15
我无法理解这里发生了什么。我已经在整个目录中进行了搜索和替换,使用以下步骤:
1. M-x find-name-dired RET 2. 选择项目的根目录 3. 输入*.rb作为要匹配的文件名 4. 按“t”选择所有找到的文件 5. 按“Q”(Shift Q)开始搜索/替换 6. 将“transaction”输入为查询,然后将“invoice”输入为替换
现在我已经循环遍历了它为我打开的所有缓冲区,在更改后有选择地按“y”或“n”。当它完成时,它只是让我停留在我最后更改的缓冲区。
因此,按C-z将emacs窗口置于后台并检查已更改的内容,显示没有保存任何文件,这是我预期的。
然后我执行M-x save-some-buffers RET,它告诉我没有要保存的文件。所以我开始用C-x b轮流查看我的缓冲区,并验证,与磁盘上的内容相比,缓冲区确实有更改。
因此,我重复了这个过程,这次使用完全新的emacs进程(当我启动进程时没有打开缓冲区)。最后,我有一堆打开的缓冲区,有更改(我可以看到),但是,再一次,Emacs表示没有需要保存的内容。
所以我尝试使用C-x C-b打开IBuffer。标记了我想要保存的所有文件,然后按“S”保存它们,此时它显示“操作完成;已保存27个缓冲区”。太棒了……但是git仍然告诉我emacs实际上没有保存任何内容。
我做错了什么?我想在整个项目中将“transaction”替换为“invoice”,尽管我确实需要交互式地进行,因为有些地方不应该进行此替换。
Emacs 23.

即使我进入这27个更改的缓冲区中的一个,然后按下C-x C-s,它会说没有需要保存的内容,但实际上是有的。如果我接着按空格键,然后再删除空格字符,最后再按C-x C-s,现在就可以保存了(git显示更改)。这是怎么回事? - d11wtq
有没有办法告诉emacs强制考虑所有缓冲区都是脏的?如果它认为缓冲区是脏的,那么它将愉快地保存它,但我必须在每个缓冲区上键入才能使其发生。 - d11wtq
2
C-u M-~ 将标记当前缓冲区为已修改。 - Teddy
谢谢,我已经在一个缓冲区中成功地使用了这个。有没有办法在所有缓冲区中执行此操作?我不明白Emacs是如何处于这种状态的,但如果每次使用查找和替换时都会发生这种情况,那么遍历所有27个缓冲区并重复该按键组合似乎不是一个好的解决方案 :P - d11wtq
我会使用 M-x list-buffers(C-x C-b),并编写一个宏来选择一个缓冲区,执行 C-u M-~,然后选择下一个缓冲区。接着,只需迭代该宏 27 次即可。 - Teddy
1个回答

6
我已经重现了您描述的行为。 对我来说,这确实像是一个错误。 请在bug-gnu-emacs@gnu.org上报告它。
Emacs的贡献者非常敏感。
附:喜欢你在问题中提供的细节。

已经报告了这个问题,并从git检出了emacs,构建了当前的HEAD版本,现在似乎工作正常。我猜这可能是23.3.1稳定版的问题。 - d11wtq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接