Digamos que tenemos un texto, y entro en modo visual y selecciono un texto. ¿Cómo hago una búsqueda rápida del texto resaltado y lo reemplazo con otra cosa?
109
Intente ejecutar lo siguiente o ponerlo en su .vimrc
vnoremap <C-r> "hy:%s/<C-r>h//gc<left><left><left>
Al presionar ctrl+ ren el modo visual, se le pedirá que ingrese el texto para reemplazarlo. Presione entery luego confirme cada cambio con el que esté de acuerdo yo rechace n.
Este comando anulará su registro h
para que pueda elegir otro (cambiando h
el comando anterior a otra letra minúscula) que no utilice.
c
engc
, sustituya a la vez que se hace en todo el búfer. Si cometió un error y desea revertirlo, simplemente escribau
en modo comando. Me gusta más este enfoque que confirmar cada uno de los reemplazos (eso sucede con elc
modificador).vmap * y:let @/ = @"<CR>
seleccionado está resaltado.<left><left><left>
?c
degc
, también tendrá que eliminar uno de los<left>
del final de la línea.Esta búsqueda de mapeo rápida y simple para texto resaltado visualmente (sin sobrescribir el registro h) y sin usar el registro + dependiente del terminal:
Si no le gusta ctrl-f cámbielo a su preferencia
Una vez que el texto está resaltado, siempre puede hacer una
s
sustitución simplemente escribiendo:... porque una búsqueda en blanco en el
s
comando usa la última cadena buscada.fuente
control+f
siempre selecciono el siguiente carácter, así como lo que seleccioné visualmente. ¿Algunas ideas?%s//<your-replacement-string>
no parece funcionar para resaltar algo como/tmp/file
. simplemente se convierte en<your-replacement-string>/tmp/file
Este también funciona (al menos para selecciones en una sola línea / selecciones que no contienen ningún carácter especial)
y
:s/<C-r>0/
0
es el registro de yank.Como mencionaron otras personas, hay formas más rápidas de hacer esto, pero si acaba de empezar a aprender Vim (como yo), esta es una de las formas "genéricas".
// editar: Me acabo de dar cuenta de que el enfoque de 'registro' fallará si hay caracteres como pestañas o nuevas líneas o
/
caracteres en la selección (tendría que procesar manualmente esos caracteres de alguna manera para que el:s
comando funcione):fuente
La respuesta aceptada funciona muy bien a menos que tenga caracteres especiales en su selección visual. Hackeé dos scripts (el de Jeremy Cantrell publicado aquí y el de Peter Odding ) para crear un comando que le permitirá seleccionar visualmente una cadena que desee encontrar incluso si tiene caracteres especiales de expresión regular.
He incluido esto en mi vimrc si es más útil para alguien.
fuente
vmap <C-r> <Esc>:%s/<c-r>=GetVisual()<cr>//g<left><left>
(que simplemente reemplaza todo en el archivo)Desde Vim 7.4, puede usar el
gn
movimiento que selecciona regiones de texto que coinciden con el patrón de búsqueda actual.Después de usar
cgn
para cambiar el texto en la coincidencia seleccionada actualmente (odgn
para eliminar), en el modo normal, puede usar.
para repetir el comando y operar en la siguiente coincidencia.Hay un episodio de Vimcast que muestra esta función.
fuente
Mykola Golubyev, ¡Gracias por la sugerencia! A continuación se usa el registro "+" que (dependiendo de su terminal) ya contiene el texto resaltado, ahorrándose el uso del registro "h".
fuente
De http://vim.wikia.com/wiki/Search_and_replace_in_a_visual_selection :
Cuando el texto esté seleccionado visualmente, presione: para ingresar un comando. La línea de comando ingresará automáticamente al rango:
Puede ingresar un comando como s / red / green / g para reemplazar cada rojo con verde en todas las líneas de la última selección visual. El comando aparecerá como:
Para repetir un comando Ex sobre un bloque previamente seleccionado, use el: historial. Es decir, presione: luego, luego edite un comando anterior.
fuente
Tengo esto en mi vimrc:
Esto tomará la selección visual e iniciará un comando de sustitución con ella.
EDITAR: Debo señalar que esto no funciona con selecciones visuales multilínea. Si bien GetVisual () no tiene problemas para devolverlo, no estoy seguro de cómo colocarlo correctamente en la línea de comandos. Si alguien tiene algún consejo sobre cómo podría hacer esto, por favor comente.
fuente
No creo que puedas hacer esto de inmediato. Pero a mucha gente le gusta esta función, así que hay toneladas de macros y cosas así (yo mismo la agregué). Aquí hay uno que puede agregar, por ejemplo; simplemente presione
*
para buscar la siguiente coincidencia en el texto seleccionado visualmente.fuente
Otras respuestas son buenas pero no escapan a los caracteres especiales. La respuesta de @brian kennedy muestra un método para escapar pero requiere mucho código. En el caso de una URL, por ejemplo, el escape es obligatorio o la búsqueda se detendrá en ":".
Como está escrito en vim.fandom.com/wiki/Search_for_visually_selected_text , puedes hacer un delineador para buscar y escapar algunos caracteres. Puedes escapar de los personajes que quieras, yo elegí escapar
/\:
:Con este mapa, debo presionar
//
en modo visual para buscar el texto seleccionado actualmente en todo el búfer.fuente
Mi versión corta favorita de esto es
vnoremap s / y: s / "/
Luego puede resaltar una selección y simplemente presionar s / para iniciar un comando de sustitución para ella.
fuente
"
como literal.<c-r>"
aunque funcionóNo tengo el representante para comentar, así que estoy agregando otra respuesta ...
vnoremap <C-r> "0y<Esc>:%s/<C-r>0//g<left><left>
@dmd y @dotancohen: esto funcionó para mí sin consumir
"h
(usa explícitamente 0, que es la última posición de tirón de todos modos) y funciona con putty ssh -> mint (lmde); no sé sobre ciento. También utiliza los comentarios de @Niloct y @Nathan Friend para eliminar la confirmación.fuente
Ejemplo 1. Citar la selección con estrellas, mantener el cursor al inicio de la selección.
Ejemplo 2. Canalice el texto seleccionado con base64:
Explicación LHS:
Explicación RHS:
fuente
Tenía la esperanza de que hubiera una forma incorporada en Vim para reemplazar una palabra, sin tener que volver a escribir la palabra en primer lugar. La hay, aunque solo funcionará para texto hasta un carácter de límite de palabra.
Una vez que haya pasado el mouse sobre la palabra, presione
*
o#
para resaltar la palabra y salte a la ubicación anterior / siguiente de la misma (si no desea cambiar las ubicaciones en el archivo, presione la tecla opuesta para volver a la ubicación estabas en).Entonces simplemente escriba:
%s//<your-replacement-string>
Como se menciona en la respuesta de otra persona, si
%s
recibe una entrada en blanco entre las barras, entonces usa la palabra buscada anteriormente. Al presionar*
o#
, está buscando la palabra debajo del cursor que la convierte en la palabra buscada más recientemente.Al final, son solo seis o siete pulsaciones de teclas + la longitud de la palabra de reemplazo para realizar esto y no requiere macro ni edición de su
.vimrc
.fuente