如何在Emacs中跨所有缓冲区使用"M-x replace-string"命令?

27

如何在emacs中跨所有缓冲区执行“M-x replace-string”命令?

4个回答

23

M-x ibuffer 回车 t U

但你可能希望比这更加严格,因为如果它不能进行替换 - 例如遇到只读的Dired缓冲区包含匹配的文件名时,它会中止。

C-hm 在ibuffer中阅读模式帮助,并学习如何轻松标记您感兴趣的缓冲区。

编辑: 可以通过修改原始定义来轻松编写 ibuffer-do-replace-regexp 的非正则表达式版本:

;; defines ibuffer-do-replace-string
(define-ibuffer-op replace-string (from-str to-str)
  "Perform a `replace-string' in marked buffers."
  (:interactive
   (let* ((from-str (read-from-minibuffer "Replace string: "))
          (to-str (read-from-minibuffer (concat "Replace " from-str
                                                " with: "))))
     (list from-str to-str))
   :opstring "replaced in"
   :complex t
   :modifier-p :maybe)
  (save-window-excursion
    (switch-to-buffer buf)
    (save-excursion
      (goto-char (point-min))
      (let ((case-fold-search ibuffer-case-fold-search))
        (while (search-forward from-str nil t)
          (replace-match to-str nil t))))
    t))

谢谢,但这似乎并不完全等同于 replace-string。r-s 会将 \ 解析为字面值,而 U 则作为正则表达式语法来解析。 - The Unfun Cat
非常正确,这是一个正则表达式替换函数,并没有内置字符串变量,所以你需要处理正则表达式,或者你可以定义类似的函数。我会在答案中添加一个。 - phils
7
另外,通过执行 M-x ibuffer RET t Q 命令,您也可以交互地进行相同的操作,并有机会确认每个替换。 - JS.

3

感谢Trey在这方面提到了Icicles缓冲区搜索

我也要提到Dired中的Q (dired-do-query-replace)。非常方便。请注意,您可以使用诸如以下键(还有更多)轻松标记Dired中的文件集:

  • % m (dired-mark-files-regexp) -- 标记名称与正则表达式匹配的文件
  • % g (dired-mark-files-containing-regexp) -- 标记内容与正则表达式匹配的文件
  • * . (dired-mark-extension) -- 标记具有相同扩展名(例如,.el)的文件

请确保加载标准库dired-x.el(以及可能的dired-aux.el)。


3

有很多不同的选择,这取决于您想如何处理。

请查看Emacs Wiki上的SearchBuffers。其中值得关注的是moccur-edit和icicles。


1

我很久以前在一个网站上找到了这个,抱歉我不记得来源了。 如果你发现一个只读缓冲区,它会停止,所以要小心。

只需将此放置在您的 .emacs 文件中即可。

(defun query-replace-in-open-buffers (arg1 arg2)
  "query-replace in open files"
  (interactive "sQuery Replace in open Buffers: \nsquery with: ")
  (mapcar
   (lambda (x)
     (find-file x)
     (save-excursion
       (beginning-of-buffer)
       (query-replace arg1 arg2)))
   (delq
    nil
    (mapcar
     (lambda (x)
       (buffer-file-name x))
     (buffer-list)))))

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