Dans vim, recherchez les accolades / parens correspondants

9

Comme la plupart d'entre vous le savent probablement, vous pouvez utiliser %pour rechercher en avant sur la ligne pour trouver la prochaine paire / accolade / parenthèse appariée et passer à son partenaire correspondant:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

J'espère qu'il existe une clé similaire qui recherche en arrière sur la ligne, par exemple:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

La plupart des commandes vim ont à la fois un arrière et un avant, il semble donc que cela devrait le faire. N'a-t-il pas de partenaire? Si c'est le cas, est-ce parce qu'une fois que c'est sur un personnage jumelé, ils agiraient de la même façon?

Kevin
la source
Il convient de noter que %non seulement recherche le support apparié sur la même ligne, mais plus loin dans le fichier. Je l'aime particulièrement pour les boucles, etc. dans n'importe quel langage de programme de choix.
Bernhard
1
@Bernhard Oui, mais uniquement lorsqu'il trouve l'un des accolades sur la ligne.
Kevin
Si vous n'êtes pas opposé aux scripts d'addon, l' addon matchit fournit une g%commande qui semble similaire à ce que vous recherchez.
jw013
Idiot mais, votre question indique que vous voulez savoir pourquoi il n'y a pas de partenaire. Vous voulez dire "y a-t-il un partenaire que je ne connais pas?" :)
rjewell
@rjewell OK, je l'ai divisé donc ce n'est plus techniquement le demander.
Kevin

Réponses:

4

Si vous voulez vraiment rechercher en arrière les caractères correspondants communs, vous pouvez utiliser l'une de ces vimcommandes spécifiques:

  • [(... (aller au caractère précédent inégalé ()
  • [{... (aller au caractère précédent inégalé {)

Ces deux commandes ont des partenaires avant correspondants:

  • ])... (aller au prochain )personnage inégalé )
  • ]}... (aller au prochain }personnage inégalé )

Il existe d'autres commandes similaires pour #ifdefet pour les commentaires C.

Vous pouvez en trouver plus à l' vimaide de la commande :help %.

Mei
la source
Je les connais, le problème est qu'ils trouvent des paires inégalées , j'ai besoin de trouver des paires correspondantes .
Kevin
@Kevin: J'ai mal compris les documents (soupir). Bien sûr, une fois que vous l'avez utilisé, %cela va dans les deux sens: trouver le partenaire correspondant. De plus, si à l'intérieur d'un bloc, les commandes ci-dessus trouveront la correspondance appropriée.
Mei
3

% trouve le support correspondant. Donc, si vous êtes sur (ou {il recherchera en avant.

Si vous êtes sur un} ou), il effectuera une recherche en arrière.

% n'est pas directionnel, il suffit de trouver le support correspondant.

Richard Holloway
la source
Si je suis derrière un côté d'une paire,% trouvera son partenaire. Si je suis à la fin d'une ligne, il ne trouvera pas la paire plus tôt sur la ligne.
Kevin
Ne devrait-on pas sélectionner cette bonne réponse?
Jack
2

Je viens d'essayer :map ^] ^%%(avec ^]= Ctrl+ v Ctrl+ 5ici, par analogie avec %= Shift+ 5).

Cela fonctionne pour le cas spécifique donné, mais comme il ne recherche pas en arrière à partir du curseur, il choisira toujours la première parenthèse ouverte sur la ligne et laissera votre curseur au début de la ligne s'il ne trouve aucune correspondance. .


C'est une meilleure solution; c'est moche et il y a probablement beaucoup de place pour simplifier, mais je pense que la sémantique est tout à fait juste (ne déplace pas le curseur s'il n'y a pas de paren ouvert, et se déplace vers le premier paren ouvert avant la colonne actuelle).

:map ^] ^[:call search("[({[]", "bes", line("."))^M

pour

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return
Inutile
la source
Ce ne sera pas tout à fait la même s'il y a deux paires non imbriquées sur une ligne, mais c'est certainement la meilleure suggestion jusqu'à présent, merci.
Kevin
Cela ne fonctionnera que dans un bloc, non? Si c'est le cas, [(cela fonctionnerait tout aussi bien et ne nécessite pas de map.
Mei
Il devrait y avoir un bloc commençant sur la ligne actuelle, oui. J'ai trouvé une solution plus complète cependant, le montage est à venir ...
Inutile