2009-07-31 10 views
12

Dans VIM, j'ai besoin d'effectuer une tâche simple - mettre en surbrillance "(" et ")". Je peux le faire facilement en lançant deux commandes:Comment remplacer la syntaxe par défaut en surbrillance dans vim?

:syn match really_unique_name display "[()]" 
:hi really_unique_name guifg=#FF0000 

Mais si j'ajoute mêmes commandes (sans « : » bien sûr) pour vider Vimrc et redémarrez VIM - « (» et «) » ne sont pas mis en évidence plus dans les fichiers .cpp. Il semble que si je crée/charge un fichier .cpp, VIM charge le fichier de syntaxe qui remplacera mes surbrillances personnalisées. Comment puis-je configurer les surbrillances dans mon fichier .vimrc afin qu'il se déroule après les définitions de syntaxe standard ou ne sera pas affecté par la définition de la syntaxe standard?

Répondre

24

Il y a quatre options (dont deux ont été suggérées par d'autres):

  1. Utilisez la structure after dans vimfiles (~/.vim/after/syntax/cpp.vim):

    :help after-directory 
    
  2. utilisation en jeu pour la fenêtre courante:

    :match really_unique_name "[()]" 
    
  3. Utilisez matchadd(), encore une fois pour la fenêtre en cours, mais cela vous permet de supprimer des matches individuels si vous avez besoin plus tard:

    :call matchadd('really_unique_name', "[()]") 
    " Or 
    :let MyMatchID = matchadd('really_unique_name', "[()]") 
    " and then if you want to switch it off 
    :call matchdelete(MyMatchID) 
    
  4. Installer le plugin rainbow.vim Dr Chip pour obtenir croisillon mettant en lumière dans différents couleurs en fonction du niveau d'indentation.

Pour cette situation, je recommanderais l'option 1 car il semble que vous souhaitiez l'intégrer à la syntaxe générale. Si vous voulez utiliser des allumettes et vous voulez qu'ils soient, vous aurez besoin de quelque chose comme spécifique tampon (plutôt que fenêtre spécifique):

function! CreateBracketMatcher() 
    call clearmatches() 
    call matchadd('really_unique_name', "[()]") 
endfunc 
au BufEnter <buffer> call CreateBracketMatcher() 

Pour plus d'informations, voir:

:help after-directory 
:help :match 
:help matchadd() 
:help matchdelete() 
:help clearmatches() 
:help function! 
:help autocmd 
:help autocmd-buffer-local 
:help BufEnter 

Vous pouvez également être intéressé par ma réponse à this question, qui couvre la mise en évidence plus générale de l'opérateur.

+0

Merci pour "au BufEnter", fonctionne parfaitement sur Windows et Macos box (salut ne fonctionne pas sur MacOS Box - il est effacé d'une manière ou d'une autre après le traitement de .vimrc). – grigoryvp

+0

Les autocommandes locales de tampon ne doivent être créées qu'après l'ouverture du tampon. Aucune des suggestions que j'ai énumérées ne devrait être dans .vimrc: soit utiliser vimfiles/after/syntax/cpp.vim ou l'une des options similaires. Alternativement, vous pouvez le trafiquer avec "au BufEnter, BufNew, BufReadPost * .cpp appelez CreateBracketMatcher()", mais c'est un peu un fudge. – DrAl

+0

@DrAl Je viens d'écrire un extrait de http://vimrcfu.com basé sur votre réponse: http://vimrcfu.com/snippet/197 Merci! –

4

Au lieu d'utiliser syn match, utilisez simplement match. par exemple:

hi really_unique_name guifg=#FF0000 
match really_unique_name "[()]" 

match a une priorité supérieure syn match (ex: mise en évidence de sa priorité sur la mise en évidence générée par syn-jeu), et les fichiers de syntaxe (bien élevé) ne doit pas salir avec elle.

La seule mise en garde avec correspondance est que c'est par fenêtre, plutôt que par tampon.

Si vous avez besoin de correspondances supplémentaires, vous pouvez utiliser 2match et 3match. Pour plus d'informations, voir :help :match dans Vim.

+0

Merci. Cela fonctionne bien sur ma boîte de fenêtres. Mais sur MacOS BOX, "hi really_unique_name guifg = # FF0000" ne fonctionne pas. Même si c'est une seule ligne dans un fichier .vimrc, après avoir démarré vim et fait "hi really_unique_name", je vois "vraiment_unique_name xxx effacé". Pourquoi c'est "effacé"? – grigoryvp

9

Mettez les dans ~/.vim/after/syntax/cpp.vim

+0

Hmmm, semble être une bonne solution. Mais ne fonctionne pas pour moi ... http://stackoverflow.com/questions/2464593/custumizing-syntax-highlighting-in-vim – sixtyfootersdude

2

je le fais habituellement comme ceci:

:hi really_unique_name guifg=#FF0000 
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]" 

au est synonyme de autocmd. L'aide en dira plus.

+0

désolé, en deux lignes ... pour une certaine raison, il est enlevé mon entrée ... – Peter

Questions connexes