web-dev-qa-db-fra.com

surclassement des noms de classe et de fonction dans Vim

Je viens de configurer mon environnement Vim depuis Textmate, après être devenu accro à son entrée modale.

Cependant, la coloration syntaxique ne semble pas si belle dans Vim. Je code en C++ et comme l'appel de fonction et les noms de classe ne peuvent pas être mis en évidence, le code est plus difficile à lire. J'ai joué avec le jeu de couleurs pendant un peu, mais je n'ai trouvé aucun champ correspondant à "nom de classe" ou "nom de fonction".

Dans l'image ci-dessous, notez comment DroughtLayer:: Et *.size() ne sont pas mis en surbrillance à droite dans MacVim.

Picture comparison between Textmate(left) and Vim(right)
(source: ivzhao.com )

Des idées pour résoudre ça? Cela m'énerve vraiment car je suis tellement sensible aux visuels.

68
ivanTheTerrible

Fait intéressant, les surligneurs de syntaxe de VIM ne prennent pas en charge l'application d'une syntaxe aux identificateurs ou aux noms de fonction - du moins pas les surligneurs de syntaxe pour C et C++. Donc, même si vous le faites:

:hi Function guifg=red

ou

:hi Identifier guifg=red

cela ne leur donne pas de couleur. Il me semble que ce n'est pas beaucoup plus que des mots-clés et des constantes pour ces langues.

Ici, quelqu'un a commencé à étendre le fichier de syntaxe cpp pour prendre en charge les noms de méthode. C'est un début je suppose. http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition

17
thomasrutter

J'ai eu ce même problème lorsque j'ai commencé à utiliser vim. La solution est simple, il suffit d'éditer le fichier de syntaxe c utilisé par vim, voici comment procéder:

Lorsque vous commencez à modifier un fichier C ou C++, vim lit le fichier de syntaxe c par défaut situé dans

$VIMRUNTIME/syntax/c.vim

(Où $ VIMRUNTIME est l'endroit où vous avez installé vim. Vous pouvez découvrir sa valeur par défaut en ouvrant vim et en utilisant la commande ": echo $ VIMRUNTIME").

Vous pouvez simplement écraser ce fichier, ou vous pouvez créer votre fichier de syntaxe C personnalisé (qui sera chargé par vim au lieu du fichier par défaut) à cet emplacement:

$HOME/.vim/syntax/c.vim      (for UNIX)
$HOME/vimfiles/syntax/c.vim  (for PC or OS/2)

(Je n'ai jamais utilisé de Mac donc je ne sais pas lequel fonctionnera pour vous. Vous pouvez en savoir plus dans l'aide de vim, ": help vimfiles")

Maintenant, la partie amusante. Copiez le fichier par défaut "$ VIMRUNTIME/syntax/c.vim" dans votre répertoire vimfiles ("$ HOME/.vim/syntax/c.vim" pour UNIX) et modifiez-le en ajoutant ces lignes:

" Highlight Class and Function names
syn match    cCustomParen    "(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope

hi def link cCustomFunc  Function
hi def link cCustomClass Function

C'est ça! Désormais, les fonctions et les noms de classe seront mis en surbrillance avec la couleur définie dans la surbrillance "Fonction" (": Hi Function"). Si vous souhaitez personnaliser les couleurs, vous pouvez remplacer les deux dernières lignes ci-dessus par quelque chose comme ceci:

hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00

ou vous pouvez laisser le fichier de syntaxe C seul et définir les couleurs dans votre fichier vimrc (": help vimrc"):

hi cCustomFunc  gui=bold guifg=yellowgreen
hi cCustomClass gui=reverse guifg=#00FF00

(Notez l'absence du mot clé "def", allez dans ": help highlight-default" pour plus de détails). Pour les paramètres disponibles pour la commande ": hi", voir ": help: highlight".

Vous pouvez trouver le fichier c.vim complet pour Vim 7.2 sur ce lien (Remarque: utilisez-le uniquement si vous avez un Vim non modifié, version 7.2):

http://Pastebin.com/f33aeab77

Et la capture d'écran obligatoire:

enter image description here

120
Eduardo

ceci est mon premier post ici et je ne savais pas comment faire une observation, la réponse d'Eduardo fait que "(" et "{" a l'air non caché et la syntaxe des bugs se replie, je l'ai un peu changé pour corriger cela.

syn match    cCustomParen    "?=(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(\@=" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope
hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def link cCustomClass Function
33
Janosimas

La seule solution consiste à utiliser une base de données ctags intégrée. Créez-en un avec l'utilitaire ctags . Ensuite, définissez la variable "tags" et mettez ce qui suit dans le

~/.vim/after/syntax/c.vim

function! s:highlight()
    let list = taglist('.*')

    for item in list
        let kind = item.kind

        if kind == 'f' || kind == 'c'
            let name = item.name
            exec 'syntax keyword Identifier '.name
        endif
    endfor
endfunction

call s:highlight()

Je dois vous avertir que cela peut fonctionner très lentement sur la très grande base de données ctags.

Il y a aussi ne solution sur le vim.org mais je n'ai pas essayé celle-ci. Dites-moi si cela marche pour vous.

10
Mykola Golubyev

EDIT: color_coded peut être trop lourd pour vous. essayez octol/vim-cpp-Enhanced-Highlight . Il prend en charge C++ 11/14 et intègre les réponses de @Eduardo. 

Surligneur sémantique :
Je recommanderais jeaye/color_coded , un plugin vim pour la mise en évidence basée sur libclang
. Allez voir ses effets si vous voulez essayer. :)

Avantages:

  • Installation facile
  • Mise en évidence sémantique
  • Clighter mentionné comme ci-dessus, besoin de vim compilé avec python2.7. Cependant, color_coded est écrit en C++ et fournit une liaison lua -> C++.

Les inconvénients:

  • Il tarde à moins que vous ne fassiez quelques événements vim pour l'activer.
  • La personnalisation est un peu plus difficile; vous devez modifier vous-même la syntaxe/color_coded.vim. Mais la personnalisation a été placée sur sa feuille de route.

Bien qu'il soit encore en développement, il attire de plus en plus l'attention.

beforeafter

6
Charles

Sergey, changer la première ligne de

syn match    cCustomParen    "(" contains=cParen,cCppParen

à

syn match    cCustomParen    "(" contains=cParen contains=cCppParen

semble le réparer pour moi.

3
user176963

Essayez d'utiliser ce plugin http://www.vim.org/scripts/script.php?script_id=2646 Il fait tous les ctags en surbrillance très efficacement pour vous

2
Yogesh Arora

Utilisez un plug-in pour vim comme Taglist ou configurez ctags ou cscope l'intégration avec vim ( voici un tutoriel pour le vim/cscope.)

2
dirkgently

Je vous recommande vraiment le plugin taghighlight, cliquez sur ici pour son site Web.

1
shengy

Le plugin Clighter peut également être considéré, qui est un

plugin for c-family semantic source code highlighting, based on Clang

Cependant, nécessite des versions et des logiciels assez récents: vim 7.4.330 +python2 et libclang.

1
Hotschke