Puis-je supprimer une ligne entière, à l'exception du saut de ligne?


33

Une opération assez courante pour moi dans vim, puisque je suis obsessive-compulsive et que je tiens à garder mes fichiers libres de tout espace, est de supprimer le contenu d'une ligne entière, mais pas la ligne elle-même (c'est-à-dire pas le saut de ligne).

Existe-t-il une méthode vim intégrée pour le faire? Peut-être une d<movement command>opération?

Jusqu'à présent, le meilleur que j'ai est (sur la ligne en question) 0d$. Y a-t-il un moyen plus rapide?


2
Au lieu de supprimer manuellement les espaces blancs, vous pouvez utiliser un plugin tel que vim-better-whiteespaces , qui met en surbrillance les espaces finaux, fournit une commande permettant de les supprimer tous en même temps, et peut même le faire automatiquement lors de la sauvegarde.
Deltab


3
Même sans plug-in, vous pouvez globalement supprimer les espaces en fin de chaîne à l'aide de la fonctionnalité de recherche et remplacement, par exemple:%s/\s*$//
Kyle Strand du

Réponses:


34

Vous pouvez utiliser 0Dceci pour aller au premier caractère de la ligne et le supprimer jusqu'à la fin de la ligne. Notez que vous pouvez utiliser ^Dsi vous voulez laisser les espaces précédents précédents seuls. De plus, ces opérations ne peuvent pas être répétées en utilisant .. Si vous souhaitez une opération pouvant être répétée à l'aide de la .commande, reportez-vous à la réponse de David Lord.

Sujets d'aide:

  • :help 0
  • :help D
  • :help ^

4
Bien que ce soit direct, au point, et (probablement) le moins de frappes, ce n'est pas répétable en utilisant la .commande. Pour cette raison, je pense cc<Esc>ou S<Esc>est plus attrayant si vous tenez à répéter.
tommcdo

C'est vrai. Cependant, vous pouvez l’enregistrer sous forme de macro et le répéter avec ..
EvergreenTree

En général, les macros ne peuvent pas être répétées avec .. Elles fonctionnent comme si ces touches étaient entrées de manière interactive, de sorte que les commandes individuelles sont traitées séparément. Utiliser .ne répète que la dernière commande de la macro.
tommcdo

Je l'ai testé, et ce n'est pas comme ça que ça marche pour moi. Si vous enregistrez la macro, utilisez-la ensuite @{reg}, vous pouvez la répéter .ultérieurement.
EvergreenTree

1
Vous ne faites que répéter la dernière commande de la macro, à savoir D. Après une 0Dopération, votre curseur sera laissé dans la colonne 0. Si votre curseur est déjà au début de la ligne (après avoir déplacé une autre), il semblera que la macro a été répétée correctement. Essayez de déplacer le curseur vers l'avant dans la ligne et de taper .- vous verrez qu'il se répète seulement D.
tommcdo

20

cc <Esc>fera ce que vous demandez, mais est plus de frappe que 0D. Si vous voulez mettre quelque chose dans cette ligne par la suite, ccpeut-être mieux.


2
Si vous incluez le décalage, c'est la même chose et peut-être plus facile.
Holloway

4
Bien que ce ne soit pas la solution la plus «propre», elle présente un avantage: c'est exactement une action et elle peut donc être répétée avec la .commande. En revanche, 0D(comme suggéré dans la réponse choisie) comporte deux actions: le 0mouvement et la Dcommande.
tommcdo

@Trengot, c’est probablement plus facile que 0Dpour moi puisque j’ai jkmappé sur <Esc>dans mon vimrc, mes mains n’auraient même pas à quitter la rangée de base.
EvergreenTree

1
See @Nobilis answer: Sest documenté comme "Synonyme de cc"
Volker Siegel

14

Set alors Ctrl+Cou Escsemble accomplir exactement la même fonction.

Il peut ensuite être répété avec .comme il constitue une action unique.


2
Je pensais juste à ajouter ceci comme réponse, puis j'ai vu la vôtre
sbell le

7

0Dest probablement ce que vous voulez. Il sera supprimé du curseur jusqu'à la fin de la ligne tout en laissant la ligne (et tous les caractères avant le curseur) en place.


Bien que cette réponse date d'environ un an, il est intéressant de noter que celle-ci 0Dsera supprimée du début de la ligne et non de la position du curseur.
31/06

4

Je utilise généralement ddO. ddpour supprimer la ligne actuelle, et O(c’est une majuscule) pour ajouter une nouvelle ligne.

C'est aussi 3 frappes de touche, mais ddne compte que comme 1 et demi, et je trouve Oplus facile à taper que $.

Elle diffère de la 0Dsolution en ce sens qu'elle effectue une indentation automatique, par exemple avec ce code (où se !···trouve une tabulation et le curseur:

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

0D vous laissera avec:

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

Et ddOvous laissera avec:

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

Et si vous appuyez <Esc>immédiatement après cela, Vim doit supprimer l’auto-indentation, pour que vous ayez la même chose que pour 0D.

Il n'y a pas de manière «correcte», cela dépendra de ce que vous voudrez faire exactement. Je préfère ddOparce que c'est plus flexible et parce que c'est "entre mes doigts" :-)


2
^Dva laisser les espaces blancs.
EvergreenTree

Puisque Ovous laisse en mode insertion, cela équivaut à cc, sauf sans l'indentation automatique .... sauf si votre ligne était déjà indentée automatiquement.
Kyle Strand

Cela se comportera différemment sur la dernière ligne du fichier.
tommcdo

0

Et pour enregistrer ce précieux trait de touche, vous pouvez utiliser 0Cpour supprimer tous les caractères de la ligne actuelle et vous mettre en mode insertion.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.