La sustitución global de Vim no sustituye todas las coincidencias en una línea

12

a veces mis subtusiones globales no sustituyen todas las coincidencias en una línea. Está confirmado por el hecho de que puedo verlo cuando hago sustituciones con confirmación, una coincidencia se encuentra en una línea con múltiples coincidencias posibles, pero luego pasa a otra línea.

Utilizo los parámetros go gcque operan en todo el archivo con %.

En este archivo:

hello hello
hello
hello hello hello
hello

Si lo hago %s/hello/goodbye/gme sale

goodbye hello
goodbye
goodbye hello hello
goodbye

Todo lo que tengo en mi .vimrcbúsqueda / reemplazo es

set hlsearch
set ignorecase
set incsearch
Nicolas Scotto Di Perto
fuente
3
Por favor, danos un ejemplo del mundo real y muéstranos tu vimrc.
romainl
2
¿Cuál es el resultado :echo &gdy qué sucede si agrega una segunda gbandera como esta: %s/hello/goodbye/ggo si elimina la gbandera por completo? Si la salida de :echo &gdes 1, intente agregar set nogdefaultal final de su vimrc.
user9433424
1
¡Multa! No sé por qué, pero por defecto estaba configurado en 0, así que agregué set nogdefaultcomo dijiste y funciona, por cierto. ¡Gracias!
Nicolas Scotto Di Perto

Respuestas:

12

Tal vez usted, o un complemento, haya habilitado la opción 'gdefault'. Esta opción agrega la bandera gautomáticamente cada vez que realiza una sustitución.

Entonces, cuando agrega manualmente la bandera gmientras 'gdefault'está habilitada, es como si tuviera 2 gbanderas que tienen el mismo efecto que ninguna. Por lo tanto, Vim solo sustituye la primera aparición del patrón en cada línea.

Por defecto, esta opción está desactivada, pero para asegurarse de que es, usted podría agregar al final de su vimrc: set nogdefault.

Alternativamente, si sospecha que un complemento podría haber habilitado la opción, puede rastrearlo con: verb set gd?

O podría acostumbrarse a la opción, lo que significa que cuando desea sustituir todas las apariciones de un patrón, no agrega la gbandera (porque gdefaultya lo hizo), y cuando solo quiere sustituir la primera aparición del patrón en una línea, agrega la gbandera (porque 2 gbanderas son lo mismo que ninguna).

usuario9433424
fuente