2013-04-17 4 views
1

Je souhaite dynamiquement (c'est-à-dire, en fonction du contenu du fichier actuel) adapter la coloration syntaxique. Bien que cela puisse être utile en général, mon réglage spécifique est le suivant:Vim: mise en évidence de la syntaxe dynamique

Le type de fichiers que je considère peut contenir (beaucoup arbitrairement) des blocs de la forme (VAR ...), où ces "VAR-blocks" contiennent une liste séparée par des espaces des identificateurs qui doivent être considérés comme des variables (tandis que les identificateurs qui ne sont pas dans un bloc VAR sont considérés comme des symboles ou des constantes de fonction fixe). En outre, il existe déjà un fichier trs.vim qui prend en charge la coloration syntaxique pour ces fichiers. Dans trs.vim un groupe de syntaxe trsKeyword est déclaré. Maintenant, mon objectif est de mettre en évidence toutes les variables utilisant ce groupe.

Prenons l'exemple suivant (Appelons il add.trs):

(VAR x y)(RULES 
    add(z, y) -> y 
    add(s(x), y) -> s(add(x, y)) 
) 

Lors de l'ouverture add.trs dans vim, je veux que x et y sont imprimés comme mots-clés (alors que par exemple z n'est pas, malgré pas d'arguments).

Répondre

2

J'ai déjà atteint le résultat souhaité (mais je voulais le partager sur SO). Alors voilà (les extraits suivants doivent être combinés dans un fichier vars.vim).

D'abord, je définir un modèle qui reconnaîtra VAR-blocs:

" pattern that matches VAR-blocks of *.trs files 
let varblock = '(VAR\s*\(.*\))' 

Ensuite, je vérifie le fichier en cours (? Peut-être il y a une meilleure façon que d'utiliser % pour cela) pour VAR-blocs et ignorer la cas où aucune correspondance n'a été trouvée.

" create list of variables from all VAR-blocks 
try 
    silent exe "vimgrep /" . varblock . "/j %" 
catch /^Vim\%((\a\+)\)\=:E480/ " no match 
    " do nothing 
endtry 

Les résultats trouvés sont obtenus par getqfilst(), que je copie. Ensuite, je remplace chaque élément de cette liste par le premier sous-groupe qui correspond au modèle varblock (qui sera une chaîne contenant des identifiants séparés par des espaces). Je me joins à toutes ces chaînes dans un seul puis il diviser à des espaces pour obtenir une liste d'identifiants:

let vars = split(join(map(copy(getqflist()), 'matchlist(v:val.text, varblock)[1]'))) 

Enfin créer un modèle correspondant à ces identifiants et l'enregistrer dans le groupe trsKeyword:

" activate syntax highlighting for variables 
exe "syn match trsKeyword \"\\<\\(" . join(vars, '\|') . "\\)\\>\"" 
" echo "variables: " . join(vars, ", ") 

Pour le faire fonctionner avec trs.vim J'ai créé le répertoire ~/.vim/syntax/trs et mettre trs.vim ainsi que vars.vim à l'intérieur. Puis dans mon ~/.vimrc j'ai ajouté

" TRS files 
au BufNewFile,BufRead,BufWrite *.trs setf trs 

qui active la coloration syntaxique pour les fichiers se terminant par .trs (et met également à jour la liste des variables chaque fois qu'un tampon est enregistré).

Questions connexes