Pouvez-vous saisir ou supprimer entre parenthèses dans vi / vim?

128

Étant donné cette ligne de code en C:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));

Existe-t-il un moyen de supprimer ou de retirer la première parenthèse en gras à sa parenthèse correspondante? J'ai pensé à df) , mais cela ne vous amènera que juste après la 9.0.

Existe-t-il un moyen similaire pour que vim saisisse tout entre les accolades correspondantes, quelles que soient les nouvelles lignes?

romandas
la source

Réponses:

167

Diverses motions:%

La %commande passe à la correspondance de l'élément sous le curseur. Positionnez le curseur sur le paren d'ouverture (ou de fermeture) et utilisez y%-le d%pour supprimer ou tout supprimer du curseur au paren correspondant.

Cela fonctionne parce qu'il %s'agit d'une "commande de mouvement", donc elle peut être utilisée partout où vim attend une telle commande. De :help y:

["x]y{motion}       Yank {motion} text [into register x].  When no
                    characters are to be yanked (e.g., "y0" in column 1),
                    this is an error when 'cpoptions' includes the 'E'
                    flag.

Par défaut, "item" comprend des crochets, des accolades, des parenthèses, des commentaires de style C et diverses instructions de précompilateur ( #ifdef, etc.).

Il existe un plugin pour "% matching étendu" que vous pouvez trouver sur la page d'accueil de Vim .

Vous pouvez lire la documentation %et les commandes de mouvement associées en entrant :help various-motionsen mode commande.

sélection d'objet

Il existe un autre ensemble de commandes de mouvement que vous pouvez utiliser en mode Visuel pour sélectionner divers objets texte.

Pour résoudre votre problème spécifique, procédez comme suit:

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                   ^

Disons que votre curseur est positionné sur ^. Entrez la séquence suivante pour sélectionner la pièce que vous recherchez:

v2a)

vPassez d' abord en mode visuel, puis vous spécifiez que vous souhaitez augmenter les 2niveaux de parens. Enfin, le a)sélectionne "un bloc". Après cela, vous pouvez utiliser dou xsupprimer, etc.

Si vous ne souhaitez pas inclure les parenthèses externes, vous pouvez utiliser "bloc interne" à la place:

v2i)

Consultez :help object-selectla liste complète des commandes associées.


la source
Merci! Je savais que% basculait entre les éléments correspondants; Je ne savais pas qu'il était également utile dans les commandes. +1 et accepté.
romandas
5
Intéressant, j'ai toujours pensé que cela asignifiait «autour» plutôt que «a». Sentez-vous qu'il complète mieux "intérieur". Il ne se passe pas un jour sans apprendre quelque chose de nouveau sur Vim semble-t-il.
Andrew Marshall
217

