vim - siguiente - tutorial vi
Vim: Reemplazar una línea por otra antes tirada (14)
Esto tiene la desventaja adicional de que la línea X está ahora en el registro predeterminado, lo cual es molesto si encuentro otra línea que deba reemplazarse con A.
Para eliminar texto sin afectar los registros normales, puede usar el registro de agujeros negros "_
:
"_dd
Al menos una vez al día tengo la siguiente situación:
A: This line should also replace line X
...
X: This is line should be replaced
Creo que no realizo esa tarea de manera eficiente.
Lo que hago:
- Ir a la línea A: AG
- Yank línea A: yy
- Ir a la línea X: XG
- Pegar la línea A: P
- Mover a la línea anterior: j
- Eliminar la línea anterior: dd
Esto tiene la desventaja adicional de que la línea X está ahora en el registro predeterminado, lo cual es molesto si encuentro otra línea que debe reemplazarse con A. Alcanzar y pegar desde un registro adicional ( "ayy " , aP ) hace que esta simple tarea incluso menos eficiente.
Mis preguntas:
- ¿Echaba de menos un comando Vim incorporado para reemplazar una línea que se había extraído antes?
- Si no, ¿cómo puedo vincular mi propio comando que deja (o restaura) la línea marcada en el registro predeterminado?
- : ay (donde a es el número de línea. Ejemplo: 20y). Esto tira de una línea (juego de palabras intencionado).
- Vp
- yy
- j (vaya a la línea que desea reemplazar), y luego
- Vp (mayúscula vy luego p, se reemplazará con el contenido extraído)
Mover al comienzo de la primera línea.
y , $ - copia la línea sin el salto de línea al final
Mover al inicio de la línea objetivo.
V , p - reemplace solo una línea objetivo
c , c , Ctrl r , 0 , Esc - reemplaza la línea objetivo con el tirón original
Mover al inicio de la siguiente línea objetivo.
. - repite el comando emitido en 4.2.
Notas:
4.1 es y , $ porque si haces y , y o Y , copiarás el salto de línea, y Ctrl r , 0 en realidad agrega el salto de línea debajo de tu línea objetivo.
4.2 reemplaza V p , que no funciona con repeat porque técnicamente la última acción es delete, entonces . simplemente eliminaría una línea.
Si alguien sabe cómo emitir ''reemplazar la línea actual con registro'' desde el modo EX (línea de comando), me gustaría saber de usted (y saber dónde encontró la documentación). Puede haber un comando EX repetible que sea más rápido que 4.2 y / o que no tenga la advertencia de salto de línea.
A menudo tengo que Y una línea y reemplazarla en varios lugares, cada uno de los cuales tiene un valor diferente (lo que significa que no puedo hacer una expresión regular).
Y para tirar de la línea original deseada
y luego en cada línea que te gustaría reemplazar, V p cero Y
Basándome en las respuestas que sugieren usar Vp
o VP
para pegar sobre una línea, para evitar cambiar el contenido del registro de tirón, encuentro que el comando más ergonómico es simplemente:
VPY
Esto es lo que haría
- Mueve el comienzo de la línea A, A G (donde A es un número de línea, obviamente)
- Marque la línea a un registro, por ejemplo, a (sin línea nueva). Escriba " a y $"
- Mover para insertar línea, X G
- Línea sustituta, S
- Insertar desde registrar a, Ctrl-R a
Me resulta más fácil usar el comando Ex para esto; ex. para mover la línea 9 a 46:
:46|9m.|-1d
Esto moverá el cursor a la línea 46, moverá la línea 9 debajo de la corriente, luego eliminará la línea anterior (ya que la línea movida es la actual).
O usando marca (s), usando la marca ''a'':
:46ma a|9m''a|''ad
Puede usar estos comandos en el modo Normal:
:AmX | Xd
el comando m
es para m[ove]
, que mueve el número de línea A después del número de línea X, si desea copiar en lugar de mover la línea, use co[py]
. el comando d
es para d[elete]
.
Puede mover (copiar usando co
) un rango de líneas usando
:start,end m X
Puedes usar esto con el modo visual.
- Ir a la línea A:
A
G - Selecciona la línea con el modo visual: V ESC
- ve a la línea X:
X
G - Ingrese el modo sustituto para la línea: S
- Pega la línea que copiaste: shift + insert (o cualquier otra asignación que tengas para pegar desde el portapapeles).
Que haría yo :
-
aG
-
Y
-
xG
-
Vp
No tiene que salir del modo normal, pero sí retiró la línea. Sin embargo, puede usar V"0p
que siempre pondrá la línea eliminada en el paso 2.
Usaría el modo de línea de comandos (Ex) y haré los siguientes dos comandos
:XmA
:Ad
Esto simplemente mueve la línea X justo debajo de A, luego eliminando A mueve esa línea
Por ejemplo
:7m3
:3d
Yo usaría simplemente el registro "Agujero negro":
dado:
nnoremap <Cd> "_dd
la solución sería:
<Cd> yy
Vp
: seleccionar línea, pegar lo que se tiró