如何在 Emacs 中搜索/替换整个缓冲区的字符串而不返回到开头?

如何在 Emacs 中搜索/替换整个缓冲区的字符串而不返回到开头?

先回到缓冲区顶部然后再进行搜索/查询确实很不方便。好吧,对于搜索来说,这相对简单,您只需再按C-s一次即可绕回,但对于查询/替换来说,这很繁琐。

有没有什么简单的办法可以做到这一点,而不需要返回缓冲区顶部进行这两项操作?

答案1

嗯,看来你不能(摘自这里(重点是我的):

要将 point 之后的每个 'foo' 实例替换为 'bar',请使用命令 Mx replace-string 和两个参数foobar替换仅在点之后发生,因此如果要覆盖整个缓冲区,必须先转到开头

就我个人而言,我会将缓冲区分成两部分 ( C-x 2),转到顶部 ( C-Home),然后运行替换命令,切换回原始窗格 ( C-x o),然后关闭第二个窗格 ( C-x 0)。不知道是否有技巧可以使它更简单。

答案2

(defun my-replace-string ()
  (interactive)
  (save-excursion
    (beginning-of-buffer)
    (call-interactively 'replace-string)))

答案3

我用编辑为此。非常有用。

答案4

我在 Emacs 24+ 中使用了以下方法:

;; query replace all from buffer start
(fset 'my-query-replace-all 'query-replace)
(advice-add 'my-query-replace-all
            :around
            #'(lambda(oldfun &rest args)
               "Query replace the whole buffer."
               ;; set start pos
               (unless (nth 3 args)
                 (setf (nth 3 args)
                       (if (region-active-p)
                           (region-beginning)
                         (point-min))))
               (unless (nth 4 args)
                 (setf (nth 4 args)
                       (if (region-active-p)
                           (region-end)
                         (point-max))))
               (apply oldfun args)))
(global-set-key "\C-cr" 'my-query-replace-all)

考虑区域替换情况以及传递的任何 START 和 END 参数。

相关内容