144 votes

Peut-on saisir ou supprimer entre les parenthèses dans vi/vim ?

É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 d'arracher la première parenthèse en gras à sa parenthèse correspondante ? J'ai pensé à df) mais cela ne vous amènera qu'après le 9.0.

Existe-t-il un moyen similaire pour que vim saisisse tout ce qui se trouve entre les accolades correspondantes, sans tenir compte des nouvelles lignes ?

253voto

CMS Points 315406

Qu'en est-il dib o di( .

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

J'aime objet texte motions et sélections !

10 votes

Heureusement, cette question apparaît en premier lorsque je la cherche sur Google. Je ne sais pas combien de fois cette réponse m'a sauvé. Et je l'oublie toujours :-(

18 votes

Est-il possible de supprimer y compris les parenthèses ? (oui, j'ai répondu à ma propre question : dab => supprimer a (y compris ses parenthèses)

5 votes

Je vote pour. De plus, si vous voulez corriger un mot entre parenthèses, faites ce qui suit ciw .

181voto

hop Points 15423

Diverses motions : %.

El % commande saute à la correspondance de l'élément sous le curseur. Positionnez le curseur sur la parabole d'ouverture (ou de fermeture) et utilisez la fonction y% pour tirer ou d% pour effacer tout ce qui se trouve entre le curseur et la parabole correspondante.

Cela fonctionne parce que % est une "commande de mouvement", elle peut donc être utilisée partout où vim attend une telle commande. À partir 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" inclut les crochets, les accolades, les parenthèses, les commentaires de style C et diverses instructions de précompilation ( #ifdef etc.).

Il existe un plugin pour la "correspondance étendue de %" que vous pouvez trouver sur le site de l Page d'accueil de Vim .

Vous pouvez lire la documentation sur % et les commandes de mouvement connexes en entrant :help various-motions en mode commande.

sélection d'objets

Il existe une autre série 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, vous devez procéder comme suit :

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

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

v2a)

Premier v entre en mode visuel, puis vous spécifiez que vous voulez aller 2 niveaux de parenthèses vers le haut. Enfin, le a) sélectionne "un bloc". Après cela, vous pouvez utiliser d o x à supprimer, etc.

Si vous ne voulez pas inclure les parenthèses extérieures, vous pouvez utiliser "bloc intérieur" à la place :

v2i)

Ver :help object-select pour la liste complète des commandes associées.

0 votes

Merci. Je savais que le % permettait de passer d'un élément à l'autre ; je ne savais pas qu'il était également utile dans les commandes. +1 et accepté.

6 votes

Intéressant, j'ai toujours pensé a voulait dire "autour" plutôt que "a". J'ai l'impression que ça complète mieux "inner". Il ne se passe pas un jour sans qu'on apprenne quelque chose de nouveau sur Vim, semble-t-il.

44voto

kevin Points 1256

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

Suppression du texte à l'intérieur de la paire de parenthèses immédiatement extérieure :

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 à l'intérieur de la plage de curseurs mentionnée ci-dessus, vous pouvez lancer 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 nième paire de parenthèses extérieures :

Pour récupérer tout ce qui se trouve à l'intérieur de la n-ième paire de parenthèses extérieure, il suffit d'ajouter n avant la commande ci-dessus. Donc, avec la même position du 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))'

4 votes

Vous devriez ajouter une note parlant de a comme la contrepartie de i car cela pourrait aider beaucoup de gens.

0 votes

@romandas cela 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 "mal utiliser" % pour 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'un certain périmètre est exactement le cas d'utilisation di est fait pour.

20voto

ahy1 Points 138

Vous pouvez utiliser d% pour effacer et y% pour arracher.

3 votes

% est le spécificateur de mouvement pour "parenthèse, parenthèse ou accolade appariée". Toute spécification de mouvement peut être appariée avec d et y (et bien d'autres choses).

10voto

David Norman Points 9156

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

3 votes

Génial ! % saute à la paren correspondante. Vous pouvez donc utiliser d% et y%.

1 votes

Notez également que 'd%' peut commencer au début du nom d'une fonction, et supprimera l'appel de fonction entier. Il fonctionne également pour les paires '{}', '[]' et même '<>'.

0 votes

@Leffler, Merci pour les conseils ! Et c'est bon de savoir que % fonctionne aussi en mode visuel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X