2010-09-02 21 views
50

¿Existe un comando para eliminar una línea (o varias líneas) que está inmediatamente debajo de la línea actual? Actualmente lo estoy haciendo como: jdd y luego . para repetir según sea necesario. ¿Hay algún comando que combine todos estos?¿Cómo borrar línea (s) por debajo de la línea actual en vim?

ACTUALIZACIÓN: La razón por la que me gustaría tener ese comando es porque no me gusta alejarme de la posición actual, pero puedo eliminar las líneas a continuación.

+0

Creo que la respuesta de @Peter Rincker debe marcarse como la respuesta – gixxer

+0

hecho @gixxer, gracias por el encabezado – Valentin

Respuesta

115

El comando delete ex funcionará muy bien.

:+,$d 

Esto eliminará todas las líneas de corriente 1 hasta el final ($)

Para eliminar los próximos 2 líneas de la gama seguimiento quiere trabajar, o la forma rápida +1,+2+,+2

:+,+2d 

Como @ib mencionó el comando :delete o :d moverá el cursor al inicio de la línea junto al texto eliminado. (Incluso con el conjunto nostartofline). Para solucionar esto, podemos emitir el comando de modo normal ``. `` saltará a la posición exacta antes del último salto, en este caso el comando :d. Nuestra orden es ahora

:+,+dentrar``

O como un comando ex

:+,+2d|norm! `` 

Para hacer esto más fácil envolvemos todo esto en un comando:

command! -count=1 -register D :+,+<count>d <reg><bar>norm! `` 

ahora para eliminar la siguiente siguiente 3 líneas:

:3D 

Este comando también puede tomar un {reg} como :delete y :yank do. Por lo tanto la eliminación de los próximos 4 líneas en el registro a sería:

:4D a 

Para obtener más información

:h :d 
:h :command 
:h :command-register 
:h :command-count 
:h `` 
+3

Tenga en cuenta que esta es una solución bastante fácil que funciona "de fábrica" ​​y se puede generalizar a otros comandos (por ejemplo, ': + 1, + 5s! A! B! G' reemplazará a's con b en las 4 líneas después del cursor). Ver: ayuda rangos de comando para algunos ejemplos más. –

+0

Esta solución directa sería genial, si solo no mueve el cursor. Al menos, el comando debería verse como ': +, $ d | norm! \' \ ''. Por cierto, como se indica en la pregunta, al autor de la pregunta le gustaría eliminar varias líneas debajo de la actual, no necesariamente hasta el final del archivo. –

+0

@ib: ¿Se podría mejorar la respuesta con una explicación más detallada de los rangos? Tal vez 'set sol'? ¿Cómo usar la marca '\' '? –

0

Se puede definir una pequeña función que hace exactamente lo que usted describe: eliminar los próximos n líneas por debajo de la línea actual y restaurar la posición inicial cursor.

function! DeleteNextLines(n, reg) 
    let l = line('.') 
    let m = min([a:n, line('$')-l]) 
    if m > 0 
     let c = col('.') 
     exe '+,+'.m 'd' a:reg 
     call cursor(l, c) 
    endif 
endfunction 

Además, se puede definir un comando que acepte el conteo de las líneas de abajo para eliminar (uno, por defecto) y el nombre del registro para su uso como un argumento opcional (tal como :delete de comandos).

:command! -range=1 -register -bar D call DeleteNextLines(<count>, <q-reg>) 

Adicionalmente se podría definir un mapeo para el funcionamiento de :D, si es necesario .

+0

No lo he probado, pero acepto como respuesta, gracias. – Valentin

+0

por ejemplo, para asignar comas, d (presionar ',' seguido por d) insertar las siguientes líneas (después de ingresar la respuesta anterior por @ib.) 1: 'let mapleader =", "' 2: 'nmap d: D ' –

2

puede introducir el número de líneas que desea eliminar: j ddk.

+0

Final' k' mueve el cursor por encima de la línea inicial. Además, la posición de la columna del cursor se perderá debido a 'dd'. –

+0

@ib: No en mis pruebas, no es así. ¿Realmente lo has intentado? Tenga en cuenta el ** j ** inicial. –

+0

Lo siento, mi primer punto era incorrecto (cuando he probado el comando, no he notado que el recuento que especifiqué ('20', en su ejemplo) fue mayor que el número de líneas hasta el final de el buffer). Pero el segundo permanece: la posición de la columna del cursor cambia después de 'dd' (al primer carácter no en blanco de la línea al lado de las líneas eliminadas, creo). –

25

Esto eliminará todos líneas por debajo de la actual:

jdG 

desgracia que se moverá el cursor al principio de la línea después de que se hizo la eliminación.

+2

Y eliminará cada línea hasta el final del búfer, también. –

+0

He leído mal la pregunta original, lo siento. Pensé que el OP quiere borrar TODAS las líneas debajo de la actual. Cambié mi publicación. – ClosedID

+0

¡Debería ser la respuesta aceptada! –

3

¡Este es un trabajo para marcas!

Trate maj20dd`a

ma establece la marca específica de archivo 'a', j20dd hace la eliminación que desee (20 líneas en este caso), y `a te ha devuelto a la posición de la marca (línea y columna).

Obviamente, este patrón se puede ampliar para hacer todo lo que desee antes de volver a la marca. Si usa mA (o cualquier otra letra mayúscula), la marca será única en todos los archivos, por lo que incluso puede editar en otro lugar antes de volver. Si tiene un uso muy frecuente, puede convertirlo en una macro como se sugirió anteriormente.

5

Las otras soluciones son informativos, pero siento que sería más fácil de usar una macro para esto:

qq (comienza la grabación)

jddk (ir hacia abajo, elimine la línea y volver a subir - es decir, la XX ing que quiere hacer)

q (fin de la grabación)

Ahora usted puede hacer @q para llevar a cabo esta acción, manteniendo el cursor en la posición actual. También puede hacer algo como [email protected] para borrar 5 líneas debajo del cursor.

Y, por último, si usted está repitiendo la acción más de una vez, usted podría escribir @@ después de la primera vez que se ejecuta @q (esto se repite la última macro usada - en este caso q)

6

así, a hazlo simplemente podrías usar el comando xxdd. La mayoría de las veces sé (al menos tengo una idea) el tamaño del guión que estoy editando. Por lo tanto, el comando de la siguiente suele ser más que suficiente:

  • 99dd
  • 999dd para eliminar 999lines a partir de la posición del cursor.
  • 9999dd
  • 99999dd de guión muy largo;)
48

"DG" debería funcionar. Esto significa eliminar todas las filas hasta el final del archivo del cursor actual.

+0

Esta es la respuesta correcta. – Gaurav

Cuestiones relacionadas