2010-01-08 10 views
4

D'abord, je vais montrer le problème spécifique que j'ai, mais je pense que le problème peut être généralisé.Mise en surbrillance de la syntaxe de sous-correspondance dans Vim

Je travaille avec un langage qui a une syntaxe de parenthèse explicite (comme Lisp), mais a des mots-clés qui ne sont réservés que sur le parent gauche. Exemple:

(key key) 

l'ancien est un mot réservé, mais celui-ci est une référence à la variable appelée « clé »

Malheureusement, je trouve mettre en évidence les paren gauche ennuyeux, alors je finis à l'aide

syn keyword classification key 

au lieu de

syn keyword classification (key 

mais les anciens déclencheurs sur la variable utilise aussi bien. Je voudrais prendre un hack pour contourner mon problème, mais je serais plus intéressé par une méthode générale pour mettre en évidence juste un sous-ensemble d'un match donné.

Répondre

7

L'utilisation de syn keyword seul pour cette situation ne fonctionne pas correctement car vous souhaitez que votre surbrillance soit plus sensible à la syntaxe environnante. Une combinaison de syn region, syn match et syn keyword fonctionne bien.

hi link lispFuncs Function 
hi link lispFunc Identifier 
hi link sExpr Statement 

syn keyword lispFuncs key foo bar contained containedin=lispFunc 
syn match lispFunc "(\@<=\w\+" contained containedin=sExpr contains=lispFuncs 
syn region sExpr matchgroup=Special start="(" end=")" contains=sExpr,lispFuncs 

Le ci-dessus ne touche mettre en évidence, foo et bar à l'aide du groupe de surbrillance de fonction, que si elles sont également adaptées par lispFunc.

S'il y a des mots autres que key, foo et bar qui viennent après (, ils seront mis en surbrillance à l'aide du groupe de surbrillance Identifier. Cela vous permet de faire la distinction entre les noms de fonctions standard et ceux créés par l'utilisateur. Les ( et ) seront mis en surbrillance à l'aide du groupe de surbrillance spécial, et tout ce qui se trouve à l'intérieur du () après le premier mot sera surligné en utilisant le groupe de surbrillance Déclaration.

0

Il ne semble y avoir une certaine capacité de mise en évidence en couches, comme on le voit ici: Highlighting matches in Vim over an inverted pattern
qui donne de commandes ex

:match myBaseHighlight /foo/ 
:2match myGroup /./ 

Je n'ai pas été en mesure d'obtenir quelque chose comme ça pour travailler dans mes fichiers de syntaxe , bien que. J'ai essayé quelque chose comme:

syn match Keyword "(key" 
syn match Normal "(" 

La mise en évidence va à la normale ou les mots-clés sur l'ensemble peu en fonction de ce qui est ramassé en premier (modifié par arrangement dans le fichier)

Vim profondément rejeté à l'aide « 2match » comme un mot-clé après "syn".

+0

'2match' est simplement une variante de la commande' match', avec une priorité inférieure. Cela n'a aucun rapport avec 'syn match'. ': match' et les commandes/fonctions associées sont utilisées pour mettre en évidence un motif dans la fenêtre en cours, quel que soit le tampon. Jusqu'à Vim 7, il n'y avait que la commande 'match'. Dans Vim 7, il a gagné '2match' et' 3match'. Le patch 7.1.040 a ajouté les fonctions 'clearmatches()', 'getmatches()', 'matchadd()', 'matchdelete()' et 'setmatches()' qui permettent des modèles de correspondance pratiquement illimités. – jamessan