Et dibou di(.

Cela supprimera le bloc intérieur (...) où se trouve le curseur.

J'adore les mouvements et les sélections d' objets texte !

CMS
la source
10
Heureusement, cette question est le premier succès lorsque je cherche sur Google - je ne sais pas combien de fois cette réponse m'a sauvé. Et je l'oublie toujours… :-(
Konrad Rudolph
16
Est-il possible de supprimer en incluant les parenthèses? (oui, j'ai répondu à ma propre question: dab=> supprimer un bloc (y compris ses parenthèses)
bantic
5
Je vote. De plus, si vous voulez corriger le mot entre parenthèses, faites ciw .
Développeur Marius Žilėnas
5
+1! J'ai été époustouflé quand j'ai découvert les mouvements d'objets texte récemment! Plus besoin d'essayer de positionner le curseur au bon endroit pour retirer du texte: D
verboze
36

Pour supprimer tout ce qui se trouve à l'intérieur d'une paire de parenthèses, vous pouvez toujours émettre di(et ses dérivés.

Remarque :

Comme @porglezomb l'a suggéré dans son commentaire, vous pouvez utiliser a("avec") au lieu de i("à l'intérieur") pour inclure les parenthèses. Ainsi, l'utilisation da(supprime tout ce qui se trouve à l'intérieur (et )y compris (et ).

Suppression du texte à l'intérieur de la paire externe immédiate de parenthèses:

Donc, pour cette ligne de code

printf("%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32)));
                                ^       ^
                                |       |
                                 \_______\___---> Cursor range

en supposant que votre curseur se trouve dans la plage de curseur mentionnée ci-dessus, vous pouvez émettre les commandes suivantes:

di(   --> Deletes '5.0/9.0'
ci(   --> Substitutes '5.0/9.0'
yi(   --> Yanks '5.0/9.0'

Suppression du texte à l'intérieur de la n-ième paire de parenthèses externes:

Pour saisir tout ce qui se trouve à l'intérieur de la n-ième paire de parenthèses externes, ajoutez simplement navant la commande ci-dessus. Donc, avec la même position de curseur que ci-dessus,

2di(   --> Deletes '(5.0/9.0) * (fahr-32)'
2ci(   --> Substitutes '(5.0/9.0) * (fahr-32)'
2yi(   --> Yanks '(5.0/9.0) * (fahr-32)'

3di(   --> Deletes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3ci(   --> Substitutes '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
3yi(   --> Yanks '"%3.0f\t%6.1f\n", fahr, ((5.0/9.0) * (fahr-32))'
Kevin
la source
3
Vous devriez ajouter une note parlant acomme contrepartie i, car cela aidera probablement beaucoup de gens.
porglezomp
@romandas ceci devrait être la question acceptée. Je cherchais exactement le même problème aujourd'hui et @Kevin est le seul ici à donner la bonne réponse. Bien sûr, je pourrais "abuser" %de ce problème, mais cela prend plus de temps et, à mon avis, ne devrait être utilisé que pour des scénarios plus complexes. Supprimer quelque chose à l'intérieur d'une certaine portée est exactement le cas d'utilisation di.
daniel451
19

Vous pouvez utiliser d%pour supprimer et y%pour supprimer .

ahy1
la source
3
% est le spécificateur de mouvement pour "parenthèse, crochet ou accolade correspondant". Toute spécification de mouvement peut être associée à d et y (et bien d'autres choses).
chaos
10

Placez votre curseur sur la première parenthèse, puis appuyez sur v%you v%d.

David Norman
la source
3
Génial! % passe au paren correspondant. Vous pouvez donc même utiliser d% et y%.
1
Notez également que 'd%' peut commencer au début d'un nom de fonction et supprimera l'appel de fonction entier. Cela fonctionne également pour les paires '{}', '[]' et même '<>'.
Jonathan Leffler
@Leffler, merci pour les conseils! Et il est bon de savoir que% fonctionne également en mode visuel.
strager
3

Essayez ci [block-surrounder]

Dans votre cas, placez le curseur n'importe où entre les 2 parenthèses que vous avez mises en surbrillance et essayez les touches: ci (

Justin Nguyen
la source
Presque. En testant cela, il semble que le curseur doit être sur la première parenthèse, pas entre, et «c» est la commande de changement. Avec le curseur sur la parenthèse ouvrante, 'di (' se supprime à la parenthèse fermante correspondante, et 'yi (' yanks.
Richard Neish
ci travaille pour moi tout le temps. Tout ce que j'ai à faire est de m'assurer que le curseur se trouve entre les parenthèses qui entourent le bloc de texte que je dois supprimer.
Justin Nguyen
2

Comme le dit la réponse de David Norman,

Placez votre curseur sur la première parenthèse, puis appuyez sur v%you v%d.

Explication de http://vimdoc.sourceforge.net/htmldoc/vimindex.html :

tag char note action en mode normal        
-------------------------------------------------- ----------------------------
| v | v démarrer le mode visuel par caractère
|% | % 1 trouve le crochet suivant (bouclé / carré) sur
                                       cette ligne et aller à son match, ou aller à
                                       parenthèse de commentaire correspondante, ou accédez à la correspondance
| d | ["x] d {motion} 2 supprimer le texte Nmove [dans le tampon x]

Cela signifie qu'il sélectionnera tout ce qui se trouve entre et y compris les deux crochets ( %) tout en vous montrant visuellement la sélection ( v), puis retirera / copiera you supprimera / coupera d. (Vers le tampon par défaut.)

Vous pouvez mettre / coller avec p.

J'ai fait cette réponse pour "m'apprendre à pêcher" .

n611x007
la source
note: vimdoc.sourceforge.net est lié à vim.org qui est le site officiel de vim à partir de 2015.
n611x007