Como pesquisar / substituir string por todo o buffer no Emacs sem voltar ao começo?

9

É realmente inconveniente voltar primeiro ao topo do buffer e fazer a pesquisa / consulta. Bem, para pesquisa, é relativamente simples que você pode simplesmente pressionar C-s mais uma vez para envolver, mas para consulta / substituição, é tedioso.

Qualquer hack simples para fazer isso sem voltar ao topo do buffer para ambas as operações?

shelper
fonte

Respostas:

6

Parece que você não pode (tirado de Aqui ênfase minha):

Para substituir todas as ocorrências de 'foo' após o ponto com 'bar', use o comando M-x replace-string com os dois argumentos foo e bar. Substituição ocorre apenas após o ponto, então se você quiser cobrir todo o buffer você deve ir para o começo primeiro .

Pessoalmente, eu divido o buffer em dois ( C-x 2 ), vá para o topo ( C-Home ) e, em seguida, execute o comando replace, volte para o painel original ( C-x o ) e depois matar o segundo ( C-x 0 ). Não sei se existe um truque para tornar isso mais simples.

terdon
fonte
4
(defun my-replace-string ()
  (interactive)
  (save-excursion
    (beginning-of-buffer)
    (call-interactively 'replace-string)))
Lri
fonte
Funciona muito bem, mas estraga a substituição da consulta na região / seleção (sempre faz no buffer inteiro).
Alex
0

Eu uso abaixo para trabalhar com o 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)

Considere o caso de substituição da região e quaisquer argumentos START e END transmitidos.

James Yang
fonte