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


91

Dans vim, j'ai souvent besoin de supprimer ou de tirer / mettre de gros blocs de texte.

Je peux compter les lignes de texte et entrer quelque chose comme 50ddsupprimer 50 lignes.

Mais c'est un peu pénible. Comment puis-je supprimer ce gros bloc de texte sans avoir à connaître le nombre de lignes à supprimer au préalable?


4
Comment savez-vous où se trouve la fin? Si vous pouvez décrire la fin, vous pouvez supprimer ce point. Si vous pouvez décrire comment vous pouvez movejusqu'au bout. Supprimer ensuite jusqu’à la fin n’est pas différent du déplacement vers la fin.
Martin York

@Loki, aller à la fin consiste généralement à utiliser le bas de page et les touches fléchées jusqu'à ce que j'y parvienne. Il peut être la première ou la dixième ligne vide, il peut être la première accolade fermante. En bout de ligne est, cela varie un peu.

2
vérifiez également cette réponse: stackoverflow.com/a/16407391/164835
Kent

Réponses:


111

Allez à la ligne de départ de votre bloc et tapez ma(marque "a", bien que vous puissiez bien sûr utiliser différentes lettres, et même plusieurs lettres pour différentes marques à condition que vous puissiez garder dans votre tête ce que chaque lettre est une marque) .

Ensuite, allez à la dernière ligne et entrez d'a(effacer pour marquer "a") ou y'a(tirer pour marquer "a") (a) .

Cela supprimera / supprimera toutes les lignes du courant au marqué (inclus).

Ensuite, vous pouvez le coller ailleurs avec les commandes de collage normales, telles que pou P.

Il est également compatible avec viet vim, à tout hasard, que votre environnement n’est pas doté de ce dernier.


(a) J'utilise aussi cela pour sauvegarder ma place dans le fichier si je dois aller chercher ailleurs quelque chose comme, par exemple, copier-coller la définition d'une fonction que je veux appeler.

Je marque simplement la ligne actuelle de la même manière ma, puis je m'éloigne pour trouver ce que vous cherchez.

Ensuite, une fois que je l’ai trouvée et copiée dans un registre, j’ai juste à entrer 'apour revenir en arrière pour marquer "a", la ligne que j’avais sauvegardée auparavant, où je pourrai ensuite la coller.


9
Pourriez aussi bien utiliser le mode visuel pour cela, non?
JMC

3
C'est un moyen, jmc, mais je ne suis pas sûr que vi standard dispose d'un mode visuel.

5
Depuis que je suis passée de la sélection visuelle au marquage et aux numéros de ligne relatifs il y a environ un an, j'ai constaté que les commandes de mouvement vi sont beaucoup plus rapides et efficaces que la sélection visuelle. Même si cela est plus facile chaque fois que je tape sur la vtouche, je me demande si j'en ai vraiment besoin ou s'il existe une meilleure méthode de déplacement.
Sukima

1
Oui, de la même manière il est intéressant, @Sukima, que je me sente plus efficace moins j'utilise la souris, même dans une interface graphique. Je me trouve plus rapide si je peux rester au clavier.

3
Si vous éditez quelque chose avec de très longues lignes, la version en arrière-tir de celle-ci peut également s'avérer très pratique (qui fait référence à la place dans la ligne plutôt qu'à la ligne entière).
msouth

65

Dans Vim, utilisez le mode ligne visuelle :

  1. Placez votre curseur sur la ligne supérieure du bloc de texte / code à supprimer
  2. Presse V(c'est la capitale "V": Shift+ v)
  3. Déplacez votre curseur vers le bas du bloc de texte / code pour le supprimer
  4. presse d

Pour supprimer des blocs de texte volumineux, cela est préférable au mode visuel simple, car vous n'avez pas à vous soucier de la colonne à laquelle se trouve le curseur.


3
À l'étape 3. vous pouvez vous déplacer plus rapidement en utilisant les mouvements d'objet. Par exemple, vous pouvez utiliser }pour sélectionner un paragraphe entier ou )pour des phrases. Il y en a plus, vous pouvez lire à leur sujet dans:h object-motions
mxlian

