En vim, a veces tengo la oportunidad de reemplazar las primeras apariciones de un partido en una línea, pero no todas las que quisiera lo g
harían. p.ej:
a a a a a
a
b b b a a
Sé que podría usar :s/a/b/[enter]:[up][enter]:[up][enter]
, pero eso es bastante tedioso en tres repeticiones, tengo líneas con potencialmente más de 10 sustituciones.
He intentado:
:s/a/b/3g
: vim se quejó de los caracteres finales.:s/a/b/3
: cambia la primera aparición en esta y las siguientes dos líneas.3:s/a/b
: Igual que el anterior.:s/a/b/g3
: cambia todas las apariciones en esta y las dos líneas siguientes.:3s/a/b
: cambia la primera aparición en la línea 3.:/a/,3/a/s/a/b
: cambia la primera aparición en cada línea entre la siguientea
y la tercera línea que contienea
el archivo (solicitando revertir si es necesario).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: cambia la primera aparición en cada línea entre esta y la siguiente con 3a
s (y esto no habría sido fácilmente extensible a una búsqueda de varios caracteres).
Y varios otros patrones de direccionamiento, ninguno de los cuales funcionó. Debo decir que he aprendido bastante sobre el :s
comando que intenta encontrar una respuesta a este problema, pero aún no lo he resuelto.
Alguien sabe cómo hacer esto?
(puntos de bonificación para un rango específico, por ejemplo, del segundo al cuarto caso)
n
y.
, aunque no pensé en usarlos aquí. Sin duda una mejora, gracias.s/a/=something/
debería hacer el truco (:help sub-replace-=
). No soy lo suficientemente fluido en Vim para escribir desomething
inmediato.:[up][enter]
se puede reemplazar con&
, lo que aún no es ideal, pero al menos es menos doloroso.Respuestas:
Sobre la base de la
:s/pattern/replacement/gc
idea de Samus_ (que parece ser la forma más sencilla de garantizar un funcionamiento correcto cuando el patrón está contenido dentro de la cadena de reemplazo), para reemplazar las ocurrencias segunda a cuarta en una sola línea:feedkeys()
es una función que introduce la cadena de entrada en la cola de entrada del teclado. El punto es hacer el conteo por adelantado para que no tenga que preocuparse por perder el conteo o ser interrumpido.Para un caso más general, para reemplazar las ocurrencias de Mth a Nth en una sola línea para N mayor o igual que una M muy grande :
Reemplace M y N con los valores que desee (incluso puede dejar
vim
hacer la aritmética mental trivial si no quiere hacerlo usted mismo). Tenga en cuenta que.
es el operador de concatenación de cadenas de VimL. Obviamente, esto solo ahorra pulsaciones de teclas para M grandes . Si usa esta funcionalidad con frecuencia, puede ahorrarle tiempo colocar lo anterior en un comando o función personalizada de algún tipo, ya que es bastante difícil de escribir.fuente
Para la primera pregunta que haría:
El segundo es más complicado, no sé cómo hacerlo automáticamente, pero puedes hacer que vim te pregunte en cada partida de esta manera:
Luego responde "no" a las primeras n coincidencias y "sí" a las demás.
fuente
c
, esa podría ser la mejor solución propuesta hasta ahora. Todavía tendría que contar, pero creo que es la primera opción que funcionaría con reemplazos que contienen la cadena de búsqueda.fuente
Creo que esto podría funcionar, reemplazar primero, luego repetir 2 veces:
fuente