Comment choisir entre parenthèses (ou guillemets ou…) dans Vim?

220

Je suis sûr qu'il y avait un plugin pour ce genre de choses, mais maintenant que j'en ai besoin, je n'arrive pas à le trouver (naturellement), donc je vais juste demander gentil et simple.

Quelle est la façon la plus simple de choisir entre crochets ou guillemets, ou généralement une liste de caractères correspondants?

   write ( *, '(a)' ) 'Computed solution coefficients:'

Par exemple, ici, je voudrais sélectionner (a), ou Computed solution coefficients:.

Je ne suis pas intéressé par le multiligne, juste les cas qui se produisent sur une seule ligne.

Tour
la source

Réponses:

277

Utilisez la touche de navigation que vous souhaitez mettre entre parenthèses, puis vous pouvez utiliser soit yi(ou yi)pour tout copier dans les parenthèses correspondantes. Cela fonctionne également avec les crochets (par exemple yi]) et les accolades. De plus y, vous pouvez également supprimer ou modifier du texte (par exemple ci), di]).

J'ai essayé cela avec des guillemets doubles et simples et cela semble fonctionner là aussi. Pour vos données, je fais:

write (*, '(a)') 'Computed solution coefficients:'

Déplacez le curseur sur le C, puis tapez yi'. Déplacez le curseur sur une ligne vierge, appuyez sur pet obtenez

Computed solution coefficients:

Comme CMS a noté , cela fonctionne pour la sélection du mode visuel, ainsi que l' utilisation - vi), vi}, vi', etc.

Tim Whitcomb
la source
1
Je recherche généralement un moyen de tout sélectionner entre les caractères correspondants prédéfinis (normalement uniquement des guillemets simples et doubles et des crochets de toutes sortes).
Rook
2
Qu'entendez-vous par mots séparés? Je l'ai essayé sur "[x, y, z]" et il a choisi "x, y, z"
Tim Whitcomb
4
Ignorez le dernier commentaire - a trouvé quel était le problème. Fonctionne comme un charme :-)
Rook
il semble fonctionner avec les guillemets aussi bien yi"sélectionner tous les guillemets
perdus
ci(ou le ci)fait pour ce que je cherchais. Merci. Je ne comprends toujours pas complètement idans ce cas, mais qui s'en soucie tant que cela fonctionne, non? :)
justnorris
279

Pour choisir entre les guillemets simples, je fais généralement un vi' ("sélectionner les guillemets simples intérieurs").

À l'intérieur d'un bloc de parenthèses, j'utilise vib ("sélectionner le bloc interne")

À l'intérieur d'un bloc d'accolades, vous pouvez utiliser viB("B majuscule")

Pour effectuer les sélections "inclusives" (sélectionnez également les guillemets, les parenthèses ou les accolades), vous pouvez utiliser à la aplace de i.

Vous pouvez en savoir plus sur les sélections d'objets texte dans le manuel ou :help text-objectsdans vim.

CMS
la source
merci pour ce conseil, j'ai cherché et demandé quelque chose de similaire et je n'étais pas satisfait de mes résultats. Impressionnant.
alfredodeza
cette astuce est très simple et facile à engager dans ma mémoire cérébrale et musculaire. Merci.
Ghazaly
Ceci est une astuce très utile. Plus besoin de tâtonner avec des touches supplémentaires. Merci pour le lien.
Rai
27

Cette méthode de sélection est intégrée et bien couverte dans l'aide de Vim. Il couvre les balises XML et plus encore.

Tu vois :help text-objects.

