vim – Comment supprimer un gros bloc de texte sans compter les lignes?

En vim, je me retrouve souvent à supprimer (ou copier) de gros blocs de texte. On peut compter les lignes de texte et dire (par exemple) 50dd pour supprimer 50 lignes.

Mais comment supprimer ce grand bloc de texte sans avoir à savoir combien de lignes supprimer?

Je ne suis pas un vim gourou, mais ce que j’utilise dans ces circonstances est le “mode visuel”. En mode commande, tapez V (majuscule). Puis déplacez-vous vers le haut / bas pour mettre en surbrillance le bloc que vous souhaitez supprimer (toutes les commandes de mouvement habituelles fonctionnent). Ensuite, retirez-le avec x ou d .

Allez sur la ligne de départ et tapez m (marque “a”). Ensuite, allez à la dernière ligne et entrez d ' a (supprimer pour marquer “a”).

Cela supprimera toutes les lignes du courant au marqué (inclus). Il est également compatible avec vi ainsi qu’avec vim , au cas où votre environnement ne serait pas doté de ce dernier.

Vous pouvez également utiliser le mode visuel (certaines commandes sont également utilisables avec l’option delete) vip vap pour sélectionner le paragraphe, v2ap pour sélectionner deux paragraphes dap works, d2ap également. Vous pouvez supprimer des blocs de [ ] comme da [

Pour référence: les types d’objects. De la documentation vim: section 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 

Il y a beaucoup de meilleures réponses ici, mais pour être complet, je mentionnerai la méthode que j’utilisais avant de lire certaines des excellentes réponses mentionnées ci-dessus.

Supposons que vous vouliez supprimer des lignes 24-39. Vous pouvez utiliser la commande ex

 :24,39d 

Vous pouvez également tirer des lignes en utilisant

 :24,39y 

Et trouver et remplacer juste sur les lignes 24-39 en utilisant

 :24,39s/find/replace/g 

Si vous activez les numéros de ligne via le set number vous pouvez simplement dNNG qui supprimera la ligne NN de la position actuelle. Vous pouvez donc naviguer jusqu’au début de la ligne que vous souhaitez supprimer et simplement d50G supposant que c’est la dernière ligne que vous souhaitez supprimer.

Cela dépend en quelque sorte de ce grand bloc . Vous voulez peut-être simplement supprimer un paragraphe, auquel cas un plongeon ferait l’affaire.

Il y a plusieurs possibilités, le meilleur dépend du texte sur lequel vous travaillez.

Deux possibilités me viennent à l’esprit:

  • passer en mode visuel ( V , SV , …), sélectionner le texte avec le mouvement du curseur et appuyer sur d
  • supprimer un paragraphe entier avec: dap

Si le bloc entier est visible à l’écran, vous pouvez utiliser le paramètre relativenumber. Voir: help relativenumber. Disponible en 7.3

Vous pouvez placer votre curseur au début ou à la fin du bloc et passer en mode visuel (shift-v). Ensuite, déplacez-vous simplement vers le haut ou le bas jusqu’à ce que le bloc souhaité soit mis en surbrillance. Enfin, copiez le texte en appuyant sur y ou coupez le texte en appuyant sur d.

En plus des autres mouvements déjà mentionnés, il y a aussi un mouvement /{pattern} , donc si vous savez que vous voulez supprimer de la ligne contenant foo, vous pouvez faire dV/foo . V est ici pour forcer le mouvement à être dans le sens de la ligne car par défaut / est de caractère.

Compter les lignes est trop fastidieux pour moi, mais compter les «paragraphes» n’est pas si grave. ‘{‘ et ‘}’ déplacent le curseur sur la première ligne vide avant et après le curseur, respectivement. Les opérations de déplacement de curseur peuvent être combinées avec la suppression, et plusieurs autres réponses ont utilisé une approche similaire (dd pour une ligne, dG pour la fin du document, etc.)
Par exemple:

 /* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */ Lorem *ipsum(void) { return dolor(sit, amet); } 

Si votre curseur commence au-dessus du bloc de commentaires, «d}» supprime le bloc de commentaires et «d2}» supprime à la fois le bloc de commentaires et le bloc de code. Si votre curseur démarre sous le bloc de code, «d {» supprime le code et «d2 {» supprime les deux. Bien sûr, vous pouvez ignorer un bloc en déplaçant le curseur en premier: ‘{d {‘ ou ‘} d}’.

Si vous êtes cohérent avec votre espace, ou si vous pouvez compter les paragraphes d’un coup d’œil, cela devrait fonctionner. Le fichier d’aide de Vim a plus de trucs si cela vous intéresse.

Vous pouvez également entrer un très grand nombre, puis appuyer sur dd si vous souhaitez supprimer toutes les lignes sous le curseur.

Supprimer un bloc de texte

En supposant que votre curseur se trouve au début du bloc:

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

Explication

  • Entrer en mode “visuel par ligne”: V
  • Mettez en surbrillance jusqu’à la prochaine ligne vide: /^$
  • Supprimer: d

Reliure à clé

Une solution plus robuste:

 :set nowrapscan :nnoremap DV/^\s*$\\|\%$d 

Explication

  • Désactiver le retour à la recherche :set nowrapscan
  • Remapper la clé D (aux commandes suivantes) :nnoremap D
  • Entrer en mode “visuel par ligne”: V
  • Mettez en surbrillance jusqu’à la prochaine ligne vide / blanche ou EOF: /^\s*$\\|\%$
  • Supprimer: d