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:
- Vaya a la línea A: AG
 - Yank línea A: yy
 - Ir a la línea X: XG
 - Pegar línea A: P
 - Mover a la línea anterior: j
 - Eliminar línea anterior: dd
 
Esto tiene la desventaja adicional de que la línea X ahora está en el registro predeterminado, lo cual es molesto si encuentro otra línea que debería reemplazarse con A. Al mover y pegar desde un registro adicional ( "ayy " , aP ) hace que esta simple tarea sea uniforme menos eficiente.
Mis preguntas:
- ¿Perdí un comando Vim incorporado para reemplazar una línea arrancada antes?
 - Si no es así, ¿cómo puedo vincular mi propio comando que deja (o restaura) la línea tirada en el registro predeterminado?
 

:movey el agujero negro registro (_) (o, de hecho, sólo registros)Respuestas:
Que haría yo :
aGYxGVpUsted no tiene que salir de modo normal, pero lo hace tirón de la línea. Sin embargo, puede usar
V"0plo que siempre pondrá la línea tirada en el paso 2.fuente
Yes sinónimo deyyYes un sinónimo deyy, pero sugiero reasignarlo paray$que coincida conDyC.Vp: seleccione la línea, pegue lo que fue tiradofuente
VPfunciona igual de bien, lo cual es útil porque puede mantener presionada la tecla Mayús durante toda la secuencia.V"0p, que se pega desde el último registro tirado.V"0phace? V entra en modo de línea de línea visual y p es para pegar. ¿Cuáles son "y 0 para las gracias?Para eliminar texto sin afectar los registros normales, puede utilizar el registro de agujero negro
"_:fuente
dyddusar siempre el agujero negro, yxyxxrealizar lo que la mayoría de los editores llamarían un "corte" (borrar y guardar en el registro por defecto):noremap x dnoremap xx ddnoremap d "_dnoremap dd "_ddSobre la base de las respuestas que sugieren usar
VpoVPpegar sobre una línea, para evitar cambiar el contenido del registro de yank, encuentro que el comando más ergonómico es simplemente:VPYfuente
fuente
Usaría el modo de línea de comandos (Ex) y haría los siguientes dos comandos
Esto simplemente mueve la línea X justo debajo de A, luego borrando A mueve esa línea hacia arriba
Por ejemplo
fuente
Muévase al inicio de la primera línea.
y, $- copia la línea sin el salto de línea al final
Moverse al inicio de la línea objetivo.
V, p- reemplazar solo una línea de destino
c, c, Ctrlr, 0, Esc- sustituir a la línea de meta con el tirón inicial
Moverse al inicio de la siguiente línea objetivo.
. - repite el comando emitido en 4.2.
Notas:
4.1 es y, $porque si lo hace y, yo Ycopiará el salto de línea y Ctrlr, en 0realidad , agregará el salto de línea debajo de la línea objetivo.
4.2 reemplaza V p, que no funciona con la repetición porque técnicamente la última acción es eliminar, por .lo que solo eliminaría una línea.
Si alguien sabe cómo emitir 'reemplazar 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 no tenga la advertencia de salto de línea.
fuente
Esto es lo que haría
fuente
Puedes usar esto con el modo visual.
AGXGfuente
También puedes hacer:
Se pueden usar las mismas teclas para tirar / pegar más de una línea.
fuente
Puede utilizar estos comandos en el modo normal:
el
mcomando es param[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, utiliceco[py]. eldcomando es parad[elete].Puede mover (copiar usando
co) un rango de líneas usandofuente
A la luz del comentario reciente de cicld (¡gracias!), Veo que no entendí completamente el problema original. Mover la línea no es apropiado, pero copiar lo es (ya que la línea está tirada). Así que lo revisaría a:
Copie la primera línea (el
:tcomando es un alias para:copy) después de la línea 20 (la colocará en la línea 21)Elimine la línea 20, colocando la línea eliminada en el registro 'agujero negro' (
_) (es decir, sin afectar el búfer de yank actual)Como se mencionó en el comentario reciente, esto no afectará la posición actual del cursor.
fuente
fuente
Me resulta más fácil usar el comando Ex para esto; ex. para mover la línea 9 a la 46:
Esto moverá el cursor a la línea 46, moverá la línea 9 debajo de la actual, luego borrará la línea anterior (ya que la línea movida es la actual).
O usando marca (s), usando marca 'a':
fuente
:1m20|.+1d(mueva la línea 1 a la línea 20 y elimine la siguiente línea, es decir, el texto que estaba en la línea 20 anteriormente). ¡Aunque es la misma idea!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 le gustaría reemplazar, VpzeroY
fuente
Simplemente usaría el registro "Agujero negro":
dado:
nnoremap <Cd> "_dd
la solucion seria:
<Cd> aa
fuente