2010-02-06 4 views
12

Je voudrais ranger mon fichier de couleurs Vim, en remplaçant #ABCDEF couleurs avec des variables. Par exemple, je voudrais remplacer:Comment puis-je utiliser des variables pour DRY up Vim colorthemes

highlight String  guifg=#61CE3C 
highlight Identifier guifg=#61CE3C 
highlight Type  guifg=#84A7C1 

avec quelque chose comme ça (vimscript pseudo-code):

my_string =#61CE3C 
my_type =#84A7C1 

highlight String  guifg=my_string 
highlight Identifier guifg=my_string 
highlight Type  guifg=my_type 

Je ne savais pas si vimscript considère la couleur hexagonale pour être une chaîne ou un nombre hexadécimal . Apparemment, il est une chaîne, faire cela semble fonctionner:

:highlight Normal guifg='#ffffff' 

Je pensais que je vais essayer ceci:

:let my_color='#ffffff' 
:highlight Normal guifg=my_color 

Mais cela donne l'erreur « E254: Impossible d'allouer la couleur my_color ». Quelqu'un peut-il suggérer un moyen de faire ce travail?

Répondre

8

Comme jamessan a dit, vous devez utiliser :exe pour ce faire. J'ai trouvé la syntaxe générale des fichiers de couleurs un peu difficile à gérer. J'ai donc créé la mienne, qui pourrait vous intéresser. Je la trouve beaucoup plus facile à maintenir, mais vous pouvez la trouver un peu trop verbeuse, dans laquelle cas, voir l'alternative à la fin de cette réponse.

Plutôt que d'écrire les longues lignes :hi, vous créez un dictionnaire le long des lignes de:

" Unspecified colours default to NONE, EXCEPT cterm(.*) which default to matching gui(.*) 
" ctermfg will default to 'Blue' and ctermbg to 'NONE' if gui(.*) are RGB 
" 
" In most cases, only GUIFG is therefore important unless support for Black and White 
" terminals is essential 

let ColourAssignment['Normal']   = {"GUIFG": 'White', "GUIBG": 'Black'} 
let ColourAssignment['Comment']   = {"GUIFG": '#00ff00'} 

Comme mentionné dans le commentaire, toutes les parties non précisées prendre bon sens par défaut, de sorte que vous ne devez pas faire la commune:

:hi Comment guifg=green ctermfg=green guibg=black ctermfg=black 

répétition. Vous pouvez également (bien sûr) mettre des variables à la place du bit '#00ff00' si vous le souhaitez. Il est actuellement conçu autour des couleurs de fond sombres: pour les couleurs de fond claires, il choisit automatiquement une couleur appropriée (il rend les couleurs vives plus foncées) sauf si vous le remplacez, mais si vous préférez les couleurs de fond claires, il ne le fera pas t être trop difficile à changer de sorte que la valeur par défaut est la lumière.

L'autre avantage est qu'il est livré avec un fichier de coloration syntaxique qui met automatiquement en surbrillance le bit "ColourAssignment" dans la couleur que vous avez sélectionnée.

Quoi qu'il en soit, si cela vous intéresse, vous pouvez l'obtenir auprès de here.


Une alternative que vous pouvez utiliser serait de créer une commande comme ceci:

command! -nargs=+ Hi call CustomHighlighter(<f-args>) 
function! CustomHighlighter(name, ...) 
    let colour_order = ['guifg', 'guibg'] 
    let command = 'hi ' . a:name 
    if (len(a:000) < 1) || (len(a:000) > (len(colour_order))) 
     echoerr "No colour or too many colours specified" 
    else 
     for i in range(0,len(a:000)-1) 
      let command .= ' ' . colour_order[i] . '=' . a:000[i] 
     endfor 
     exe command 
    endif 
endfunc 

Vous pouvez ensuite utiliser:

Hi Comment #00ff00 
Hi String Yellow 
Hi Normal White Black 
+0

Autre approche ajoutée. – DrAl

+0

Merci. Je suis content d'apprendre que je n'étais pas le seul à être énervé par la syntaxe des couleurs de Vim! – nelstrom

8

Étant donné que :highlight n'accepte pas de variable comme argument, vous devez générer la commande à exécuter en tant qu'expression, puis l'évaluer avec la commande :execute.

:let my_color='#ffffff' 
:exe 'highlight Normal guifg=' . my_color 
+0

Merci, votre suggestion fonctionne pour moi, mais malheureusement, il ajoute plus d'encombrement où j'essayais de ranger les choses! Je devrais peut-être abandonner cette idée. L'une des définitions sous [: help: highlight] (http://vimdoc.sourceforge.net/htmldoc/syntax.html#:highlight) indique: ': hi [ghlight] [par défaut] {group-name} { clé} = {arg} ..'. Je pensais que le bit '{key} = {arg}' accepterait une variable à la place de '{arg}'. N'y a-t-il pas d'autre moyen? – nelstrom

Questions connexes