如何使 ctags 在不打开新拆分的情况下在垂直拆分上显示标签定义?

How to cause ctags to show tag definition on vertical split without opening a new split?

我正在使用 ctags 并且我添加了 map <C-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR> 到我的 vimrc。但是,这每次都会打开一个新的垂直拆分。有没有一种方法可以在垂直拆分上显示标签定义而无需每次都打开一个新标签定义?

更新:我也想知道是否有办法正常使用ctag堆栈。也就是用ctrl+t从栈中弹出一个位置?

下面的命令应该可以做你想做的,至少是以一种 hack-ish 的方式:

nnoremap <C-]> :only<bar>vsplit<CR>:execute "tag" . expand('<cword>')<CR>

以下命令可实现您要查找的结果:

:execute "vertical ptag " . expand("<cword>")

因此,此映射也应该有效:

nnoremap <C-]> :execute "vertical ptag " . expand("<cword>")<CR>

您可能希望将 'previewheight' 设置为更高的值。

更新

作为替代解决方案,如果您想继续在标签中导航,则可以使用以下方法:

function! FollowTag()
  if !exists("w:tagbrowse")
    vsplit
    let w:tagbrowse=1
  endif
  execute "tag " . expand("<cword>")
endfunction

nnoremap <c-]> :call FollowTag()<CR>

尽管如此,我认为您应该考虑通过考虑以下标准 Vim 快捷方式来修改创建此类快捷方式的需要:

  1. <c-]> : 跳转到光标下更新标签栈的词的标签定义。
  2. <c-w>} :打开带有标签定义位置的预览 window。光标不会改变它的位置,所以标签堆栈不会更新。
  3. <c-w>z : 关闭预览 window.
  4. <c-w>v : 将当前 window 一分为二,保持光标位置。

所以,如果你想快速检查标签声明,你可以使用<c-w>},然后<c-w>z关闭它。但是如果你想导航,那么你可以简单地使用 <c-w>v 创建一个拆分,然后使用标准 <c-] 在标签中导航。完成后,您只需使用 <c-w>c.

关闭 window