web-dev-qa-db-fra.com

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

Dans vim, je me trouve souvent en train de supprimer (ou de copier) de gros blocs de texte. On peut compter les lignes de texte et dire (par exemple) 50dd supprimer 50 lignes.

Mais comment supprimer ce gros bloc de texte sans savoir combien de lignes supprimer?

189
Justin Ethier

Je ne suis pas Vim Guru, mais ce que j'utilise dans cette situation, c'est le "mode visuel". En mode commande, tapez V (majuscule). Puis déplacez vers le haut/bas pour mettre en évidence le bloc que vous voulez supprimer (toutes les commandes de mouvement habituelles fonctionnent). Puis supprimez-le avec x ou d.

281
Mat

Allez à la ligne de départ et tapez ma (marquez "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 que vim, sauf que votre environnement n'est pas doté de ce dernier.

288
paxdiablo

Vous pouvez également utiliser le mode visuel (certaines commandes sont utilisables avec l'option de suppression également) vipvap sélectionner le paragraphe, v2ap sélectionner deux paragraphes dap travaux, d2ap aussi. Vous pouvez supprimer des blocs de [] comme da[

Pour référence: les types d'objets. 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                  
45
M'vy

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

Supposons que vous souhaitiez supprimer des lignes 24 à 39. Vous pouvez utiliser la commande ex

:24,39d

Vous pouvez également tirer des lignes en utilisant

:24,39y

Et trouvez et remplacez juste les lignes 24 à 39 en utilisant

:24,39s/find/replace/g
38
daviewales

Si vous activez les numéros de ligne via set number, vous pouvez simplement dNNG, ce qui supprimera la ligne NN de la position actuelle. Ainsi, vous pouvez naviguer jusqu'au début de la ligne que vous souhaitez supprimer et simplement d50G en supposant qu'il s'agit de la dernière ligne que vous souhaitez supprimer.

11
Jim Mitchener

Cela dépend en quelque sorte de ce que gros bloc. Vous voulez peut-être simplement supprimer un paragraphe, auquel cas un dip ferait.

10
René Nyffenegger

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

Deux possibilités me viennent à l’esprit:

  • passer en mode visuel (V, S-V, ...), sélectionnez le texte avec le curseur de la souris et appuyez sur d
  • supprimer un paragraphe entier avec: dap
7
Tom Regner

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

6
Rumple Stiltskin

A côté des autres motions déjà mentionnées ici, il y a aussi le mouvement /{pattern}<CR>, donc si vous savez que vous voulez supprimer la ligne contenant foo, vous pouvez faire dV/foo<CR>. V est ici pour forcer le mouvement ligne par ligne car par défaut / est caractère par caractère.

3
ZyX

Compter les lignes est trop fastidieux pour moi, mais compter les "paragraphes" n'est pas si mal. '{' 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 le bloc de commentaires et le bloc de code. Si votre curseur commence en dessous du bloc de code, 'd {' supprime le code et 'd2 {' les supprime. Bien sûr, vous pouvez sauter un bloc en déplaçant d'abord le curseur: '{d {' ou '} d}'.

Si vous êtes cohérent avec vos espaces, ou si vous pouvez compter les paragraphes en un coup d'œil, cela devrait fonctionner. Le fichier d'aide de Vim a plus d'astuces de curseur si cela vous intéresse.

3
John P

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 en appuyant sur d.

3
Judge Maygarden

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

1
Rohit Pruthi

Supprimer un bloc de texte

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

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

Explication

  • Entrez en mode "ligne-visuel": V
  • Mettez en surbrillance jusqu'à la prochaine ligne vide: /^$<CR>
  • Supprimer: d

Reliure à clé

Une solution plus robuste:

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

Explication

  • Désactiver le retour à la recherche: :set nowrapscan
  • Remappez la touche D (sur les commandes suivantes): :nnoremap D
  • Entrez en mode "ligne-visuel": V
  • Mettez en surbrillance jusqu'à la prochaine ligne vide/espace ou EOF: /^\s*$\\|\%$<CR>
  • Supprimer: d
1
Jon Nadal