web-dev-qa-db-fra.com

Pouvez-vous saisir ou supprimer entre 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'extraire de 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 récupère tout entre les accolades correspondantes, indépendamment des nouvelles lignes?

112
romandas

Motions diverses:%

Le % 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% pour tirer ou d% pour tout supprimer du curseur au paren correspondant.

Cela fonctionne parce que % est une "commande de mouvement", elle peut donc ê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" inclut les crochets, les accolades, les parens, les commentaires de style C et diverses instructions de précompilateur (#ifdef, etc.).

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

Vous pouvez lire la documentation sur % et les commandes de mouvement associées en entrant :help various-motions en 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, 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é sur ^. Entrez la séquence suivante pour sélectionner la pièce que vous recherchez:

v2a)

v passe d'abord en mode visuel, puis vous spécifiez que vous voulez aller 2 niveaux de parens en hausse. Finalement, le a) sélectionne "un bloc". Après cela, vous pouvez utiliser d ou x pour supprimer, etc.

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

v2i)

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

156
user3850

Qu'en est-il de dib ou di(.

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

J'adore text-object mouvements et sélections!

188
CMS

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

Remarque:

Comme l'a suggéré @porglezomb dans son commentaire, vous pouvez utiliser a ("avec") au lieu de i ("à l'intérieur") pour inclure les parenthèses. Donc, en utilisant da( supprime tout à l'intérieur ( et ) comprenant ( et ).

Suppression de texte à l'intérieur de la paire extérieure 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 curseurs mentionnée ci-dessus, vous pouvez exécuter les commandes suivantes:

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

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

Pour tout récupérer à l'intérieur de la n-ième paire de parenthèses externes, ajoutez simplement n avant 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))'
31
Kevin

Vous pouvez utiliser d% pour la suppression et y% pour le retrait.

16
ahy1

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

10
David Norman

Essayez ci [block-surrounder]

Dans votre cas, placez le curseur n'importe où entre les 2 parenthèses surlignées et essayez les touches: ci (

2
Justin Nguyen

Comme réponse de David Norman dit,

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

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

 action char note note en mode Normal 
 --------------------------------- --------------------------------------------- 
 | v | v démarrer le mode visuel par caractère 
 |% | % 1 trouve la parenthèse suivante (bouclée/carrée) sur 
 Cette ligne et passe à sa correspondance, ou va à 
 Parenthèse de commentaire correspondante, ou va à la correspondance 
 | D | ["x] d {motion} 2 supprimer le texte Nmove [dans le tampon x] 

Cela signifie qu'il sélectionnera tout entre et y compris les deux crochets (%) tout en vous montrant visuellement la sélection (v), puis tirez/copiez y ou supprimez/coupez d. (Vers le tampon par défaut.)

Vous pouvez mettre/coller avec p.

A fait cette réponse à "apprends-moi à pêcher" .

0
n611x007