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.
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))))
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)
:%s/foo/bar
Respuestas:
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.fuente
transient-mark-mode
está activado. DeC-SPC C-SPC
lo contrario , se habilitará temporalmentetransient-mark-mode
Puede agregar el siguiente comando a su archivo de inicialización de emacs y vincularlo a la combinación de teclas que elija.
fuente
Puedes seguir los siguientes pasos:
C-x h
- Seleccione todo el búfer oM-<
- Vaya a la parte superior del búferM-%
- Iniciarquery-replace
!
- La fuerza reemplaza todoC-u C-SPC C-u C-SPC
- Vuelve a tu posición inicialfuente
Puede agregar esto a su
init.el
archivo para actualizar el comportamiento deM-%
a para reemplazar la palabra en todo el búfer de forma predeterminada:Y para obtener el mismo comportamiento de
query-replace-regexp
:fuente
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 ejemploC-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.
fuente
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.
fuente