3

Je souhaite obtenir une coloration syntaxique à l'intérieur d'un bash heredoc. De plus, je veux déréférencer les variables bash et mettre en évidence la substitution de commandes dans l'hérédoc. En utilisant these instructions comme point de départ, j'ai pu ajouter un déréférencement variable en examinant sh.vim. J'imagine que vous pourriez accomplir la substitution de commande d'une manière similaire.Vim HereDoc Mise en surbrillance

let s:bcs = b:current_syntax 

unlet b:current_syntax 
syntax include @YAML syntax/yaml.vim 

syntax region hereDocYAML matchgroup=Statement start=/<<-\?\s*\z(YML\)/ end=/^\s*\z1/ [email protected],hereDocDeref,hereDocDerefSimple 

syn match hereDocDerefSimple "\$\%(\h\w*\|\d\)" 
syn region hereDocDeref matchgroup=PreProc start="\${" end="}" [email protected],shDerefVarArray 

hi def link hereDocDeref PreProc 
hi def link hereDocDerefSimple PreProc 

Mon problème est, cela ne semble pas travailler dans une sorte de bloc (if, function, for, etc.). Par exemple:

highlighting example

La seule chose que je sais est que ce n'est pas un problème d'indentation. La modification de l'indentation n'a aucun effet et l'utilisation de l'indentation en dehors d'un bloc fonctionne correctement.

+2

Pour la vie de moi, je ne peux pas comprendre pourquoi quelqu'un voterait pour fermer ceci. Il s'agit d'un problème de programmation utilisant le langage de programmation qui soutient un outil de programmation largement utilisé. –

+2

Il y a des gens qui pensent que toute question vi/vim appartient à vi.SE, et d'autres qui semblent supposer aveuglément tous les problèmes de "l'éditeur de texte" devraient aller à SU. Je ne suis pas d'accord... –

Répondre

2

Le contains sur the definition of shIf semble limiter les points saillants possibles aux éléments du groupe shIfList.

Ajouter votre article au groupe comme suit vous donnera cette région mettant en lumière sont acceptés dans les:

syn cluster shIfList add=hereDocYAML 

Le même principe est valable pour tous les autres blocs. Par exemple:

syn cluster shFunctionList add=hereDocYAML 
syn cluster shLoopList  add=hereDocYAML 

Il convient de noter que l'approche que vous avez décrite n'est généralement pas utile. Tout d'abord, il requiert que le fichier de syntaxe inclus utilise des groupes pour leurs définitions contains. En outre, cela fonctionne pour YAML car la syntaxe de déréférence bash et la syntaxe YAML ne sont pas incompatibles. Pour les syntaxes plus compliquées comme sed ou awk, vous aurez des conflits, et les règles pour résoudre ces conflits nécessiteront probablement une nouvelle syntaxe entièrement.