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


193

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

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


1
Si la fenêtre est suffisamment grande, la numérotation relative des lignes est utile ici. Placez le curseur en haut de la fenêtre, recherchez le numéro de ligne relatif de la dernière ligne à supprimer (disons, n), ajoutez-en un, puis tapez ce numéro, puis tapez dd. Par exemple, si n = 50, alors 51dd. Alternativement, utilisez une commande de mouvement -50d<down arrow>
BallpointBen

"Trouvez le numéro de ligne relatif" - ou, utilisez :set rnuet Vim le fera instantanément! La ligne sur laquelle vous vous trouvez sera toujours numérotée de manière absolue, mais les lignes au-dessus et en dessous du curseur seront symétriquement numérotées 1, 2, ... (et mises à jour avec le mouvement du curseur, les événements au niveau du fichier, etc.)
John P

Réponses:


287

Je ne suis pas un gourou de Vim, mais ce que j'utilise dans ce cas est le "mode visuel". En mode commande, saisissezV (majuscule). Ensuite, déplacez-vous vers le haut / bas pour mettre en surbrillance le bloc que vous souhaitez supprimer (toutes les commandes de mouvement habituelles fonctionnent). Retirez-le ensuite avec xou d.


2
Étrange. Je sais que ça marche pour moi (tm) ici sur Linux (vim 7.3.50) et avec gVim sur Windows. Et à en juger par les autres réponses, fonctionne pour d'autres personnes. Peut-être que certains paramètres dans votre jeu le .vimrcfont agir?
Mat

OK, pour une raison quelconque, je ne savais pas que vous pouviez entrer en mode ligne visuelle en utilisant Shift- v... J'essayais également d'utiliser la CTRLtouche. Cela fonctionne donc et est probablement le moyen le plus pratique.
Justin Ethier

7
Vous voudrez peut-être préciser qu'il existe deux modes visuels - Ligne visuelle ( CTRL- v) et Bloc visuel ( Shift- v).
Justin Ethier

2
Je le fais beaucoup. Mais je le considère toujours comme une tricherie et un vim moins qu'idéal.
Jim Mitchener

9
Il existe en fait trois modes visuels: mode visuel (basé sur les caractères {v}), mode ligne visuel (basé sur la ligne {Sv}) et mode bloc visuel (permet la sélection de blocs {Cv})
Tom Regner

293

Accédez à la ligne de départ et tapez ma(marque "a"). Allez ensuite à la dernière ligne et entrezd'a (supprimer pour marquer "a").

Cela supprimera toutes les lignes de la ligne actuelle à celle marquée (incluse). Il est également compatible avec viet vimau cas où votre environnement ne serait pas béni avec ce dernier.


3
Ces roches flippantes! Je déteste combien de temps je fais juste quelque chose (comme compter des lignes) avant d'aller chercher une meilleure solution. Merci!
ryanjdillon

1
vraiment génial, j'utilise toujours le mode visuel pour supprimer le bloc, mais c'est mieux +1
hish

4
J'ai trouvé cela plus utile que le mode visuel pour supprimer 500k + lignes
Michael - Where's Clay Shirky

Réponse vraiment pratique. Je l'utilise pour supprimer les e-mails de mon serveur du fichier /var/mail/usernameen bloc et laisser les derniers e-mails intacts. Je fais une marque, puis j'entre par exemple 50000suivi de ggpour aller à la ligne 50.000, puis je supprime toutes les lignes intermédiaires. fonctionne comme un charme!
otmezger

1
@horta, je n'utiliserais probablement pas d' vimoutil pour éditer des fichiers gigaoctets - j'aurais tendance à opter pour des outils de traitement de texte tels que awket ses frères :-)
paxdiablo

46

