106 votes

Comment supprimer la ou les lignes situées sous la ligne courante dans vim ?

Existe-t-il une commande permettant de supprimer une ligne (ou plusieurs lignes) qui se trouve immédiatement sous la ligne courante ? Actuellement, je le fais comme : jdd et ensuite . à répéter selon les besoins. Existe-t-il une commande qui permettrait de combiner tous ces éléments ?

MISE À JOUR : La raison pour laquelle j'aimerais avoir une telle commande est que je n'aime pas m'éloigner de la position actuelle, tout en étant capable de supprimer les lignes en dessous.

0 votes

Je pense que la réponse de @Peter Rincker devrait être marquée comme étant la réponse.

0 votes

Fait @gixxer, merci pour l'info.

188voto

Peter Rincker Points 14594

La commande delete ex fonctionnera très bien.

:+,$d

Ceci effacera toutes les lignes de la ligne courante +1 jusqu'à la fin ($)

Pour supprimer les 2 lignes suivantes, la plage suivante fonctionnerait, +1,+2 ou en abrégé +,+2

:+,+2d

Comme @ib l'a mentionné, le :delete ou :d déplace le curseur au début de la ligne qui suit le texte supprimé. (Même avec nostartofline ensemble). Pour surmonter ce problème, nous pouvons émettre la commande `` commande en mode normal. `` retournera à la position exacte avant le dernier saut, dans ce cas le :d commande. Notre commandement est maintenant

:+,+2denter

Ou comme un ex commande

:+,+2d|norm! ``

Pour faciliter les choses, nous regroupons tout cela dans une commande :

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

Maintenant, il faut supprimer les 3 lignes suivantes :

:3D

Cette commande peut également prendre une {reg} comme :delete et :yank faire. Donc, en supprimant les 4 lignes suivantes dans le registre a serait :

:4D a

Pour plus d'informations

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

3 votes

Notez qu'il s'agit d'une solution assez simple qui fonctionne "out of the box" et qui est généralisable à d'autres commandes (par exemple, :+1,+5s!a!b!g remplacera les a par des b sur les 4 lignes après le curseur). Voir :help command-ranges pour d'autres exemples.

0 votes

Cette solution simple serait géniale, si seulement elle ne déplaçait pas le curseur. Au moins, la commande devrait ressembler à :+,$d|norm!`` . Par ailleurs, comme indiqué dans la question, l'auteur de la question souhaite supprimer plusieurs lignes en dessous de la ligne actuelle, pas nécessairement jusqu'à la fin du fichier.

0 votes

@ib : La réponse serait-elle améliorée par une explication plus détaillée des fourchettes ? Peut-être set sol ? Comment utiliser le ` Mark ?

33voto

ClosedID Points 306

Cela supprimera TOUTES les lignes situées en dessous de la ligne actuelle :

jdG

Malheureusement, cela déplacera le curseur au début de la ligne courante après que la suppression ait été effectuée.

2 votes

Et supprimera aussi toutes les lignes jusqu'à la fin du tampon.

1 votes

J'ai mal lu la question originale, désolé. Je pensais que l'OP voulait supprimer TOUTES les lignes en dessous de la ligne actuelle. J'ai modifié mon message.

4voto

mindthief Points 2074

Les autres solutions sont instructives, mais je pense qu'il serait plus simple d'utiliser une macro pour cela :

qq (Début de l'enregistrement)

jddk (descendez, supprimez la ligne, et remontez - c'est-à-dire la chose que vous voulez faire)

q (fin de l'enregistrement)

Maintenant, vous pouvez faire @q pour effectuer cette action, en maintenant le curseur à la position actuelle. Vous pouvez également faire quelque chose comme 5@q pour supprimer 5 lignes sous le curseur.

Et enfin, si vous répétez l'action plus d'une fois, vous pouvez simplement taper @@ après la première fois que vous exécutez @q (ceci répète la dernière macro utilisée - dans ce cas-ci q )

2voto

Alex Feinman Points 2678

C'est un travail pour les marques !

Essayez maj20dd`a

ma définit la marque spécifique au fichier 'a', j20dd effectue la suppression que vous souhaitez (20 lignes dans ce cas), et `a vous rétablit à la position de la marque (ligne et colonne).

Ce schéma peut évidemment être étendu pour faire tout ce que vous voulez avant de revenir à la marque. Si vous utilisez mA (ou toute autre lettre majuscule), la marque sera en fait unique dans tous les fichiers, de sorte que vous pouvez même éditer ailleurs avant de revenir. Si vous avez un usage très fréquent, vous pouvez en faire une macro comme suggéré ci-dessus.

1voto

Paul Ruane Points 12840

Vous pouvez saisir le nombre de lignes à supprimer : j 20 dd k .

0 votes

Final k déplace le curseur au-dessus de la ligne initiale. De plus, la position de la colonne du curseur sera perdue à cause de dd .

0 votes

@ib : Non, dans mes tests, ça ne marche pas. L'avez-vous vraiment essayé ? Notez l'initiale j .

0 votes

Je suis désolé, mon premier point était faux (lorsque j'ai essayé la commande, je n'ai pas remarqué que le nombre que j'ai spécifié ('20', dans votre exemple) était supérieur au nombre de lignes jusqu'à la fin du tampon). Mais le deuxième point demeure : la position de la colonne du curseur change après que dd (au premier caractère non-blanc de la ligne à côté des lignes supprimées, je crois).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X