2012-02-27 31 views

Trả lời

14

Có chức năng này đã được nổi khắp nơi trên web khi tôi đã làm điều tương tự:

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

Cảm ơn. Giúp tôi rất nhiều. – kev

+0

Nếu bạn ở đây vì bạn đang cố gắng chẩn đoán nhiều đánh dấu màu đỏ, đó là [do kiểm tra chính tả] (http://stackoverflow.com/questions/28647994/annoying-red-highlighting-of-random-words-in- vim) và SynStack() dường như không phát hiện ra vì một lý do nào đó. – Von

0

Hãy thử điều này:

" 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

Chức năng sau đây sẽ ra cả tên của cú pháp nhóm và nhóm cú pháp được dịch của ký tự mà con trỏ đang bật:

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

Để làm cho điều này thuận tiện hơn, nó có thể được gói trong một lệnh tùy chỉnh hoặc ràng buộc khóa.

Làm thế nào các công trình này:

  • line('.')col('.') trả lại vị trí hiện tại
  • synID(...) trả về một ID cú pháp số
  • synIDtrans(l:s) dịch cú pháp id số l:s bằng cách làm theo nổi bật liên kết
  • synIDattr(l:s, 'name') trả về tên tương ứng với cú pháp số ID

này sẽ echo cái gì đó như:

vimMapModKey -> Special 
+0

Tôi thấy điều này tốt hơn đáng kể so với câu trả lời được chấp nhận bởi vì nó thường tiết kiệm cho tôi sau thông qua một hoặc nhiều 'liên kết đến' các mục nổi bật khi cố gắng tìm ra những gì tôi muốn thay đổi. –

Các vấn đề liên quan