2010-08-20 7 views
4

Je voudrais créer un motif de match pour une accolade d'ouverture qui ne suit pas l'un de ces modèles:Comment rendre vim highlight {any non suivi d'un commentaire de style C++ ou de deux retours à la ligne?

  1. {\n\n
  2. {\s*\/\/.*\n\(\s*\/\/.*\)\?\n

Le problème plus général met en avant les violations d'un codage spécification au travail, qui applique une ligne vide suivant {

Clarification, je cherche ceci pour attraper le code comme suit :

if (foo) { 
    this_is_bad____no_blank_line_above(); 
} else {this_is_worse();} 

while (1) { //This comment is allowed 
      //This one too 
    theres_nothing_wrong_with_this(); 
} 

if (foo) { 
    ....//<-- Ideally we could mark this as bad, due to the spaces here 
    otherwise_perfectly_good(); 
} 

Ce que je vraiment besoin est: {\(\n\n\|\s*\/\/.*\n\(\s*\/\/.*\)\?\n\)\!

Lorsque le symbole maquillé \! signifie « ne correspond pas à l'une de ces deux options ». Je vois une façon de le faire pour les caractères individuels, mais pas pour une chaîne plus longue.

Répondre

6

Je l'ai trouvé:

Je cherchais \@!

Documenté à :h /\@!

{\(\n\n\|\s*\/\/.*\n\(\s*\/\/.*\)\?\n\)\@! 
1

Ajouter ce qui suit à la fin de votre fichier vimrc:

:highlight InvalidStyle ctermbg=red guibg=red ctermfg=black guifg=black 
:match InvalidStyle /{\s*[^\t \/]\+.*$/ 

La première ligne définit un nouveau style de surbrillance (noir sur le rouge) et la ligne suivante essaie de trouver toutes les accolades qui ont un contenu après eux qui ne sont pas des commentaires et applique la mise en évidence sur eux.

+0

Hmm ... clarifier quelques exemples de ce qui devrait être pris par cela. – jkerian