Vim Ctrl-] tag jump работает только для команд - PullRequest
0 голосов
/ 20 февраля 2019

Я пишу плагин для vimscript и хочу перейти к определениям функций с помощью тегов.Я установил ctags, настроил параметр vim set tags=./tags; в .vimrc и сделал файл тегов с ctags -R в каталоге скриптов.В моем скрипте у меня есть функция:

func s:OnWipeoutEvent()
" ...
endfunc

И команда:

command! -bar -nargs=* -complete=file -bang TermdebugEasymaps
            \ call s:StartDebug(<bang>0, <f-args>)

Когда я пытаюсь перейти к определению моей функции (OnWipeoutEvent()) с помощью Ctrl-] vim говорит: E257: ctag: tag not found. Так что это не работает для определения функций, но работает для определений команд vim.Я могу перейти к команде с помощью Ctrl-].Зачем?Как я могу решить эту проблему?

UPD: я думаю, что такое поведение является результатом префикса s: в s:OnWipeoutEvent() имени функции.Потому что я могу перейти к определению функции при вводе tag s:OnWipeoutEvent в командной строке vim.Может быть Ctrl-] использовать имя функции без этого префикса.Есть идеи, как это решить?

UPD2: Попытайтесь прояснить вопрос.Часть моего скрипта vim ниже:

func s:OnWipeoutEvent()
"...
endfunc

augroup termdebug-easymaps
    autocmd BufWipeout * call s:OnWipeoutEvent()
augroup END

command! -bar -nargs=* -complete=file -bang TermdebugEasymaps
            \ call s:StartDebug(<bang>0, <f-args>)

файл тегов:

TermdebugEasymaps   termdebug-easymaps.vim  /^command! -bar -nargs=* -complete=file -bang TermdebugEasymaps$/;" c
TermdebugEasymapsCommand    termdebug-easymaps.vim  /^command! -bar -nargs=* -complete=file -bang TermdebugEasymapsCommand$/;"  c
TermdebugEasymapsStop   termdebug-easymaps.vim  /^command! -bar TermdebugEasymapsStop call s:Stop_termdebug()$/;"   c
s:CloseBuffers  termdebug-easymaps.vim  /^func s:CloseBuffers()$/;" f
s:CommOutput    termdebug-easymaps.vim  /^func s:CommOutput(out, msg)$/;"   f
s:CreateCommWin termdebug-easymaps.vim  /^func s:CreateCommWin()$/;"    f
s:DecodeMessage termdebug-easymaps.vim  /^func s:DecodeMessage(quotedText)$/;"  f
s:GetCurrentSourceFullname  termdebug-easymaps.vim  /^func s:GetCurrentSourceFullname()$/;" f
s:GetFullname   termdebug-easymaps.vim  /^func s:GetFullname(msg)$/;"   f
s:GetOpenedList termdebug-easymaps.vim  /^func s:GetOpenedList()$/;"    f
s:GoToDebugWindow   termdebug-easymaps.vim  /^func s:GoToDebugWindow()$/;"  f
s:MapsCurrentBuffer termdebug-easymaps.vim  /^func s:MapsCurrentBuffer()$/;"    f
s:OnWipeoutEvent    termdebug-easymaps.vim  /^func s:OnWipeoutEvent()$/;"   f
s:ProgramRunState   termdebug-easymaps.vim  /^func s:ProgramRunState()$/;"  f
s:RestoreBuffersState   termdebug-easymaps.vim  /^func s:RestoreBuffersState()$/;"  f
s:SaveCurrentBufferState    termdebug-easymaps.vim  /^func s:SaveCurrentBufferState()$/;"   f
s:SetRunMapForCurrent   termdebug-easymaps.vim  /^func s:SetRunMapForCurrent()$/;"  f
s:SetRunMapsForOpened   termdebug-easymaps.vim  /^func s:SetRunMapsForOpened()$/;"  f
s:SetRunMapsForTreated  termdebug-easymaps.vim  /^func s:SetRunMapsForTreated()$/;" f
s:StartDebug    termdebug-easymaps.vim  /^func s:StartDebug(bang, ...)  $/;"    f
s:StartDebugCommand termdebug-easymaps.vim  /^func s:StartDebugCommand(bang, ...)$/;"   f
s:StartDebug_internal   termdebug-easymaps.vim  /^func s:StartDebug_internal(command_mode, args, bang)$/;"  f
s:StopTermdebug termdebug-easymaps.vim  /^func s:StopTermdebug()$/;"    f
s:TerminateProgram  termdebug-easymaps.vim  /^func s:TerminateProgram()$/;" f
s:TreatOpened   termdebug-easymaps.vim  /^func s:TreatOpened()$/;"  f
s:comm_timeout  termdebug-easymaps.vim  /^let s:comm_timeout = 5000$/;" v
s:commflags termdebug-easymaps.vim  /^let s:commflags = { 'current_source': 0, 'all_sources': 0, 'program_run': 0 }$/;" v
s:sleeptime termdebug-easymaps.vim  /^let s:sleeptime = 10$/;"  v
termdebug   termdebug-easymaps.vim  /^augroup termdebug-easymaps$/;"    a

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я добавил следующее в ~/.vim/after/ftplugin/vim.vim, чтобы исправить эту проблему:

if v:version >= 703
    " The runtime update of Vim 7.3.488 (changeset 2cfb68fa26cd) adds ":" to
    " 'iskeyword'; ostensibly "To make syntax highlighting of 'vimVar's work
    " correctly". But this breaks tag jumping, because ctags puts functions
    " without scope prefix into the tags database. (And this is better, because
    " prefixes are sometimes optional, and <SID> and s: are equivalent.)
    setlocal iskeyword-=:
endif
0 голосов
/ 20 февраля 2019

я пишу временное решение:

let s:mapped_buffers = []

autocmd BufReadPost,BufWritePost,BufEnter *.vim call s:MapBuffer()

func s:MapBuffer()
    let nomap = 0
    for buf_i in s:mapped_buffers
        if bufnr('%') == buf_i
            let nomap = 1
        endif
    endfor
    if !nomap
        nnoremap <buffer> <silent> <C-]> :call <SID>JumpToTag()<CR>
        nnoremap <buffer> <silent> <C-W>] :call <SID>JumpToTagInNewWindow()<CR>
        nnoremap <buffer> <silent> g] :call <SID>SelectTag()<CR>
        nnoremap <buffer> <silent> <C-W>g] :call <SID>SelectTagInNewWindow()<CR>
        call add(s:mapped_buffers, bufnr('%'))
    endif
endfunc

func s:JumpToTag()
    exe 'tag ' . s:GetTagName()
endfunc

func s:JumpToTagInNewWindow()
    exe 'stag ' . s:GetTagName()
endfunc

func s:SelectTag()
    exe 'tjump ' . s:GetTagName()
endfunc

func s:SelectTagInNewWindow()
    exe 'stjump ' . s:GetTagName()
endfunc

func s:GetTagName()
    let short_word = expand("<cword>")
    let long_word = expand("<cWORD>")
    let mi = match(long_word, short_word)
    if mi >= 2 && long_word[mi - 1] == ':'
        " Add prefix
        let tag_name = long_word[mi - 2: mi - 1] . short_word
    else
        let tag_name = short_word
    endif
    return tag_name
endfunc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...