63

Ho appena impostato il mio ambiente Vim da Textmate, dopo essere diventato dipendente dal suo input modale.nomi di classi e funzioni che evidenziano in Vim

Tuttavia, l'evidenziazione della sintassi sembra non essere così bella in Vim. Io codice in C++ e dal momento che la funzione chiamata e nomi di classe non possono essere evidenziati, il codice è più difficile da leggere. Ho giocato per un po 'con la combinazione di colori, ma non sono riuscito a trovare alcun campo che corrispondesse a "nome classe" o "nome funzione".

Nell'immagine seguente, notare come DroughtLayer:: e *.size() non è evidenziato sulla destra in MacVim.

Picture comparison between Textmate(left) and Vim(right) http://ivzhao.com/temp/vimHL.png

Delle idee come risolvere questo problema? Mi infastidisce davvero perché sono un ragazzo sensibile alla vista.

+0

fare il vostro TextMate evidenziare qualsiasi nome dopo 'nuovo' o solo quelli che sono stati dichiarati in qualche modo? –

+0

Sfortunatamente ciò che vim chiama un evidenziatore della sintassi è solitamente solo un lexer che può corrispondere alle parentesi e conosce il contesto di base. Questo è il caso per i file di sintassi C e CPP. Avresti bisogno di un parser "reale" per gestire quei casi ... Ciò significa che alcuni hacking c.vim;) – viraptor

+0

Ho pubblicato una domanda simile su #defines qui: http://stackoverflow.com/questions/1512602/highlighting -defined-value-in-vim. I tuoi suggerimenti/suggerimenti sono apprezzati. Spero che ci sia un modo per evidenziare questo come la bella risposta suggerita da Eduardo. – user183442

risposta

15

È interessante notare che gli evidenziatori di sintassi in vim non supportano l'applicazione di un sintassi per identificatori o nomi di funzioni - almeno non gli evidenziatori di sintassi per C e C++. Quindi, anche se si fa:

:hi Function guifg=red 

o

:hi Identifier guifg=red 

non dà questi un colore. Sembra solo che non sia molto più di parole chiave e costanti per queste lingue.

Qui, qualcuno ha iniziato ad estendere il file di sintassi cpp per supportare i nomi dei metodi. È un inizio, immagino. http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition

+1

La domanda riguarda l'evidenziazione dei nomi delle funzioni nel codice. –

2