2
La recherche d’une sous-chaîne /something<CR>est également une méthode très efficace pour atteindre la fin de votre bloc de sélection
mxlian

1
Ceci est ma méthode préférée. Cependant j, vous pouvez également saisir le numéro de la ligne, sans avoir à appuyer de façon répétée sur pour déplacer le curseur vers le bas (étape 3), puis sur Gpour sélectionner cette ligne. Exemple:V150Gd
Ranhiru Jude Cooray


39

Vous pouvez facilement supprimer un gros bloc de texte en connaissant sa structure.

Si c'est un paragraphe, utilisez: d{(par exemple, vous pouvez préfixer avec le nombre de paragraphes)

S'il s'agit d'un bloc de code entre parenthèses, utilisez: d%

Si le texte apparaissant jusqu'à la fin du fichier, utilisez: dG

Si vous savez comment cela se termine, utilisez: d/et tapez le texte de fin suivi de Enter(vous pouvez également utiliser une expression régulière, les possibilités sont donc infinies).

Vous pouvez également utiliser le mode visuel ( V) et utiliser les touches de déplacement pour sélectionner rapidement le texte (par exemple, par {) et le supprimer ( d).

Ou, comme le suggère Lie Ryan, utilisez d/search-string/epour supprimer le texte du curseur actuel à la chaîne recherchée.

Voir: :help det :help motionpour plus d'informations.


2
Il est également possible d/search-string/ede supprimer du curseur actuel jusqu'à la fin de la chaîne de recherche, y compris la chaîne de recherche elle-même, et c/search-queryd'entrer en mode insertion après la suppression. L'utilisation de d/with set incsearchest une combinaison intéressante, car elle vous permet de déterminer de manière interactive si vous utilisez la bonne plage de texte et vous aide à savoir quand arrêter de taper la requête de recherche pour éviter de saisir plus que nécessaire.
Lie Ryan

4
Je trouve également davec a(externe), ou i(interne) et un spécificateur d'objet très utile. Des objets tels que wpour mot, ppour le paragraphe, (ou bpour (...), [pour [...], {ou Bpour {...}etc documentation-opérateurs visuels .
Shahbaz

22

Vous pouvez utiliser des mouvements et / ou des objets texte. Par exemple, vous pouvez tout supprimer du curseur à la ligne vierge suivante avec d}. Si le curseur est à l'intérieur d'un paragraphe, celui-ci peut être supprimé avec dipou dap. Si le curseur est dans une balise HTML, vous pouvez le supprimer avec ditou dat.

De bons mnémoniques pour ceux - ci sont " d elete i Nside" et " d élete un tour" (paragraphe / tag / parenthèses).


11

Je fais habituellement

:<start>,<end>d

qui effacera chaque ligne entre les numéros de ligne de début et de fin fournis (y compris les lignes données).

Notez que les deux startet endpeuvent être des numéros de ligne absolus, des modèles ou des décalages d'une autre position.

Voir aussi le commentaire de DoubleDown sur l' affichage de Vim gamme de documentation, il a quelques conseils utiles.

Exemple:

Disons que vous avez le fichier suivant:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

Ensuite, en utilisant la commande :2,3dou :/fox/,/over/dou :/quick/+1,/lazy/-1ou :+1,+2dsi vous êtes sur la première ligne ou :-1,.dsi vous êtes sur la troisième ligne, vous obtenez:

1. The quick brown
4. lazy dog.

Mais cela signifie que vous devez toujours compter les lignes? Ou ai-je mal compris votre réponse?
Martin Tournoij

7
Vous n'avez pas besoin de compter les lignes, mais vous devez connaître les numéros de ligne.
JMC

Commencez par faire :set ruler, puis allez en haut et en bas du texte pour trouver les numéros de ligne startet les endlignes, puis faites-le:<start>,<end>d
roblogic

1
Vous pouvez également utiliser des numéros de ligne relatifs:+12,+24d
rpattabi

