9
votes

Vimscript: Trouvez dernier ouvert parenthèse ou support

J'aimerais écrire une fonction dans Vimscript qui trouve le dernier parenthèse ouvert ou par support dans une ligne. Ce n'est pas nécessairement un problème facile, car il doit être capable de gérer toutes les opérations suivantes:

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(


2 commentaires

Une moitié d'une paire de parenthèses s'appelle une parenthèse.


Si l'intention est d'aider à mettre en évidence, notez la question et réponses ici: superutilisateur.com/questions/545278/... . Le plugin vim-matchopen met en évidence la dernière parenthèse, le support et la brace par rapport au curseur (refermé ou non-descavé).


3 Réponses :


1
votes

Je n'ai aucune réponse directe pour vous, mais vous voudrez peut-être consulter le code dans le plug-in MatchParen.VIM, qui est un plug-in standard inclus dans Vim Installations (dans le répertoire du plug-in). Ce plugin est celui utilisé pour la surbrillance des parens correspondants, si vous avez activé cette fonction. Le code est plus général que ce dont vous avez besoin, car il correspond à travers des lignes, mais vous pourrez peut-être travailler avec elle et tester si elle trouve un match sur la même ligne ou au moins obtenir des idées de son code.


0 commentaires

4
votes

Utilisez [( et ]) : xxx

pour les bretelles bouclées: [{ et < code> [} .


2 commentaires

Intéressant. Comment cela est-il implémenté? Y a-t-il un équivalent pour trouver des crochets inégalés? Y a-t-il un moyen simple que je puisse l'utiliser dans une fonction vimscript sans déplacer réellement le curseur?


Recherchez SearchPair () dans l'aide / la documentation.



4
votes

Alors, fondamentalement, vous devez trouver le dernier entre-temps qui n'est pas en commentaire et non dans la chaîne.

Je ne suis pas sûr de ce que cette syntaxe est donc donc j'ai placé ces lignes dans un tampon et que j'ai < Pré> xxx

pour obtenir des chaînes de surbrillance sur la surbrillance xxx

Mettez maintenant votre curseur à la 3ème ligne ouverte par denthèse et émettez la commande suivante: < pré> xxx

echo vous echo vous "1" et cela signifie que le caractère sous le curseur est en commentaire ou dans une chaîne.

Si vous placez le curseur sur le dernier col de la dernière ligne et faites la même commande que vous obtiendrez '0'.

Vous pouvez désormais itérer en arrière sur la parenthèse et les tester contre "commentaire" et "chaîne" et obtenir le dernier ouvert parenthèse. < / p>

Vous pouvez vérifier Ceci Archive de "LISP: Balance des parenthèses inégalées dans Vim" pour voir comment fermer la parenthèse inégalée à l'aide de Vimscript.


1 commentaires

Merci! Il est toujours un peu plus complexe que celui-là (considérer une ligne se terminant par "fonction (ABC, DEF (), GHI", les derniers parenthèses ne sont pas les derniers épargnes entre-temps), mais Synidattr est exactement ce que je devais pouvoir faire la reste du travail.