¿Cómo puedo eliminar varias líneas en vi?


129

He intentado seguir lo siguiente:

Cómo borrar el texto seleccionado en el editor VI

pero

5dd

da

E492: no es un comando de editor: 5dd

Entonces intenté:

5d

Que solo elimina una sola línea. ¿Cómo puedo eliminar varias líneas?


2
Por lo que recuerdo, 5dd debería ser una sintaxis válida y debería eliminar 5 líneas que comienzan con la que está el cursor. ¿Hay alguna posibilidad de que BLOQ MAYÚS esté activado y use una distribución de teclado que provoque que las teclas numéricas se muevan cuando está?
Eric J.

Respuestas:


132

Parece que está ingresando los comandos en modo comando (también conocido como "modo Ex"). En ese contexto :5deliminaría la línea número 5, nada más. Para 5ddque funcione según lo previsto, es decir, elimine cinco líneas consecuentes que comienzan en el cursor, ingréselo en modo normal y no prefija los comandos con :.



142

Puede eliminar varias líneas (rango) si conoce los números de línea:

:[start_line_no],[end_line_no]d

Nota: d significa eliminar

dónde,
start_line_no es la línea inicial que no desea eliminar y end_line_no es la línea final que no desea eliminar. Las líneas entre el inicio y el final, incluidos el inicio y el final, se eliminarán.

P.ej:

:45,101d

Las líneas entre 45 y 101 incluyendo 45 y 101 serán borradas.


14
También puede usar $para denotar la última línea del archivo. Por :45,$dlo tanto , eliminaría todas las líneas desde 45 hasta el final.
freethebees

Incluso puedes usar Patrones como/<\/div>/
Björn

1
Si desea comenzar el rango desde la línea en la que se encuentra actualmente, puede hacerlo:.,[end_line_no]d
Joe

15

Comandos enumerados para su uso en modo normal (prefijo con :para modo de comando).
Probado en Vim.

Por cantidad de línea:

  • numdd : eliminará las líneas numéricas DOWN comenzando desde la posición actual del cursor (por ejemplo 5dd, eliminará la línea actual y 4 líneas debajo de ella => elimina la línea actual y las líneas ( num-1 ) debajo de ella )
  • numdk : eliminará las líneas numéricas ARRIBA de la línea actual y la línea actual en sí (p. ej. 3dk, eliminará la línea actual y 3 líneas sobre ella => elimina la línea actual y las líneas numéricas sobre ella )

Por números de línea:

  • dnumG : eliminará las líneas de la línea actual (inclusive) HACIA ARRIBA hasta el número de línea num (inclusive) (por ejemplo, si el cursor está actualmente en la línea 5 d2G, eliminará las líneas 2-5 inclusive)
  • dnumgg : eliminará las líneas de la línea actual (inclusive) ABAJO al número de línea num (inclusive) (por ejemplo, si el cursor está actualmente en la línea 2d6gg , eliminará las líneas 2-6 inclusive)
  • ( solo modo de comando ) :num1 ,num2d : eliminará las líneas número de línea num1 (inclusive) ABAJO al número de línea num2 (inclusive) . Nota: si num1 es mayor que num2 , vim reaccionará conBackwards range given, OK to swap (y/n)?

1
Esto me ayudó porque no me di cuenta de que num 'd' 'd' estaba tratando de eliminar debajo del cursor. ¡Tenía mi cursor en la parte inferior del archivo tratando de eliminar las líneas sobre mi cursor! ¡gracias por la ayuda!
Jonathan Chad Faling

Eliminación por número de lino: ': <inicio>, $ d' se eliminará hasta el final del archivo.
Devolus

11

Si prefiere un método de modo no visual y reconoce los números de línea, me gustaría sugerirle otra forma directa.

Ejemplo

Quiero eliminar texto de la línea 45 a la línea 101.

Mi método le sugiere que escriba un comando a continuación en modo comando:

45Gd101G

Se lee:

Vaya a la línea 45 ( 45G) y luego elimine el texto ( d) de la línea actual a la línea 101 ( 101G).

Tenga en cuenta vimque puede utilizar ggen lugar de G.

Compare con la respuesta de @Bonnie Varghese que es:

:45,101d[enter]

El comando anterior de su respuesta requiere escribir 9 veces enter, incluido , donde mi respuesta requiere escribir 8-10 veces. Por lo tanto, la velocidad de mi método es comparable.

En lo personal, yo prefiero 45Gd101Gmás :45,101dporque me gusta que se adhieren a la sintaxis de la orden del VI, en este caso es:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+

8

d5d "corta" cinco líneas

Por lo general, solo lanzo el número en el medio como:

d7l = borrar 7 letras


7

Presione la Esctecla para asegurarse de que no está en modo de edición. Coloque el cursor en la primera línea que se eliminará. Introduzca :5dd. La línea actual y las siguientes cuatro líneas deben eliminarse.

Alternativamente, si tiene activada la numeración de líneas ...

Presione la Esctecla para asegurarse de que no está en modo de edición. Ingrese :#,#ddonde '#' representa los números de línea inicial y final que se eliminarán.


No creo que funcione con colon al principio.
Desterrado el

@PoeteMaudit Esos son comandos vi válidos. Los dos puntos hacen que vi mueva el cursor a la parte inferior de la pantalla y acepte un comando del editor de líneas.
Kenster

5
  1. Esc para salir del modo insertar
  2. :1enter vaya a la línea 1 (reemplace '1' con la línea que le interesa)
  3. 5dd eliminar 5 líneas (de la línea actual)

Tipo (para líneas numeradas).:set number


3

Si desea eliminar un rango DESPUÉS de un disparador de línea específico, puede usar algo como esto

:g/^TMPDIR/ :.,+11d

Eso elimina 11 líneas (inclusive) después de cada encuentro de ^TMPDIR.


0

es dxd, no ddx

si desea eliminar 5 líneas, pase el cursor al comienzo de la primera línea para eliminar y d5d


0

Para eliminar todas las líneas, use: ESC gg dG Para eliminar algunas líneas, digamos 5 y luego use ESC 5dd


-1

Se podría hacer de la siguiente manera ...

  1. Coloque el cursor en el lugar que desea eliminar.
  2. Presione "v" para iniciar la selección visual.
  3. Lleve el cursor a la posición que desea eliminar con la tecla de flecha.
  4. Presione "d" que eliminará las líneas.
  5. Ahora guarde y salga usando ": x!"
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.