Vim:在新标签页中打开标签

69

有没有一个插件或脚本可以在新标签页中打开ctags条目?我想把光标放在一个函数上,按下ctrl+],然后将条目在另一个标签页中打开。如果我选择一个条目,我也希望ctrl+]仍然可以工作,并在一个新的vim标签页中打开。


3
可能是 Opening (c)tags in new tab in (G)Vim 的重复问题。 - richq
@richq 我在我的 .vimrc 文件中尝试了最受欢迎的解决方案,但按下 ctrl+\ 时它没有做任何事情。 - Paul Tarjan
好的,我应该使用https://dev59.com/lnRB5IYBdhLWcg3wuZQ1作为重复问题,因为那里也包含了sehe的答案。我想知道<C->是否适用于任何情况?它混合了Control和<Leader>,可能会让vim混乱。 - richq
我使用 <C-\> 来切换 NERDTree。你完全可以映射 <C-\> :) - Justin Force
4个回答

111

您可以使用以下操作实现:

C-wC-]C-wT

然后,您还可以进行映射:

:nnoremap <silent><Leader><C-]> <C-w><C-]><C-w>T

编辑:另外,根据您实际需要的内容,不要忘记您可以使用:ptag在预览中打开标签,例如使用C-w}。只是提一下,以防万一...


1
不幸的是,如果标签操作由于任何原因停止,则此方法将不起作用。例如,如果有多个标签,我必须在它们之间进行选择。有什么解决办法吗? - Paul Tarjan
@uɐɾɹɐʇ ןnɐd:这将取决于您对 <C-w><C-]> 的定义 - 在我的情况下,它似乎总是跳转到具有最高优先级的标签而不询问(如文档所述)。也许您有干扰映射,请参见 :verbose map <C-w>:verbose imap <C-w> 等命令。 - sehe
我的 :nnoremap <silent><Leader><C-]> <C-w><C-]><C-w>T 不起作用,所以我尝试了 :nnoremap <C-]> <C-w><C-]><C-w>T,它可以工作,但箭头键表现不佳,你能帮我解决这个问题吗? - Dinesh
@JakeByman 不太容易。也许可以尝试使用:tj:se switchbuf=useopen,usetab作为起点(但我没有尝试过)。我使用 YouCompleteMe 完成了 90% 的导航任务,当在文件内跳转时只需使用 C-] - sehe
1
瞧!set switchbuf=useopen/usetab 做到了!你是我最喜欢的,这真是改变游戏规则的。 - Jake Byman
显示剩余6条评论

6

以下是两个相当临时的映射(如果您的标签是由ctags生成的):

nnoremap <C-]> :tabnew %<CR>g<C-]>
vnoremap <C-]> <Esc>:tabnew %<CR>gvg<C-]>

首先,我们在新标签页中打开当前缓冲区;然后我们尝试跳转到光标下的标记(g<C-]>相当于:tjump),如果只有一个匹配项,则直接跳转到标记,如果有多个匹配项,则提供一个匹配列表。
优点: 缺点:
  • 如果您退出匹配列表而没有选择任何一个匹配项,则新创建的标签页将保持打开状态
  • 如果没有匹配项,则也会发生相同的情况
P.S. 您能提供一种适用于视觉模式映射的用例吗?
P.P.S. 如果您使用cscope生成标记(这比ctags更好),并使用其vim映射,请将上述映射替换为以下映射:
nnoremap <C-]> :tabnew %<CR><C-]>
vnoremap <C-]> <Esc>tabnew %<CR>gv<C-]>

对于可视模式映射,我们的代码库中有一些名为 foo:bar:baz 的类,但我的 ctags 在 : 上断开,因为我不想将 foo::bar 作为一个实体选择。所以我通常会进入 foo:bar:baz 的可视模式来跳转到它。 - Paul Tarjan
我明白了。所以这些映射有帮助吗?它们中使用的命令非常通用,所以希望它们能在任何地方都能正常工作,不会产生冲突。 - dorserg

3
如果有人仍在寻找解决方案。在这个解决方案中,当没有找到标签时,不会再留下空白选项卡。
function! w:GoToTag(tagWord)

    let l:tagfile = &tags
    :tabe
    execute 'set tags=' . l:tagfile
    execute ':silent tjump ' . a:tagWord

    let l:tagFilename = expand('%:t')

    if l:tagFilename == ''
        :tabclose
        :tabprevious
    endif
endfunction

3

您可以在~/.vimrc中如下设置键盘快捷键,'g'后跟CONTROL-]:

nmap g<C-]> :execute 'tab tag '.expand('<cword>')<CR>

nmap       means 'when in normal mode'
g<C-j>     is the shortcut, 'g' followed by CTRL-]
execute    is a means of executing a command passed as a string
tab tag    means "open a new tab and run 'ta'"
expand     is used to expansion of a vim item
<cword>    means a word the same as used for '*'. See also <cWORD>

您可以通过:tab标签函数名测试“tab ta”。

1
我尝试了所有的方法...只有NERDTreeTabsToggle这个解决方案有效。谢谢!!! - g.o.a.t.
如果你使用的是 ~/.vim 而不是 ~/.vimrc,那么把这一行放在一个名为 ~/.vim/plugin/ctags.vim 的文件中或类似的文件中。 - maikel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接