vim - ¿Cómo borrar un gran bloque de texto sin contar las líneas?

193

En vim, a menudo me encuentro eliminando (o copiando) grandes bloques de texto. Se pueden contar las líneas de texto y decir (por ejemplo) 50ddeliminar 50 líneas.

Pero, ¿cómo se eliminaría este gran bloque de texto sin tener que saber cuántas líneas eliminar?

Justin Ethier
fuente
1
Si la ventana es lo suficientemente grande, la numeración de líneas relativas es útil aquí. Coloque el cursor en la parte superior de la ventana, busque el número de línea relativa de la última línea que se va a eliminar (digamos, n), agregue uno, luego escriba ese número, luego escriba dd. Por ejemplo, si n = 50, entonces 51dd. Alternativamente, use un comando de movimiento -50d<down arrow>
BallpointBen
"Encuentra el número de línea relativo", ¡o :set rnuúsalo y Vim lo hará al instante! La línea en la que se encuentre seguirá estando numerada absolutamente, pero las líneas encima y debajo del cursor se numerarán simétricamente 1, 2, ... (y se actualizarán con el movimiento del cursor, eventos a nivel de archivo, etc.)
John P

Respuestas:

287

No soy vim guru, pero lo que uso en esta circunstancia es el "modo visual". En el modo de comando, escriba V(capital). Luego, mueva hacia arriba / abajo para resaltar el bloque que desea eliminar (todos los comandos de movimiento habituales funcionan). Luego quítelo con xo d.

Estera
fuente
2
Extraño. Sé que funciona para mí (tm) aquí en Linux (vim 7.3.50) y con gVim en Windows. Y a juzgar por las otras respuestas, funciona para otras personas. ¿Tal vez algunos ajustes en tu lo .vimrcestán haciendo funcionar?
Mat
Aceptar, por alguna razón no me daba cuenta de que se podía entrar en el modo de línea visual utilizando Shift- v... yo estaba tratando de utilizar la CTRLclave. Entonces esto funciona y es probablemente la forma más conveniente.
Justin Ethier
77
Es posible que desee aclarar que hay dos modos visuales: Línea visual ( CTRL- v) y Bloque visual ( Shift- v).
Justin Ethier
2
Lo hago mucho. Pero siempre lo considero trampa y vim menos que ideal.
Jim Mitchener el
9
En realidad, hay tres modos visuales: modo visual (basado en caracteres {v}), modo de línea visual (basado en línea {Sv}) y modo de bloque visual (permite la selección de bloques {Cv})
Tom Regner
293

Vaya a la línea de inicio y escriba ma(marque "a"). Luego vaya a la última línea e ingrese d'a(elimine para marcar "a").

Eso eliminará todas las líneas de la actual a la marcada (inclusive). También es compatible con vi, así como vim, en la remota posibilidad de que su entorno no ha sido bendecida con este último.

paxdiablo
fuente
3
¡Estas malditas rocas! Odio el tiempo que hago algo (como contar líneas) antes de buscar una solución mejor. ¡Gracias!
ryanjdillon
1
realmente impresionante Siempre uso el modo visual para eliminar el bloque, pero de esta manera es mejor +1
hish
44
Encontré esto más útil que el modo visual para eliminar más de 500k líneas
Michael - ¿Dónde está Clay Shirky?
Respuesta realmente práctica. Lo uso para eliminar los correos de mi servidor del archivo /var/mail/usernameen masa y dejar los últimos correos intactos. Hago una marca, luego entro, por ejemplo, 50000seguido de ggpara ir a la línea 50,000, luego borro todas las líneas intermedias. ¡Funciona de maravilla!
otmezger
1
@horta, probablemente no usaría vimcomo herramienta para editar archivos de gigabytesawk
Tendería
46

