Как получить название группы под курсором в vim?

Я обычно настраиваю существующий colorscheme для удовлетворения моих потребностей.

Если бы я мог получить имя группы синтаксиса под курсором, это мне очень помогло бы, как Firebug, но в Vim. Я хотел бы знать, как это сделать.

Ответ 1

Эта функция, которая плавала по сети, когда я делал то же самое:

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

Ответ 2

Следующая функция выведет как имя синтаксической группы, так и переведенную группу синтаксиса символа, на котором курсор включен:

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

Чтобы сделать это более удобным, его можно обернуть в пользовательскую команду или привязку клавиш.

Как это работает:

  • line('.') и col('.') вернуть текущую позицию
  • synID(...) возвращает числовой идентификатор синтаксиса
  • synIDtrans(l:s) преобразует числовой идентификатор синтаксиса l:s, следуя выделенным ссылкам
  • synIDattr(l:s, 'name') возвращает имя, соответствующее цифровому идентификатору синтаксиса

Это будет звучать примерно так:

vimMapModKey -> Special

Ответ 3

Попробуйте следующее:

" 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
"}}}

Ответ 4

Здесь отображение, которое покажет иерархию synstack(), а также покажет ссылки подсветки. нажмите gm, чтобы использовать его.

function! SynStack ()
    for i1 in synstack(line("."), col("."))
        let i2 = synIDtrans(i1)
        let n1 = synIDattr(i1, "name")
        let n2 = synIDattr(i2, "name")
        echo n1 "->" n2
    endfor
endfunction
map gm :call SynStack()<CR>