Cómo reemplazar más de un carácter sin ingresar al modo de inserción


12

Tengo un archivo con una línea que se ve así:

foofoo.xy.barbar

Quiero cambiar el xya gh. Traté de hacer 2r-> gh, pero obviamente eso no funcionó, ya que reemplazó xycon ggy luego moví mi cursor un punto hacia la izquierda.

¿Hay alguna manera de hacer esto sin ingresar al modo de inserción, o sin usar muchas más pulsaciones de teclas (por ejemplo :s/xy/gh/)?


2
Rentra en modo de reemplazo. :help replace-modepara más información.
alxndr

Probé vt.rgh. Pero el resultado fue el mismo que el suyo excepto por la posición del cursor.
Gonçalo Ribeiro

2
¿Por qué no quieres ingresar al modo de inserción? Algo así cwgh<esc>funcionaría bien.
Pomo de la puerta

1
@ durron597 No estoy seguro de si minimize-keystrokeses una etiqueta bien, normalmente no es realmente lo que la pregunta es acerca de , como tal. (Rechacé tus ediciones propuestas) ... ¿Tal vez deberías discutir en meta?
Martin Tournoij

Respuestas:


19

Si el nuevo texto tiene la misma longitud que el texto anterior, el modo de reemplazo de Vim es una opción. Desde el modo normal, R(que es una "r" mayúscula) lo lleva al modo de reemplazo. Esto es similar a "sobrescribir" en algunos otros editores de texto: en lugar de insertar nuevos caracteres como en el modo de inserción, la escritura reemplazará el carácter debajo del cursor y luego avanzará al siguiente cursor. (Piense en minúsculas r, pero para más de un solo carácter a la vez). Busque la documentación para el modo de reemplazo con :help replace-mode.

En su caso: con el cursor entre el .y el x, ingrese al modo de reemplazo presionando R. Ahora, cuando escribe g, reemplaza la "x" y pasa al siguiente carácter, por lo que puede escribir hpara reemplazar la "y". Su edición está hecha ahora, Escapepara volver al modo normal.

(Esto funciona cuando su texto de reemplazo tiene la misma longitud que el texto anterior, pero si su reemplazo es más largo o más corto, cpodría ser todo lo que necesita: reemplazará 1 el texto dentro de un movimiento, con el texto que luego escribe. muchas maneras de hacer uso c, por ejemplo: con el cursor entre el .y x, ct.ABCEscapedice a c ambiar el texto (hasta ' t il siguiente .) con 'ABC').


1 Tirará del texto en el movimiento hacia el nombre / "registro sin nombre y luego cambiará al modo de inserción, para que pueda escribir algo para reemplazarlo, y luego Escapevolver al modo normal.


2
Esto funciona para este caso. ¿Qué pasaría si quisieras reemplazar esos 2 caracteres por decir 3 caracteres?
Gonçalo Ribeiro

1
Buena pregunta; modificado para incluir una forma de manejar texto de diferente longitud.
alxndr

Sí, lo sé de esa manera. Pero de esa manera ingresas al modo Insertar y tenía curiosidad por ver si había una manera de no usar el modo Insertar en ese caso. No es que me parezca muy útil (y sin embargo podría estar equivocado).
Gonçalo Ribeiro

1
Prefijo con un número npara reemplazar hasta la nenésima aparición del personaje objetivo. Esto es útil para reemplazar partes de etiquetas con el formato w_x_y_zy a-b-c-d. Use en flugar de teliminar también el carácter limitante.
pkfm

5

Hay un par de formas en que podría hacer esto, pero la más simple que se me ocurre es:

TL; DR

fxcw<REPLACEMENT TEXT>

Explicación

  • fxte salta a la x (ver help *f*)
  • cwdice cambiar la palabra (ver :h *c*, :help *w*y :help cwpara más información), eliminar el texto "xy" e ingresar al modo de inserción, permitiéndole poner lo que quiera allí mismo.
  • <TEXTO DE REEMPLAZO> es lo que quiera reemplazar con - "gh" en su ejemplo.

Una ventaja de este enfoque es que utiliza comandos de navegación y manipulación de texto muy utilizados. Otra es que "xy" podría ser de cualquier longitud, y esto aún funcionaría.

Las cwobras porque el objeto de texto está rodeado por puntos ( .), que actúan como un límite a la palabra.

Si su cursor ya está en el carácter "y" (o cualquier carácter en el texto que se va a reemplazar), puede usarlo ciw<REPLACEMENT TEXT>. Esto le dice a vim que cambie la palabra en la que se encuentra, incluso si no está al principio. Consulte :help text-objectspara obtener más información ciwy objetos de texto en general.


¿No lo colocará en modo de inserción?
elyashiv

1
Ah, no entendí esa parte de su pregunta. En ese caso, sí, R es la solución más adecuada.
Cody Poll

3

Modo de reemplazo:

Rgh<Esc>

es la solución más obvia si el reemplazo tiene la misma longitud que el original pero también puede hacer:

2sgh<Esc>

o:

cegh<Esc>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.