Comment puis-je ajouter des règles de surbrillance de syntaxe supplémentaires dans mon vimrc local?

11

J'ai installé gvim sur Fedora et Win7. J'ai trouvé que vim et gvim sur Fedora ne mettaient pas en évidence le nom de la fonction dans le code c tandis que gvim sur win7 le mettait en surbrillance.

J'ai trouvé que sur win7, vim73/syntax/c.vima les lignes supplémentaires à la fin:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Si j'ajoute ces lignes dans c.vimFedora, gvim peut également mettre en évidence le nom de la fonction.

Pour maintenir la portabilité, je souhaite simplement modifier le .vimrcpour mettre en surbrillance le nom de la fonction. Cependant, après avoir ajouté ces lignes dans le .vimrc, cela n'a pas fonctionné.

Alors, quelqu'un peut-il m'aider? J'ai fait une recherche et il existe de nombreuses solutions pour mettre en évidence les noms de fonction dans vim. Mais je suis simplement curieux de savoir comment faire fonctionner ces lignes .vimrc. Merci beaucoup!

tamlok
la source
5
Essayez de l'ajouter à la ~/.vim/after/syntax/c.vimplace.
muru
@muru Oui, cela fonctionne. Mais que diriez-vous de l'ajouter à .vimrc?
tamlok
Vous devrez probablement utiliser quelque chose comme autocmd BufEnter *.c hl ..., mais vous devriez le garder after/syntax/c.vim. Toute version moderne de Vim comprendra le .vim/after/répertoire. Sous Windows, le chemin serait vimfiles/after/..., donc la portabilité ne devrait pas être un gros problème (surtout si vous utilisez des plugins).
muru

Réponses:

14

Cependant, après avoir ajouté ces lignes dans le .vimrc, cela n'a pas fonctionné.

La raison en est que Vim efface les éléments de syntaxe existants lors de la définition de l' 'syntax'option. Cela est dû au fait que conserver les anciens éléments de syntaxe entraînerait des situations étranges; si vous avez un tampon qui a syntax=fooet utilisez set syntax=baralors vous vous retrouverez avec un tampon qui a une coloration syntaxique pour les deux foo et bar.

Lorsque Vim démarre, il charge votre vimrcfois (au démarrage), mais il charge les fichiers de type de fichier et de syntaxe à chaque fois que les options filetypeou syntaxsont définies, ce qui réinitialisera les valeurs que vous avez définies dans votre vimrc.

Même s'il ne le réinitialisait pas, ce ne serait pas une bonne idée de simplement l'ajouter à votre vimrc, car il s'appliquerait à tous les tampons, et pas seulement aux tampons avec syntax=c.


Le texte ci-dessous suppose Vim sur un système Unix-y, mais cela fonctionnera également pour les utilisateurs Neovim et Windows:

  • Les utilisateurs de Neovim doivent remplacer ~/.vim/par ~/.config/nvim/.
  • Les utilisateurs de Windows doivent remplacer ~/.vim/par %USERPROFILE%\vimfiles\.

Remplacement d'un fichier entier

Le moyen le plus simple de changer quelque chose est de simplement le remplacer . Pour ce faire, créez un fichier dans ~/.vim/<file>.vim.

<file.vim>est le chemin relatif à $VIMRUNTIME(y compris les sous-répertoires). Dans votre exemple, ça devrait l'être syntax/c.vim. Il sera chargé à la place du fichier dans $VIMRUNTIME.

Le résultat est qu'il est plus facile d'apporter des modifications - la modification des fichiers de syntaxe existants peut parfois être un peu délicate. L'inconvénient est que vous n'obtiendrez aucune future mise à jour du fichier à l'échelle du système.

Je l'utilise souvent comme point de départ pour expérimenter avec des fichiers de syntaxe, puis extraire plus tard mes modifications locales vers un ajout local en utilisant l'une des méthodes décrites ci-dessous.

Ajouts locaux

Il existe deux façons d'ajouter des ajouts locaux aux fichiers de syntaxe, ils sont fonctionnellement identiques et vous pouvez utiliser la méthode que vous préférez.

Syntax autocmd

Utilisez l' Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Notez que l'enchaînement de plusieurs commandes avec |est problématique ici, car elles ont tendance à être interprétées comme faisant partie de la :syncommande, c'est pourquoi j'ai répété autocmd Syntax cplusieurs fois. Une alternative serait d'utiliser une fonction:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

L'avantage est que toutes les modifications peuvent être contenues dans un seul fichier. L'inconvénient est que c'est un peu moche, surtout si vous avez beaucoup de changements.

après répertoire

Utilisez le répertoire après: ~/.vim/after/<file>.vim.

Celui-ci sera chargé après <file>.vimhas, où <file.vim>est le chemin par rapport à $VIMRUNTIME(y compris les sous-répertoires). Dans votre exemple, ça devrait l'être syntax/c.vim.

Voir aussi :help after-directory.

L'avantage est qu'il est un peu plus lisible que l'autocmd, surtout si vous avez beaucoup de changements. L'inconvénient est que vous devrez copier sur un fichier supplémentaire si vous souhaitez mettre en miroir votre configuration Vim sur différentes machines (c'est une raison importante pour laquelle de nombreuses personnes conservent leurs fichiers Vim dans un référentiel GitHub, afin qu'elles puissent être facilement reproduites sur plusieurs machines). ).

Martin Tournoij
la source