如何在emacs中跨所有缓冲区执行“M-x replace-string”命令?
如何在emacs中跨所有缓冲区执行“M-x replace-string”命令?
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))
感谢Trey在这方面提到了Icicles缓冲区搜索。
我也要提到Dired中的Q (dired-do-query-replace
)。非常方便。请注意,您可以使用诸如以下键(还有更多)轻松标记Dired中的文件集:
dired-mark-files-regexp
) -- 标记名称与正则表达式匹配的文件dired-mark-files-containing-regexp
) -- 标记内容与正则表达式匹配的文件dired-mark-extension
) -- 标记具有相同扩展名(例如,.el
)的文件请确保加载标准库dired-x.el
(以及可能的dired-aux.el
)。
我很久以前在一个网站上找到了这个,抱歉我不记得来源了。 如果你发现一个只读缓冲区,它会停止,所以要小心。
只需将此放置在您的 .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)))))
M-x ibuffer RET t Q
命令,您也可以交互地进行相同的操作,并有机会确认每个替换。 - JS.