¿Puedo eliminar una línea completa, excepto el salto de línea?

33

Una operación bastante común para mí en vim, ya que soy compulsivo-obsesivo y me gusta mantener mis archivos libres de espacios en blanco, es eliminar el contenido de una línea completa, pero no la línea en sí (es decir, no el salto de línea).

¿Hay una forma integrada de hacer esto? Tal vez una d<movement command>operación?

Hasta ahora, lo mejor que tengo es (en la línea en cuestión) 0d$. ¿Hay una manera más rápida?

Andrew Ferrier
fuente
2
Como alternativa al recorte manual de espacios en blanco, puede usar un complemento como vim-better-whitespace , que resalta los espacios en blanco finales, proporciona un comando para eliminarlo todo de una vez e incluso puede hacerlo automáticamente al guardar.
deltab
3
Incluso sin un complemento, puede eliminar globalmente los espacios en blanco al final mediante la búsqueda y reemplazo, por ejemplo:%s/\s*$//
Kyle Strand

Respuestas:

34

Puede usar 0Desto irá al primer carácter de la línea y eliminará hasta el final de la línea. Tenga en cuenta que puede usar ^Dsi desea dejar solo cualquier espacio en blanco anterior. Además, estas operaciones no pueden repetirse mediante el uso .. Si desea una operación que se pueda repetir con el .comando, consulte la respuesta de David Lord.

Temas de ayuda:

  • :help 0
  • :help D
  • :help ^
Árbol de hoja perenne
fuente
44
Si bien esto es directo, al punto, y (probablemente) la menor cantidad de pulsaciones de teclas, no se puede repetir utilizando el .comando. Por esa razón, creo cc<Esc>o S<Esc>es más atractivo si te importa repetir.
tommcdo
Eso es verdad. Sin embargo, puede grabarlo como una macro y repetirlo usando ..
EvergreenTree
En general, las macros no se pueden repetir con .. Funcionan como si esas pulsaciones de teclas se introdujeran de forma interactiva, por lo que los comandos individuales se tratan por separado. El uso .repetirá solo el último comando en la macro.
tommcdo
Lo probé, y no es así como funciona para mí. Si graba la macro, luego úsela usando @{reg}, puede repetirla .después.
EvergreenTree
1
Simplemente estás repitiendo el último comando de la macro, que es D. Después de una 0Doperación, su cursor se dejará en la columna 0. Si su cursor ya está en el comienzo de la línea (después de pasar a otra), parecerá que la macro se repitió correctamente. Intenta mover el cursor hacia adelante en la línea y escribir ., verás que solo se repite D.
tommcdo
20

cc <Esc>hará lo que pidas, pero es más pulsaciones de teclas que 0D. Si desea poner algo en esa línea después, ccpuede ser mejor.

David Lord
fuente
2
Si incluye el Shift es igual y posiblemente más fácil.
Holloway
44
Si bien esta no es la solución "más limpia", tiene una ventaja: es exactamente una acción, por lo que es repetible con el .comando. En contraste, 0D(como se sugiere en la respuesta elegida) hay dos acciones: el 0movimiento y el Dcomando.
tommcdo
@Trengot probablemente sea más fácil que 0Dpara mí, ya que lo he jkmapeado <Esc>en mi vimrc, por lo que mis manos ni siquiera tendrían que abandonar la fila de inicio.
EvergreenTree
1
Consulte la respuesta de @Nobilis: Sestá documentado como "Sinónimo de cc"
Volker Siegel
14

Sy luego Ctrl+Co Escparece cumplir exactamente la misma función.

Entonces puede repetirse .ya que constituye una sola acción.

Nobilis
fuente
2
Estaba pensando en agregar esto como una respuesta y luego vi la suya
sbell
7

0Des probablemente lo que quieres Se eliminará del cursor hasta el final de la línea, dejando la línea (y los caracteres anteriores al cursor) en su lugar.

SupBrah
fuente
Aunque esta respuesta tiene casi un año, vale la pena señalar que 0Dse eliminará desde el principio de la línea , no desde la posición del cursor
FliiFe
4

Me suelen utilizar ddO. ddpara eliminar la línea actual y O(eso es una o mayúscula) para agregar una nueva línea.

Esto también es 3 pulsaciones de teclas, pero ddcuenta solo como 1 y medio, y me parece Omás fácil de escribir que $.

Es diferente de la 0Dsolución en que hace una sangría automática, por ejemplo con este código (donde !···hay una pestaña, y █ el cursor:

def asd():
!···if foo:
!···!···foo()█
!···!···foobar()

0D te dejaremos con:

def asd():
!···if foo:
█
!···!···foobar()

Y ddOte dejaré con:

def asd():
!···if foo:
!···!···█
!···!···foobar()

Y si presiona <Esc>inmediatamente después de esto, Vim debería eliminar la sangría automática, para que tenga lo mismo que con 0D.

No hay una forma "correcta", dependerá de lo que querrá hacer exactamente. Prefiero ddOporque es más flexible y porque está "en mis dedos" :-)

Martin Tournoij
fuente
2
^Ddejará el espacio en blanco solo.
EvergreenTree
Como lo Odeja en modo de inserción, esto es equivalente a cc, excepto sin sangría automática ... a menos que su línea ya haya sido sangrada automáticamente.
Kyle Strand
Esto se comportará de manera diferente en la última línea del archivo.
tommcdo
0

Y para guardar esa preciosa pulsación de tecla que puede usar, 0Cque eliminará todos los caracteres de la línea actual y lo pondrá en modo de inserción.

Vlatko Šurlan
fuente