如何手动将堆栈条目推送到vim标签堆栈中



就像标题所说的:"如何手动将堆栈条目推送到vim-tagstack?"

问题是:我使用gtags/global+unite.vim插件已经有一段时间了(顺便说一句,这两个插件太棒了!),但它未能自动将标签条目插入标签堆栈。有什么办法解决它吗?

我在vim-tagimpacter中使用了一种取自vim-jedi的技术来将标签推送到标签堆栈中。(我相信这与lh标签是相同的技术。)

对于omnisharp vim,您可以将此地图添加到**ftplugin/cs.vim**:

nnoremap <buffer> <Leader>jT :<C-u> TagImposterAnticipateJump <Bar> OmniSharpGotoDefinition<CR>

现在您可以使用<Leader>jT跳到标记,使用<C-t>跳回标记,然后:pop/:tag在堆栈中上下导航。:tags将显示您的标签前缀为CCD_ 7。

我认为这应该适用于gtags.vim:

nnoremap <Leader>jT :<C-u> TagImposterAnticipateJump <Bar> GtagsCursor<CR>

一个更理想的解决方案是所提出的"tagfunc",它将让你实现一个返回标签列表的函数(从gtags/global/athing派生),vim将负责填充标签堆栈。

在我非常机密的lh标签插件中,我有lh#tags#jump()函数,用于注入标签并跳转到它们。该函数现在已移动到我的vim库:lh#tags#stack#jump()

我们的想法是总是有一个伪造的标签文件(在tmpdir中),在需要的时候,我可以在其中添加作为伪造标签的跳转位置。从那里,只需跳转到forged_tag_number_000042即可。然后Vim将自动为我们维护堆栈。

作为vim的最新版本(使用if has('patch-8.2.0077')检查您的位置是否足够新),将位置推送到标签堆栈中非常容易:

" Store where we're jumping from.
let pos = [bufnr()] + getcurpos()[1:]
let item = {'bufnr': pos[0], 'from': pos, 'tagname': expand('<cword>')}
YourCommandToJumpToCWord
" Assuming jump was successful, write to tag stack.
let winid = win_getid()
let stack = gettagstack(winid)
let stack['items'] = [item]
call settagstack(winid, stack, 't')

最新更新