utilizzare un plug-in per vim come Taglist o impostare ctags o cscope integrazione con vim (here's un tutorial per la vim/cscope.)

+0

Ho già installato il plug-in Taglist, ma non lo è per mostrare i contorni funzione/metodo invece di evidenziare/colorare il testo? – ivanTheTerrible

+0

@ivanTheTerrible: consulta le domande frequenti () e la documentazione. – dirkgently

+0

Non capisco neanche come la taglist possa evidenziare il tuo codice. –

10

L'unica soluzione è utilizzare il database di ctags. Quindi crearne uno con l'utilità ctags. Quindi impostare la variabile 'tag' e inserire il seguente alla

~/.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() 

devo avvertirvi che questo può funzionare molto lento sulla base di dati molto grande ctags.

Inoltre c'è one solution su vim.org ma non ho provato questo. Fammi sapere se funziona per te.

+0

l'ho provato ... e come hai detto è molto lento –

109

Ho avuto lo stesso problema quando ho iniziato a utilizzare Vim. La soluzione è semplice, basta modificare il file di sintassi c usato da vim, ecco come fare:

Quando si avvia la modifica di un file di C o C++, vim legge il file di sintassi predefinita c situato nel

$VIMRUNTIME/syntax/c.vim 

(dove $ VIMRUNTIME è il luogo in cui è stato installato vim. È possibile scoprire il valore predefinito aprendo vim e utilizzando il comando ": echo $ VIMRUNTIME").

Si può semplicemente sovrascrivere il file, oppure è possibile creare il file di sintassi C personalizzato (che verrà caricato da vim al posto di quella di default) in questa posizione:

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

(non ho mai usato un Mac, quindi non so quale funzionerà per te.Puoi trovare ulteriori informazioni nella guida di vim ": help vimfiles")

Ora la parte divertente. Copiare il file "$ VIMRUNTIME/sintassi/c.vim" default nella directory vimfiles ("$ HOME/.vim/sintassi/c.vim" per UNIX), e modificarlo aggiungendo queste righe:

" 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 

Questo è tutto! Ora le funzioni e i nomi delle classi saranno evidenziati con il colore definito nell'evidenziazione "Funzione" (": hi Function"). Se si desidera personalizzare i colori, è possibile modificare le ultime due righe di cui sopra a qualcosa di simile:

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

oppure si può lasciare il file di sintassi C solo e definire i colori nel file vimrc (": help vimrc") :

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

(notare l'assenza della parola chiave "def", andare a ": help highlight-default" per i dettagli). Per i parametri disponibili al comando ": hi" vedi ": help: evidenzia".

È possibile trovare il file c.vim completo per Vim 7.2 su questo link (Nota: utilizzare solo questo se si dispone di un Vim non modificata, versione 7.2):

http://pastebin.com/f33aeab77

E lo screenshot obbligatorio:

http://img16.imageshack.us/img16/2073/vimy.png (Sorry for imageshack)

+2

Scusa se dovresti essere il vincitore di questa taglia. Ma StackOverflow mostra come selezionare automaticamente il punto più alto. Qualsiasi conoscenza che possiamo modificare così puoi guadagnare 200 punti (se vuoi). Grazie comunque. – ivanTheTerrible

+14

Non è necessario copiare c.vim. Basta crearne uno nuovo come 'vimfiles/syntax/c.vim' con le 8 linee. – idbrii

+0

Soluzione molto bella. L'ho adottato. C'è qualcuno che potrebbe affinare il pattern in modo che evidenzi solo i nomi delle funzioni quando vengono dichiarate e non tutte le volte che vengono chiamate? – xApple

3

Sergey, cambiando la prima linea da

syn match cCustomParen "(" contains=cParen,cCppParen 

a

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

sembra risolvere il problema per me.

31

questo è il mio primo post qui e non sapevo come fare un'osservazione, la risposta di Eduardo fa "(" e "{" look unmached e gli insetti foldind sintassi, ho cambiato un po 'per risolvere questo problema.

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 
+0

Sì, rompe davvero il piegamento. Questa è la risposta corretta. –

+1

Questo può essere ulteriormente migliorato utilizzando http://stackoverflow.com/a/1819151/2716069. Quindi, 'cCustomParen' non è più necessario, e' cCustomFunc' diventa '" \ w \ + \ ze \ s * ("' (Code folding funziona ancora usando questo credo.) – Ragnar

+0

Non sono attualmente usando Vi, ma ho trovato questo: http://vim.wikia.com/wiki/Syntax-based_folding – Janosimas

1

ho davvero vi consiglio il plugin taghighlight, fare clic su here per il suo sito web.

1

Il Clighter plug-in può anche essere considerato, che è un

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

Tuttavia, richiede versioni abbastanza recenti e software: vim 7.4.330 +python2 e libclang.

5

MODIFICA: color_coded potrebbe essere troppo pesante per te. prova octol/vim-cpp-enhanced-highlight. Supporta C++ 11/14 e integra le risposte di @Eduardo.

Semantic evidenziatore base:
lo consiglio jeaye/color_coded, Un plugin vim per libclang a base evidenziando
Quindi dispiace che io sono nuovo a StackOverflow il che significa che ho non abbastanza reputazione di inviare le immagini . Vai a vedere i suoi effetti se vuoi dargli un colpo. :)

Pro:

  • Facilità di installazione
  • Semantic evidenziando
  • Clighter menzionato come sopra, hanno bisogno di vim compilato con python2.7. Tuttavia, color_coded è scritto in C++ e fornisce lua binding -> C++.

Contro:

  • ritarda a meno che non si fanno alcuni eventi Vim acitve esso.
  • La personalizzazione è un po 'più difficile; è necessario modificare sintassi/color_coded.vim autonomamente. Ma la personalizzazione è stata inserita nella sua roadmap.

Anche se è ancora in fase di sviluppo, sta guadagnando sempre più attenzione.

before after

+0

Puoi includere del codice/documentazione che mostri perché questa sarebbe la risposta corretta? Un collegamento può cambiare nel tempo e quindi fare questa risposta sbagliata – rfornal