Vous pouvez utiliser le mode visuel aussi (certaines commandes sont utilisables avec l'option de suppression également) vip vappour sélectionner le paragraphe, v2appour sélectionner deux paragraphes dapœuvres, d2apaussi. Vous pouvez supprimer des blocs [ ]similairesda[

Pour référence: les types d'objets. Depuis la documentation de 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                  

1
da [, da {, da "tous utiles pour les programmeurs
Rene Wooller

1
Merci! dapest très facile à retenir comme "supprimer un paragraphe"
Tropilio

38

Il y a beaucoup de meilleures réponses ici, mais pour être complet, je mentionnerai la méthode que j'ai utilisée 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 recherchez et remplacez un peu plus de lignes 24-39 en utilisant

:24,39s/find/replace/g

11

Si vous activez les numéros de ligne via, set numbervous pouvez simplement dNNGsupprimer la ligne NN de la position actuelle. Vous pouvez donc naviguer jusqu'au début de la ligne que vous souhaitez supprimer et en d50Gsupposant simplement que c'est la dernière ligne que vous souhaitez supprimer.


10

Cela dépend en quelque sorte de ce qu'est ce gros bloc . Peut-être que vous voulez simplement supprimer un paragraphe auquel cas cela dipferait l'affaire.


Merci pour le conseil. Malheureusement, je travaille avec du code ici, et j'ai généralement besoin d'un contrôle plus fin que cela.
Justin Ethier

1
Je travaille aussi avec du code et je sépare les blocs logiques par une ligne vide. Cette astuce vient de faire ma journée. Je peux maintenant supprimer de gros blocs de logique avec trois touches.
miniml

cela fonctionne parce que «d» signifie supprimer, «p» dans ce contexte signifie paragraphe
user98761

7

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

Deux possibilités viennent à l'esprit:

  • passer en mode visuel ( V, S-V, ...), sélectionnez le texte avec le mouvement du curseur et appuyez surd
  • supprimer un paragraphe entier avec: dap

J'utilise dap très souvent maintenant que je le connais et je préfère qu'il dise et plonge, mais il supprime toujours un bloc et la ligne vierge qui vient après le bloc, mais c'est un moyen de supprimer le bloc et la ligne vierge qui vient avant elle?
Funkodebat

Au milieu d'un texte avec des paragraphes il n'y a pas de différence syntaxique dans le résultat, n'est-ce pas? S'il y en a, je suggère d'écrire ce que vous voulez, avec des exemples, dans une nouvelle question.
Tom Regner

6

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


Je ne me suis pas rendu compte de l'utilité: se rnu était jusqu'à ce que je commence à l'utiliser - idéal pour connaître 50dd ainsi que la navigation, 50j
rshdev

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 vers 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.


peut-être bizarre, mais à partir de cela, j'ai compris comment sélectionner du texte à partir du point médian souhaité dans une ligne et sélectionner plusieurs lignes ci-dessous au même point jusqu'à la fin de chaque ligne. Exactement ce que je cherchais.
nanker

3

Parallèlement à d'autres motions déjà mentionnées ici, il y a également une /{pattern}<CR>motion, donc si vous savez que vous souhaitez supprimer la ligne contenant foo, vous pouvez le fairedV/foo<CR> . Vest là pour forcer le mouvement à être linéaire car, par défaut, il /est par caractère.


3

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 du 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 commence sous le bloc de code, 'd {' supprime le code et 'd2 {' supprime les deux. 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 votre espace, ou si vous pouvez compter les paragraphes en un coup d'œil, cela devrait fonctionner. Le fichier d'aide de Vim contient plus d'astuces de curseur si vous êtes intéressé.


1

Vous pouvez également saisir un très grand nombre, puis appuyez sur ddsi vous souhaitez supprimer toutes les lignes sous le curseur.


Il pourrait être encore plus facile à utiliser dG, ce qui supprime à la fin du document, par Gdéfaut pour aller à la dernière ligne.
andyg0808

1

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

  • Entrer en mode "linewise-visual": 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 l'habillage de recherche: :set nowrapscan
  • Remappez la Dclé (avec les commandes suivantes)::nnoremap D
  • Entrer en mode "linewise-visual": V
  • Mettez en surbrillance jusqu'à la prochaine ligne vide / blanc ou EOF: /^\s*$\\|\%$<CR>
  • Supprimer: d
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.