2009-09-23 12 views
18

Verrò da Vim da TextMate e vorrei personalizzare il mio vim colorscheme. Sarebbe molto utile se riuscissi a scoprire a quale gruppo di evidenziatori appartiene una determinata parola o simbolo. In TextMate, porrei l'accento circonflesso sulla parola/simbolo in questione, poi ha colpito Ctrl-Shift-P e un suggerimento sembrerebbe dicendo qualcosa del tipo:Scopri a quale gruppo di evidenziazione una particolare parola chiave/simbolo appartiene a vim

text.html.basic 
meta.tag.structure.any.html 
string.quoted.double.html

Da queste informazioni, è davvero semplice da modificare un tema di colore TextMate per applicare (o rimuovere) la formattazione al testo in questione.

In Vim, se si desidera modificare la formattazione per una determinata parola o simbolo, non sono sicuro da dove iniziare. C'è qualcosa di equivalente a Ctrl-shift-p di TextMate?

risposta

22

Non sono sicuro di aver capito bene, ma stai cercando questo?

" adds to statusline 
set laststatus=2 
set statusline+=%{synIDattr(synID(line('.'),col('.'),1),'name')} 

" a little more informative version of the above 
nmap <Leader>sI :call <SID>SynStack()<CR> 

function! <SID>SynStack() 
    if !exists("*synstack") 
     return 
    endif 
    echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') 
endfunc 
+0

Spot on - grazie! – nelstrom

+0

Ho appena apportato una modifica: mappando il comando a ctrl-shift-p per motivi di coerenza. 'nmap : call SynStack() ' – nelstrom

3

UPDATE: Da :help synID() (vedi l'esempio):

 
synID({line}, {col}, {trans})       *synID()* 
       The result is a Number, which is the syntax ID at the position 
       {line} and {col} in the current window. 
       The syntax ID can be used with |synIDattr()| and 
       |synIDtrans()| to obtain syntax information about text. 
       {col} is 1 for the leftmost column, {line} is 1 for the first 
       line. 
       When {trans} is non-zero, transparent items are reduced to the 
       item that they reveal. This is useful when wanting to know 
       the effective color. When {trans} is zero, the transparent 
       item is returned. This is useful when wanting to know which 
       syntax item is effective (e.g. inside parens). 
       Warning: This function can be very slow. Best speed is 
       obtained by going through the file in forward direction. 

       Example (echoes the name of the syntax item under the cursor): 
         :echo synIDattr(synID(line("."), col("."), 1), "name") 

Per quanto ne so, il meglio che puoi fare è :syntax, che vi darà un elenco di tutte la sintassi caricato per il file corrente. Non so nulla che fornisca l'analisi sintattica del buffer corrente.

Nota che :syntax definisce solo gli elementi di sintassi, è l'uso del comando :highlight che fornisce la colorazione per un elemento di sintassi.

Dopo aver deciso quali modifiche si desidera apportare, inserirli in ~/.vim/after/syntax/<filetype>.vim. Questi applicheranno le tue modifiche dopo il caricamento dei file di sintassi predefiniti.

+0

I documenti di aiuto per Vim sono eccezionali, ma non avrei potuto trovare le informazioni su synID senza il tuo aiuto. Grazie. Inoltre, il suggerimento circa la sovrascrittura dei file di sintassi inserendoli nella directory 'dopo' è molto apprezzato. – nelstrom

+0

@nelstrom - tramite "help vimfiles" puoi vedere quali directory hanno le preferenze su cui (il \ dopo la parte). – Rook

+0

@nelstrom - un modo rapido per vedere quale potrebbe essere un argomento di aiuto rilevante è usare il tasto CTRL-D per vedere i possibili completamenti quando si digita ': help syn' - ti mostrerà tutti gli argomenti della guida che corrispondono alla stringa" syn ", che è il modo in cui ho trovato' synID() '. – rampion

12

Un altro modo per ottenere un sacco di informazioni sulla evidenziazione:

map <F3> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" . " FG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"fg#")<CR> 

Se mi muovo su un commento in un file C e premo F3, ottengo:

hi<cCommentStart> trans<cCommentStart> lo<Comment> FG:#00ff00 

che indica che si trova nel gruppo di evidenziazione cCommentStart, collegato a Comment e colorato in verde (#00ff00). Questo è (modificato) da here, vedere quella pagina per ulteriori informazioni.

+0

Questo è fantastico. Trovo questo molto più utile rispetto al semplice identificatore 'hi'. – mybuddymichael

Problemi correlati