Como pesquisar e substituir em todo o buffer?

17

A busca e substituição, por M-%e !, é feita da posição atual até o final do buffer. Como posso fazer isso para todo o buffer? Obrigado.

StackExchange for All
fonte
2
Sugiro alterar o título para "pesquisar e substituir o buffer inteiro". Globalmente, também pode estar se referindo a projetos inteiros.
Malabarba 25/09
1
Esta é uma área em que é difícil vencer o Vim / Evil::%s/foo/bar
shosti
@shosti: Na verdade, acho que seu método exige mais pressionamentos de tecla. Apenas sayin ;-)
nispio

Respostas:

14

Não vejo isso apoiado enquanto ainda retendo sua posição inicial. (Não vejo uma maneira de avançar para o início do buffer quando a pesquisa chegar ao fim.)

Sua melhor aposta é usar M-<para ir para o início do buffer e query-replace, quando terminar, pressione C-uC-spaceC-uC-spacepara voltar ao ponto de partida.

Jordon Biondo
fonte
1
Isso funciona quando transient-mark-modeestá ativado. Caso contrário, C-SPC C-SPCserá ativado temporariamentetransient-mark-mode
nispio 25/09/14
5
Não é necessário definir a marca manualmente com o C-SPC. M- (e muitos outros comandos que potencialmente "avançam muito") fazem isso por você.
Mathias Dahl
9

Você pode adicionar o seguinte comando ao seu arquivo de inicialização do emacs e vinculá-lo ao pressionamento de tecla de sua escolha.

(defun replace-regexp-entire-buffer (pattern replacement)
  "Perform regular-expression replacement throughout buffer."
  (interactive
   (let ((args (query-replace-read-args "Replace" t)))
     (setcdr (cdr args) nil)    ; remove third value returned from query---args
     args))
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward pattern nil t)
      (replace-match replacement))))
Sue D. Nymme
fonte
9

Você pode seguir as seguintes etapas:

  • C-x h- Selecione o buffer inteiro ou M-< - Vá para o topo do buffer
  • M-% - Iniciado query-replace
  • ! - Forçar substituir tudo
  • C-u C-SPC C-u C-SPC - Volte para a sua posição inicial
Kaushal Modi
fonte
Isso deve receber mais atenção.
Indra
3

Você pode adicionar isso ao seu init.elarquivo para atualizar o comportamento de M-%para substituir a palavra no buffer inteiro por padrão:

(defun my/query-replace (from-string to-string &optional delimited start end)
  "Replace some occurrences of FROM-STRING with TO-STRING.  As each match is
found, the user must type a character saying what to do with it. This is a
modified version of the standard `query-replace' function in `replace.el',
This modified version defaults to operating on the entire buffer instead of
working only from POINT to the end of the buffer. For more information, see
the documentation of `query-replace'"
  (interactive
   (let ((common
      (query-replace-read-args
       (concat "Query replace"
           (if current-prefix-arg " word" "")
           (if (and transient-mark-mode mark-active) " in region" ""))
       nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
       (if (and transient-mark-mode mark-active)
           (region-beginning)
         (buffer-end -1))
       (if (and transient-mark-mode mark-active)
           (region-end)
         (buffer-end 1)))))
  (perform-replace from-string to-string t nil delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map "%" 'my/query-replace)

E para obter o mesmo comportamento de query-replace-regexp:

(defun my/query-replace-regexp (regexp to-string &optional delimited start end)
  "Replace some things after point matching REGEXP with TO-STRING.  As each
match is found, the user must type a character saying what to do with
it. This is a modified version of the standard `query-replace-regexp'
function in `replace.el', This modified version defaults to operating on the
entire buffer instead of working only from POINT to the end of the
buffer. For more information, see the documentation of `query-replace-regexp'"
  (interactive
   (let ((common
      (query-replace-read-args
       (concat "Query replace"
           (if current-prefix-arg " word" "")
           " regexp"
           (if (and transient-mark-mode mark-active) " in region" ""))
       t)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
       (if (and transient-mark-mode mark-active)
           (region-beginning)
         (buffer-end -1))
       (if (and transient-mark-mode mark-active)
           (region-end)
         (buffer-end 1)))))
  (perform-replace regexp to-string t t delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map [?\C-%] 'my/query-replace-regexp)
nispio
fonte
Muito útil. Obrigado.
NVaughan
2

Se você usar Sincelos , poderá pesquisar e substituir todo o buffer (ou vários buffers, arquivos ou destinos de favoritos).

E ao contrário query-replace(por exemplo C-x h M-%):

  • Você pode navegar pelas correspondências em qualquer ordem .

  • A substituição está sob demanda: você não precisa visitar cada partida e responder se deve ou não substituí-la.

Desenhou
fonte
0

Esta é a solução que estou usando atualmente, que começa do início do buffer e voltará ao ponto antigo após a substituição.

(defun query-replace-from-top ()
  (interactive)
  (let ((orig-point (point)))
    (save-excursion
      (goto-char (point-min))
      (call-interactively 'query-replace))
    (message "Back to old point.")
    (goto-char orig-point)))
(bind-key* "M-%" 'query-replace-from-top)
CodyChan
fonte