【问题标题】:Can gtags navigate back?gtags 可以返回吗?
【发布时间】:2015-02-12 10:52:46
【问题描述】:

我使用带有 gtags 插件的 vim 来通过多个文件读取代码。一切都很好,只是在我运行 :CtagsCursor 以跳转到令牌定义之前,我不知道如何导航回之前的位置。我通读了 GNU 全球在线文档,但没有发现任何有用的信息。但在“3.4 Elvis using GLOBAL”一章中,它说“CTRL-T 返回最近的标签上下文。”,这正是我想要的。不知道为什么这个函数没有为 vim 实现,或者我有什么问题?

BR,若尘

【问题讨论】:

  • 嗯,ctrl-t 应该可以工作。试试ctrl-o,看看它的行为是否符合您的要求。

标签: vim gnu-global


【解决方案1】:

<C-t> 是与 Vim 的“标签栈”相关的内置命令。

您使用的插件似乎没有实现类似的功能(并且无论如何也不与标签堆栈交互),所以您可以使用<C-o>/<C-i> 在跳转列表中跳转。

【讨论】:

  • 如果你愿意,你可以通过global 创建一个标签文件,例如global -t . > ./tags。这将允许您使用 vim 的 ctag 功能,但使用“gtags”来构建数据库。您也可以使用 set 'cscopeprg' to gtags-cscope 这样您就可以获得 cscope 功能,但我不确定这是否允许使用 <c-t>
【解决方案2】:

我通过使用gtags-cscope 作为cscopeprog 解决了这个问题。此外,我还激活了 cscopetag 以使用 cscope 在 vi​​m 中进行 ctag 查找。这样,如果您按<C-]>,您会在 gtags 中搜索声明,然后按<C-t> 再次返回。

对于我映射到<C-\> 的引用查找,我使用快速修复窗口。这不使用标签堆栈,<C-t> 将不起作用。

我试过了,使用标签堆栈,但这会导致标签堆栈混乱和选择窗口很大。如果您查找多个引用,则必须多次按 <C-t>,这就是我决定使用 quickfix 方法的原因。

这是我的实际配置。

set cscopeprg=gtags-cscope
if has('cscope')
  set cscopetag cscopeverbose
  if has('quickfix')
    set cscopequickfix=s-,c-,d-,i-,t-,e-
  endif

  map <C-\> :cs find c <C-R>=expand("<cword>")<CR><CR>
endif

如果您想在不使用 quickfix 的情况下进行参考查找,请删除 cscopequickfix 中的 c- 选项。

另一个提示,cscopeverbose 是使用 cscope 时打印错误消息的选项。否则不会出现错误(例如,没有添加 gtags 文件,或者找不到符号)。

编辑 1:

要加载 GTAGS 文件,请使用内置命令 cs add ./GTAGS

【讨论】:

  • 这很好。它唯一缺少的是加载 cscope 数据库。如果我们可以使用 vim 已经支持的语法,带有标签 set tags=./tags;,那就太好了。
  • @seanahern 不用设置tags,您可以使用命令cs add ./GTAGS 来使用内置命令。
  • 嗯,对,但是cs add 不会像 vim 内置在其“设置标签”命令中那样搜索路径层次结构。我所说的是能够在当前目录中搜索特定文件(在本例中为 GTAGS),然后在每个连续的父目录中搜索直到找到该文件。
【解决方案3】:

GNU GLOBAL 有两个方便的 vim 插件 gtags.vimgtags-cscope.vim

gtags-cscope.vim 的标题注释说它是用来集成 GLOBAL 和 Vim 的cscope 接口的。

所以你要做的是:

  1. 安装vim插件(它们在tarball中)
    • cp /path/to/global-source/*.vim ~/plugin/
  2. ~/.vimrc中添加一些选项

gtags-cscope.vim 的标题注释具有所有可用选项。 就我而言,我使用以下内容:

" To use the default key/mouse mapping:
let GtagsCscope_Auto_Map = 1
" If you hope auto loading:
let GtagsCscope_Auto_Load = 1
" Don't show warning if GTAGS not found
let GtagsCscope_Quiet = 1
" To use 'vim -t ', ':tag' and '<C-]>'
set cscopetag

【讨论】:

    【解决方案4】:

    我查看了文档,根据第 3.5.1 节,vim 中的 gnu-global 似乎不支持标签堆栈。特征: http://www.gnu.org/software/global/globaldoc_toc.html#Features_0028Vim_0029

    在上面的描述中,有一个设置使用标签堆栈的插件的链接,所以检查一下。

    除了使用 ctrl-octrl-i 作为替代品之外应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2012-07-06
      • 2016-10-17
      • 2010-11-10
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多