几种vim标签插件的区别

2 投票
1 回答
3266 浏览
提问于 2025-04-18 17:15

其实我有两个问题。

首先,按照我的了解,有两个标签工具:

  1. Ctags
  2. GNU Global,也叫gtags

我想知道,如果我的日常工作主要集中在Ruby、Rails、JavaScript和Python这些动态语言上,哪个工具更合适。通过搜索,我发现gtags似乎相当于ctags加上cscope的组合?

其次,关于ctags,有一些vim插件:

  1. vim-tags:可以通过命令:TagsGenerate在Vim中生成标签文件。
  2. tagbar:一个很有名的插件,似乎可以实时生成标签。
  3. vim-easytags:看起来像vim-tags,但功能更多。

我想知道:

  1. 这些插件之间有没有重叠的功能?
  2. 如果有重叠,应该如何整合它们,或者该如何选择使用哪个插件?

我知道在一个SO帖子里问两个问题并不好,但我觉得这两个问题是紧密相关的,因为它们对Vim和标签的组合非常重要。希望这个问题能为那些想使用标签但不太熟悉的人提供一些基础或教程。(我找不到一个“现代”的vim+ctags教程,网上大多数帖子都过时了。)

谢谢。

更新:

基本上,我希望能够:

  1. 跳转到某个函数的声明
  2. 跳转到某个函数的使用位置
  3. 让自动补全更智能。我的意思是,如果我有

    class Obj
      def m1
        puts "hello"
      end
    end
    

    那么当我输入obj = Obj.new; obj.时,自动补全应该显示m1。据我所知,YouCompleteMe可以使用ctags的文件,但我按照说明设置时失败了。

老实说,我并不太清楚ctags能做什么或者能提供什么功能。所以请随意建议一些更有用的功能。谢谢!

1 个回答

2

你可以先放下GNU GLOBAL,因为我上次检查的时候发现它根本不支持JavaScript。我不太清楚Ruby和Python的情况,但你可以自己试试看,应该不会太难。

Ctags可以用在JavaScript(还有其他语言)上,但它对“现代”写法不太友好,比如内联回调、滥用字面量对象、自调用函数等等。你可以通过在你的~/.ctags文件中添加以下几行来帮助它:

--langmap=javascript:.js
--regex-javascript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/F,function,functions/
--regex-javascript=/function[ \t]*([A-Za-z0-9._$()]+)[ \t]*\(/\1/F,function,functions/
--regex-javascript=/([A-Za-z0-9._$]+)[ \t]*=[ \t]*\{/\1/o,object,objects/
--regex-javascript=/^[ \t]*([A-Za-z0-9._$]+)[ \t]*[:][ \t]*[^\{]/\1/p,property,properties/
--regex-javascript=/^[ \t]+var[ \t]*([A-Za-z0-9._$]+)[ \t]*=[ \t]*[\d"'\[]/\1/v,variable,variables/

这些对我来说有效,但我的JavaScript确实有点“老派”。需要注意的是,ctags只能处理“定义/声明”。

还有一些特定语言的ctags变种,通常能给出更合理的结果,比如jsctags(JavaScript)ripper-tags(Ruby)

另一方面,Cscope可以处理“使用情况”,并且支持所有语言。设置起来比ctags稍微复杂一些,使用起来也有点复杂,但考虑到它的功能,这也是很合理的。

你可能会发现Cscope的一个“问题”是,围绕它开发的插件不如ctags多。这是一个值得注意的限制。

至于你提到的那些插件……

  1. 是的,#1和#3之间有重叠。#2不生成或使用tags文件。
  2. 试试它们,看看文档,然后自己决定。

你甚至没有告诉我们你想用这个功能做什么?你想要什么?生成tags?跳转到使用位置?跳转到声明?像IDE那样的“类浏览器”?还是全部都要?

编辑

让我来回应你的评论和编辑:

  1. ctags和cscope都允许你“跳转到声明”,无论是任意符号还是(通过自定义映射和设置)光标下的符号。

  2. 只有cscope允许你“跳转到使用位置”。

  3. 由于ctags本身有点笨,而你使用的是高度动态的语言,这让ctags在补全方面显得有些无用。不过,有些语言的支持比其他语言要好,所以你可能会找到一些有用的第三方插件,比如jedi-vimTern for Vim

  4. TagList和TagBar并不生成tags 文件,但它们会运行ctags并使用其输出。它们只是不会把输出写入磁盘。所以,是的,你可以用这些插件“跳转到声明”,但它们仍然与Vim内置的ctags支持是隔离的,这可能会导致一些问题。

查看:help ctags:help cscope,了解它们能做什么。

撰写回答