¿Cómo reemplazar parcialmente el texto en un bloque de texto seleccionado?

14

No es fácil encontrar un buen título para mi problema.

Soy consciente de insertar delante de un bloque de texto:

Ctrl- v seleccione líneas I escriba texto ESC

Ahora me gustaría hacer esto, pero también reemplazando una parte en mi selección de bloque. Actualmente estoy haciendo dos operaciones

Ctrl- v seleccione bloque x volver a empezar

Seguido por la secuencia que mencioné anteriormente.

¿Hay alguna forma de combinar estas dos operaciones seleccionando ( Ctrl- v) el bloque solo una vez?

Aquí hay un pequeño ejemplo:

Me gustaría transformar el siguiente bloque

1  text
2  text
3  text
4  text
5  text

dentro

new text 
new text 
new text 
new text 
new text

haciendo solo una "operación".

Patrick B.
fuente
1
No estoy 100% seguro de lo que quieres, quizás un ejemplo real sería útil (lo que tienes frente a lo que quieres). ¿Eres consciente de gv? Vuelve a seleccionar la última selección visual y puede ser de ayuda aquí.
PhilippFrank

Respuestas:

21

Escribir cdespués de seleccionar su bloque en lugar de xeliminará el texto en el bloque de selección e ingresará al modo de inserción. Una vez que escriba algo y salga del modo de inserción, debería tener el mismo cambio en cada línea.

Tratar

Ctrl- v- seleccione bloque - c- inserte lo que sea -Esc

Dumitru
fuente
1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

Imagine una fila de tres letras mayúsculas diferentes como la de arriba. ^Vseleccionando lo anterior, no pude cambiar todos los de Ala última letra de la fila debido a las líneas de longitud desiguales. Las letras mayúsculas anteriores funcionaban bien con :s/\%V1/T/g "La letra mayúscula anterior era una T hecha de '1'. Cambiar /T/a lo que sea.

Pero al seleccionar la última letra de bloque que se muestra arriba, solo cambió todos los '1' a 'A' hasta el punto de la A *, y el resto permaneció como uno.

* La línea más corta.

Para hacer que todas las líneas tengan la misma longitud, las rellené con espacios. (Soy nuevo en vim, así que estoy seguro de que se podría escribir un mejor guión).

Nota: El pico de la A comenzó en la línea 2.

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

Después de esto, :s/\%V1/T/g funcionó según lo anunciado en la última letra de molde en la fila.

PD: Leí que la executelínea de arriba debería funcionar sin los puntos, pero no me funcionó.

Ron
fuente
La línea de ejecución, vaya al comienzo de la fila i de la letra de molde y agregue espacios b al final de la línea. 'b' es la diferencia de longitud entre la línea actual y la línea más larga.
Ron