2012-02-27 12 views

risposta

14

C'è questa funzione che galleggiava giro per il web, quando stavo facendo la stessa cosa:

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

Grazie. Aiutami molto. – kev

+0

Se sei qui perché stai cercando di diagnosticare molte evidenziazioni in rosso, è [a causa di un controllo ortografico] (http://stackoverflow.com/questions/28647994/annoying-red-highlighting-of-random-words-in- vim) e SynStack() non sembra rilevarlo per qualche motivo. – Von

0

Prova questo:

" diagnostics {{{ 
if has('balloon_eval') 
    nnoremap <F12>   : setl beval!<CR> 
    set bexpr=InspectSynHL() 
endif 
fun! InspectSynHL() 
    let l:synNames = [] 
    let l:idx = 0 
    for id in synstack(v:beval_lnum, v:beval_col) 
     call add(l:synNames, printf('%s%s', repeat(' ', idx), synIDattr(id, 'name'))) 
     let l:idx+=1 
    endfor 
    return join(l:synNames, "\n") 
endfun 
"}}} 
2

La seguente funzione emetterà sia il nome della sintassi gruppo e il gruppo di sintassi tradotto del carattere su cui si trova il cursore:

function! SynGroup()                
    let l:s = synID(line('.'), col('.'), 1)          
    echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name') 
endfun 

Per renderlo più conveniente, può essere racchiuso in un comando personalizzato o in un collegamento chiave.

Come funziona:

  • line('.') e col('.') restituisce la posizione corrente
  • synID(...) restituisce un ID di sintassi numerica
  • synIDtrans(l:s) traduce il Numerico Sintassi id l:s seguendo Stream Links
  • synIDattr(l:s, 'name') restituisce il nome corrispondente all'ID sintassi numerico

Questo eco qualcosa di simile:

vimMapModKey -> Special 
+0

Lo trovo decisamente migliore della risposta accettata perché spesso mi salva attraverso uno o più "link a" evidenziare le voci quando cerco di capire cosa sto cercando di cambiare. –

Problemi correlati