¿Cómo buscar y reemplazar en todo el búfer?

17

La búsqueda y reemplazo, por M-%y !, se realiza desde la posición actual hasta el final del búfer. ¿Cómo puedo hacerlo para todo el búfer? Gracias.

StackExchange para todos
fuente
2
Sugiero cambiar el título a "buscar y reemplazar todo el búfer". A nivel mundial también podría referirse a proyectos completos.
Malabarba
1
Esta es un área donde Vim / Evil es difícil de superar::%s/foo/bar
shosti
@shosti: En realidad, creo que su método requiere más pulsaciones de teclas. Solo
digo

Respuestas:

14

No creo que eso sea compatible mientras sigo manteniendo su posición inicial. (No veo una forma de ajustarse al principio del búfer cuando la búsqueda llega al final).

Su mejor opción es usar M-<para ir al inicio del búfer, luego query-replace, cuando haya terminado, presione C-uC-spaceC-uC-spacepara volver al punto de partida.

Jordon Biondo
fuente
1
Esto funciona cuando transient-mark-modeestá activado. De C-SPC C-SPClo contrario , se habilitará temporalmentetransient-mark-mode
nispio
55
No es necesario establecer la marca manualmente con C-SPC. M- <(y muchos otros comandos que potencialmente "mueven el punto muy lejos") lo hacen por usted.
Mathias Dahl
9

Puede agregar el siguiente comando a su archivo de inicialización de emacs y vincularlo a la combinación de teclas que elija.

(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
fuente
9

Puedes seguir los siguientes pasos:

  • C-x h- Seleccione todo el búfer o M-< - Vaya a la parte superior del búfer
  • M-% - Iniciar query-replace
  • ! - La fuerza reemplaza todo
  • C-u C-SPC C-u C-SPC - Vuelve a tu posición inicial
Kaushal Modi
fuente
Esto debería llamar más la atención.
Indra
3

Puede agregar esto a su init.elarchivo para actualizar el comportamiento de M-%a para reemplazar la palabra en todo el búfer de forma predeterminada:

(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)

Y para obtener el mismo comportamiento 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
fuente
Muy útil. Gracias.
NVaughan
2

Si usa Icicles , puede buscar y reemplazar todo el búfer (o múltiples búferes o archivos u objetivos de marcadores).

Y a diferencia de query-replace(por ejemplo C-x h M-%):

  • Puede navegar por los partidos en cualquier orden .

  • El reemplazo es bajo demanda: no necesita visitar cada partido y responder si debe reemplazarlo o no.

Dibujó
fuente
0

Esta es la solución que estoy usando actualmente, comienza desde el comienzo del búfer y volverá al punto anterior después de reemplazarlo.

(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
fuente