【发布时间】:2019-02-20 16:58:05
【问题描述】:
我在 vimscript 上编写了一个插件,并想使用标签跳转到函数定义。
我已经安装了 ctags,在 .vimrc 中配置了 vim 选项 set tags=./tags; 并在脚本目录中使用 ctags -R 制作了标签文件。
在我的脚本中,我有函数:
func s:OnWipeoutEvent()
" ...
endfunc
和命令:
command! -bar -nargs=* -complete=file -bang TermdebugEasymaps
\ call s:StartDebug(<bang>0, <f-args>)
当我尝试使用 Ctrl- 跳转到我的函数 (OnWipeoutEvent()) 定义时,vim 说:E257: ctag: tag not found. 所以它不适用于函数定义,但适用于 vim 命令定义。我可以使用 Ctrl-] 跳转到命令。为什么?我该如何解决这个问题?
UPD:我认为这种行为是s:OnWipeoutEvent() 函数名中的s: 前缀的结果。因为在vim命令行输入tag s:OnWipeoutEvent可以跳转到函数定义。可能是 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
【问题讨论】:
-
你从哪里跳?我只看到你问题中的定义。另外,也请包含标签文件的内容。您可以通过
:echo taglist('.*')检查 Vim 是否知道这两个定义 -
感谢重播。 Vim 通过
:echo taglist('.*')显示这两个定义。
标签: vim