2
En fait, vous pouvez utiliser une paire de numéros de ligne, une paire de motifs ou une paire mélangée pour <start>et <end>pour cela. Pour référence, voir :h [range]. C'est donc un peu plus souple que vous ne l'aviez prévu.
doubleDown

5

Si vous avez affaire à des blocs délimités (par exemple, des balises de code ou XML / HTML), vous pouvez positionner le curseur au début du bloc et utiliser le mode visuel avec %pour sélectionner rapidement des blocs de code entiers, puis appuyer sur dpour les supprimer.


5
Vous pouvez également utiliser dappour supprimer un paragraphe, da(, da{, da[, supprimer des blocs delimeted par des parenthèses, des accolades ou des crochets. Pour HTML, il existe dat, qui supprime une balise da'et da"supprime des chaînes. Il y a aussi les dip, di(, etc variantes, qui supprimera tout à l' intérieur des délimiteurs, mais laisser les délimiteurs intacte. Vous pouvez également utiliser vap(resp vip) pour sélectionner tous les paragraphes (resp interne). (Et alors il y a va(et vi(.) Ensuite il y a capet cip(ou ca(et ci() pour supprimer et aller au mode insertion (c'est-à-dire "changer"). Et yappour tirer
JMC

Je pense que certaines des liaisons décrites par @jmc dans son commentaire précédent proviennent du plug-in surround.vim de Tim Pope. Je recommande l'installation de ce plugin, mais cela signifie que ces liaisons ne font pas partie de l'installation par défaut de vim.
Haegin

5

Outre tous les autres bons conseils, j'ajoute d+ Shift+ Lpour tout supprimer de la position actuelle du curseur à la dernière ligne visible à l'écran. En répétant la commande, vous tomberez relativement vite.


5

Le plugin numbers.vim est très utile pour cela. C'est une manière améliorée de faire précéder chaque ligne d'un numéro de ligne. Comme 'number'et 'relativenumber', les deux réunis en un!

Il est activé par défaut après l'installation. Vous souhaitez également l'ajouter set numberà votre vimrc si vous ne le possédez pas déjà, car il se comporte de façon étrange si vous ne le possédez pas.

En mode normal, cela ressemble à :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

Il vous montre les numéros de ligne relatifs, à l' exception de la ligne sur laquelle le curseur est placé, où il indique le numéro de ligne absolu (7 dans ce cas).

Si nous passons ensuite en mode insertion , il se comportera comme si numberc'était toujours affiché en affichant des numéros de ligne absolus:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

Il y a quelques options supplémentaires et quelques commandes (consultez la page d'accueil), mais les valeurs par défaut devraient fonctionner pour la plupart des gens.


Au début, je pensais que cette réponse était un peu hors sujet, mais ensuite j'ai installé le plugin et je dois dire que cela change la donne pour moi. J'avais l'habitude d'échanger manuellement et l'étape mentale supplémentaire signifiait que j'avais peur d'utiliser ces mouvements. Je vous remercie!
Sukima

1
Cela ressemble à quelque chose qu'un InsertEnter / InsertLeave autocmd pour changer la numérotation de ligne relative pourrait faire. Est-ce que je manque quelque chose?
Ben

Je suis TRÈS en retard à la fête mais @Ben a raison, il ne s'agit que de quelques lignes d'auto-commandes. Par exemple, dans mon vimrc j'ai set number, set relativenumberalors autocmd InsertEnter * :set norelativenumberetautocmd InsertLeave * :set relativenumber
couche B

4

Une autre approche consiste à taper simplement si vous essayez de supprimer un motif spécifique d/delimEnter.


2

Vous pouvez utiliser la procédure normale de saisie dplus un mouvement (comme déjà expliqué dans les autres réponses). Le plugin EasyMotion, fournit de nouveaux mouvements que vous pouvez utiliser qui pourraient résoudre votre problème de manière rapide et facile.

Supposons que vous souhaitiez supprimer de la position actuelle du curseur jusqu'à la fin d'un mot donné à l'écran, les touches de mouvement seraient <Leader><Leader>e( comme si elles étaient en emouvement normal ). Ensuite, tapez la ou les lettres en surbrillance qui apparaissent à la fin du mot en question. Il y a aussi un mouvement de ligne de sorte que vous pouvez supprimer la ligne courante jusqu'à la ligne en question <Leader><Leader>j.

J'ai ma <Leader>clé pour ,. La commande complète est donc d<Leader><Leader>e{lettre en surbrillance}.

De :help easymotion:

EasyMotion fournit un moyen beaucoup plus simple d'utiliser certains mouvements dans vim. Pour <number>sortir de <number>w ou <number>f, {char}sélectionnez tous les choix possibles et appuyez sur une touche pour accéder directement à la cible.

Lorsqu'un des mouvements disponibles est déclenché, tout le texte visible précédant ou suivant le curseur est estompé et les cibles de mouvement sont mises en surbrillance.

Modifier:

Le référentiel github d'EasyMotion est disponible à l' adresse https://github.com/Lokaltog/vim-easymotion .

Cette reddit sur les personnes utilisant easymotion pourrait être une lecture amusante.


1

Il existe une solution simple qui peut résoudre votre problème.

Placez votre curseur au début du bloc de texte que vous souhaitez supprimer et faites-le d50gg.

Cela supprimera toutes les lignes de votre position actuelle à la 50ème ligne de votre texte.

eq: si votre curseur est à la ligne 46 , d50ggsupprimera 4 lignes.


1
Je suggérerais d'utiliser Gplutôt que gg car cela fonctionne également dans vi et :set numberest bien sûr toujours utile pour trouver le numéro de ligne de la ligne à laquelle vous voulez aller.
Random832

Le but de cette question est que vous ne savez pas combien de lignes vous souhaitez supprimer.
200_success

200_success, vous n'avez pas besoin de savoir combien de lignes vous souhaitez supprimer avec la réponse que j'ai postée. Tout ce que vous devez savoir, c'est "sur quelle ligne voulez-vous supprimer"
Geee

1

Utilisez le mode visuel avec la surbrillance des lignes.

  1. Placez votre curseur sur la ligne supérieure du bloc de texte / code à supprimer
  2. Appuyez sur Shift+v
  3. Déplacez votre curseur vers le bas du bloc de texte / code pour le supprimer
  4. presse d

Je préfère cette méthode pour supprimer des blocs de code, car elle supprime des lignes entières par rapport à un simple mode visuel dans lequel vous devez positionner le curseur dans la colonne de droite pour supprimer ce que vous voulez.


3
Vous répétez essentiellement la réponse par @ 200_success.
Réintégrer Monica - M. Schröder le

1

Je n'aime pas être relativenumberen permanence, alors j'ai configuré mon Vim pour l'activer uniquement lorsque je suis en mode visuel:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

Cela rend votre tâche facile:

V49jd

car après avoir frappé, Vvous pouvez voir à quelle distance se trouve la ligne cible.

Cela peut s'avérer ennuyeux à long terme (le texte se déplace de droite à gauche lorsque le nombre relatif est activé / désactivé), mais jusqu'à présent, je l'apprécie beaucoup.


1
Je pense que vous utilisez v<Esc>d50j?
Martin Tournoij

Merci, je l'avais en effet mal écrit. En fait, je commence par Vsavoir si je sais que je vais effectuer une opération en ligne, puis je peux laisser le ddernier jusqu'à la fin, pour plus de confiance.
joeytwiddle

Ma réponse semble être une approximation du pauvre homme du plugin numbers.vim proposé dans une autre réponse. ;-)
joeytwiddle

1

Ce qui a bien fonctionné pour moi avec vi:

  1. :set number pour afficher le numéro de la ligne jusqu'à l'endroit où je voulais supprimer;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. Retournez à la ligne où la suppression devait commencer

  3. Suppression utilisée de la ligne en cours, en mode normal> d1290G
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.