También puede usar el modo visual (algunos comandos también se pueden usar con la opción eliminar) vip vappara seleccionar párrafos, v2appara seleccionar dos párrafos dap, d2aptambién. Puede eliminar dentro de bloques de me [ ]gustada[

Como referencia: los tipos de objetos. De la documentación de vim: sección 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  
M'vy
fuente
1
da [, da {, da "todo útil para programadores
Rene Wooller
1
¡Gracias! dapes muy fácil de recordar como "eliminar un párrafo"
Tropilio
38

Aquí hay muchas mejores respuestas, pero para completar, mencionaré el método que solía usar antes de leer algunas de las excelentes respuestas mencionadas anteriormente.

Suponga que desea eliminar de las líneas 24-39. Puedes usar el comando ex

:24,39d

También puede tirar de líneas usando

:24,39y

Y encuentre y reemplace justo sobre las líneas 24-39 usando

:24,39s/find/replace/g
daviewales
fuente
11

Si activa los números de línea a través de set number, simplemente dNNGpuede eliminar la línea NN de la posición actual. Para que pueda navegar hasta el inicio de la línea que desea eliminar y simplemente d50Gsuponiendo que es la última línea que desea eliminar.

Jim Mitchener
fuente
10

Depende de lo que sea ese bloque grande . Tal vez solo quieras eliminar un párrafo, en cuyo caso dipsería suficiente.

René Nyffenegger
fuente
Gracias por el consejo. Desafortunadamente, estoy trabajando con código aquí, y generalmente necesito un control más detallado que eso.
Justin Ethier
1
También estoy trabajando con código, y separo los bloques lógicos por una línea vacía. Este consejo me alegró el día. Ahora puedo eliminar grandes bloques de lógica con tres pulsaciones de teclas.
mínimo
funciona porque 'd' significa eliminar, 'p' en este contexto significa párrafo
user98761
7

Hay varias posibilidades, lo mejor depende del texto en el que trabaje.

Se me ocurren dos posibilidades:

  • cambie al modo visual ( V, S-V, ...), seleccione el texto con el movimiento del cursor y pulsed
  • eliminar un párrafo completo con: dap
Tom Regner
fuente
Utilizo dap con mucha frecuencia ahora que lo sé y prefiero que se disipe y baje, pero siempre elimina un bloque y la línea en blanco que viene después del bloque, pero es una forma de eliminar el bloque y la línea en blanco que viene antes de eso?
Funkodebat
En el medio de un texto con párrafos no hay diferencia sintáctica en el resultado, ¿verdad? Si es así, sugiero escribir lo que quiera, con ejemplos, en una nueva pregunta.
Tom Regner
6

Si todo el bloque está visible en la pantalla, puede usar la configuración de número relativo. Ver: ayuda número relativo. Disponible en 7.3

Rumple Stiltskin
fuente
No me di cuenta de lo útil: se rnu hasta que comencé a usarlo, ideal para saber 50dd, así como la navegación, 50j
rshdev
3

Puede colocar el cursor al principio o al final del bloque e ingresar al modo visual (shift-v). Luego, simplemente mueva hacia arriba o hacia abajo hasta que se resalte el bloque deseado. Finalmente, copie el texto presionando y o corte el texto presionando d.

El juez Maygarden
fuente
quizás extraño, pero a partir de esto descubrí cómo seleccionar texto de algún punto medio deseado en una línea y seleccionar varias líneas a continuación en el mismo punto al final de cada línea. Exactamente lo que estaba buscando.
nanker
3

Junto con otros movimientos que ya se mencionan aquí, también hay /{pattern}<CR>movimiento, por lo que si sabe que desea eliminar a la línea que contiene foo, puede hacerlo dV/foo<CR>. Vestá aquí para forzar el movimiento en línea porque, de forma predeterminada, /tiene carácter.

ZyX
fuente
3

Contar líneas es demasiado tedioso para mí, pero contar 'párrafos' no es tan malo. '{' y '}' mueve el cursor a la primera línea vacía antes y después del cursor, respectivamente. Las operaciones de movimiento del cursor se pueden combinar con la eliminación, y varias otras respuestas utilizaron un enfoque similar (dd para una línea, dG para el final del documento, etc.)
Por ejemplo:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

Si su cursor comienza sobre el bloque de comentarios, 'd}' elimina el bloque de comentarios y 'd2}' elimina tanto el bloque de comentarios como el bloque de código. Si su cursor comienza debajo del bloque de código, 'd {' elimina el código y 'd2 {' elimina ambos. Por supuesto, puede omitir un bloque moviendo primero el cursor: '{d {' o '} d}'.

Si es coherente con su espacio en blanco, o puede contar los párrafos de un vistazo, esto debería funcionar. El archivo de ayuda de Vim tiene más trucos de cursor si está interesado.

John P
fuente
1

También puede ingresar un número muy grande y luego presionar ddsi desea eliminar todas las líneas debajo del cursor.

Rohit Pruthi
fuente
Puede ser aún más fácil de usar dG, lo que se elimina al final del documento, ya que por Gdefecto va a la última línea.
andyg0808
1

Eliminar un bloque de texto

Suponiendo que su cursor se sienta al comienzo del bloque:

V/^$<CR>d (where <CR> is the enter/return key)

Explicación

  • Ingrese al modo "linewise-visual": V
  • Resalte hasta la siguiente línea vacía: /^$<CR>
  • Eliminar: d

Clave de enlace

Una solución más robusta:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

Explicación

  • Inhabilitar ajuste de búsqueda: :set nowrapscan
  • Vuelva a asignar la Dclave (a los siguientes comandos)::nnoremap D
  • Ingrese al modo "linewise-visual": V
  • Resalte hasta la siguiente línea vacía / espacio en blanco o EOF: /^\s*$\\|\%$<CR>
  • Eliminar: d
Jon Nadal
fuente