Michael
la source
1
: aider les objets texte se rapproche des trucs utiles ... vous pourriez au moins mentionner certains des plus communs, comme un "et un (en mode visuel.
Stobor
2
(Aussi, +1 parce qu'en dépit d'être un utilisateur de longue date de vim, je n'en savais rien!)
Stobor
@Stobor. Cheers a corrigé cette référence
Michael
21

Pour la sélection entre guillemets simples, utilisez vi'.

Pour sélectionner entre parenthèses, utilisez vi(.

Canopus
la source
3
Remarque: ci'ou ci(pour changer au lieu de sélectionner visuellement. Mais il fait exactement ce que je voulais. Merci :)
justnorris
Le second ne fonctionne que dans ce bloc (), donc généralement je le fais %vi(ou%vib
816-8055
7

Utilisez les flèches ou hjklpour accéder à l'une des expressions entre crochets, puis vsélectionnez le mode visuel (c'est-à-dire la sélection), puis %passez à l'autre parenthèse.

Stobor
la source
5
(ne fait pas de devis, malheureusement, cependant ...)
Stobor
3

Écrivez une fonction Vim dans .vimrc en utilisant la searchpairfonction intégrée:

searchpair({start}, {middle}, {end} [, {flags} [, {skip}
            [, {stopline} [, {timeout}]]]])
    Search for the match of a nested start-end pair.  This can be
    used to find the "endif" that matches an "if", while other
    if/endif pairs in between are ignored.
    [...]

( http://vimdoc.sourceforge.net/htmldoc/eval.html )

Adrian Panasiuk
la source
2

J'ajouterais un détail à la réponse la plus votée:

Si vous utilisez gvim et que vous souhaitez copier dans le presse-papiers, utilisez

"+<command>

Pour copier tout le contenu entre crochets (ou parens ou accolades)

Par exemple: "+yi}copiera dans le presse-papiers tout le contenu entre les accolades de votre curseur.

yuriploc
la source
2
Ceci est complètement orthogonal au problème et ne devrait pas être une réponse. Vous pouvez l'écrire sur chaque question qui pose des questions y.
pipe
C'est un ajout à la réponse, pas une réponse elle-même.
yuriploc
Ensuite, cela devrait être une modification de cette réponse, ce message tel quel ne répond pas à la question.
pipe
Ceci est une publicité pour NE PAS utiliser gvim :) Qui a besoin de deux touches Maj + touches supplémentaires dans sa vie?
Paul Parker
1

J'ai créé un plugin vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

Il fournit des objets texte pour les paires de guillemets les plus proches de n'importe quel type. Utiliser uniquement iqou aqil vous permet d'opérer sur le contenu des guillemets simples ('), doubles (") ou arrière (`) qui entourent actuellement le curseur, sont devant le curseur ou derrière (dans cet ordre de préférence) En d'autres termes, il saute en avant ou en arrière si nécessaire pour atteindre les devis.

Il est plus facile à comprendre en regardant des exemples (le curseur est indiqué par |):

  1. Avant foo '1, |2, 3' bar:; après avoir appuyé diq:foo '|' bar
  2. Avant foo| '1, 2, 3' bar:; après avoir appuyé diq:foo '|' bar
  3. Avant foo '1, 2, 3' |bar:; après avoir appuyé diq:foo '|' bar
  4. Avant foo '1, |2, 3' bar:; après avoir appuyé daq:foo | bar
  5. Avant foo| '1, 2, 3' bar:; après avoir appuyé daq:foo | bar
  6. Avant foo '1, 2, 3' |bar:; après avoir appuyé daq:foo | bar

Les exemples ci-dessus sont donnés pour les guillemets simples, le plugin fonctionne exactement de la même manière pour les guillemets doubles (") et antérieurs (`).

Vous pouvez également utiliser d'autres opérateurs: ciq, diq, yiq, viq, etc.

Veuillez consulter la page github liée ci-dessus pour plus de détails.

Anton Beloglazov
la source
-6

Un simple keymap dans vim résoudrait ce problème. map viq F ”lvf” hh Cette commande ci-dessus mappe viq aux touches pour rechercher entre guillemets. Remplacez "par n'importe quel caractère et créez vos keymaps. Collez-le dans vimrc au démarrage et vous devriez pouvoir l'utiliser à chaque fois.


la source