【问题标题】:Search tags only in current file仅在当前文件中搜索标签
【发布时间】:2011-12-28 13:22:30
【问题描述】:

我正在使用 ":ta" 跳转到一个方法。
例如,我有两个名为 A.javaB.java 的类。它们都有一个foo() 方法,而B.java 有另一个称为fooBar() 的方法。然后我打开A.java 并输入:ta foo 然后按TAB 然后我会得到两个完成:foofooBar。但是我现在要跳转的只是当前文件中的标签,我不喜欢在其他文件中显示标签。

我发现标签列表在这项工作中做得很好。因此,如果我可以使用 taglist 生成的标签进行搜索,那就太好了。

【问题讨论】:

  • 我以前问过这个问题,但没有得到好的答案。所以这次我详细澄清一下,两天后设置赏金。
  • 如果有人能告诉我如何在指定类中搜索搜索方法也可以解决这个问题
  • 非常相似的问题,但对于 C++ - stackoverflow.com/questions/5080211/…
  • 我不是在寻找代码完成工具,只是在跳转标签时指定范围。谢谢

标签: vim tags editor ctags


【解决方案1】:

根据您调用方法的次数,* 可能就足够了。

不使用标签,gd 可用于转到光标下方法的本地声明。我通常倾向于选择技术含量最低的解决方案,所以我会选择这个。

但是ctags 也能够为单个文件或任意选择的文件生成标签。它可以通过几个步骤完成,但它肯定不像你习惯做的那样简单......

  1. 使用您要扫描的文件的名称创建一个文件。假设它名为files.txt,它位于您工作目录的根目录中。

  2. 使用-L <file> 参数生成tags 文件:ctags -L files.txt

此时,您应该有一个 tags 文件,其中仅包含在步骤 1 中指定的文件中存在的标签。

在这里为整个项目和单个文件生成不同的tags 文件可能很有用。一个简短的脚本生成一个以当前文件命名的tags 文件并使其成为唯一的tags 源可能会使整个事情变得更容易。

编辑

实际上,TagList 和 TagBar 不会生成tags 文件。他们运行的ctags <options> 命令的输出在内部使用,并使用各种正则表达式进行解析,以按范围或文件名等进行过滤。

【讨论】:

  • 谢谢。我了解taglist 的工作原理。但是我发现生成的标签文件有一个名为类的列,所以我猜可能有一些方法可以搜索具有指定类名的标签。
  • 没错。我不认为 Vim 与 ctags 交互的方式允许根据所有可用的附加字段选择标签。如果您只想为当前文件使用标签,您基本上有两种解决方案:要么生成绑定到一个文件的特定 tags 文件,要么找到一种过滤大型项目的 tags 文件的方法。
【解决方案2】:

很遗憾,这无法使用 ctags 完成。 Ctags 不尊重上下文,它是所有可能“功能”的纯粹列表。尝试使用编辑器(例如 vim)打开标签文件,您会看到它只是一个“函数”列表(在 Java 的情况下它们是“方法”)。示例:

getDesc src/com/redhat/rhn/internal/doclet/Handler.java /^    public String getDesc() {$/;" m   class:Handler
getDoc  src/com/redhat/rhn/internal/doclet/ApiCall.java /^    public String getDoc() {$/;"  m   class:ApiCall

Vim 只是“按原样”搜索文件而不给它任何上下文——它只是搜索一个“函数”。它能够搜索文件、类、方法、枚举等。标签格式在这里有更详细的描述:http://ctags.sourceforge.net/FORMAT

在 Vim 中你几乎没有可能性。有几个插件可以为 Vim 提供一些上下文敏感性,但您不能为此使用标签。 Vim 本身有一个名为 OmniComplete 的功能,并且很少有专门用于 Java 的插件。然后您可以使用 Ctrl-X Ctrl-O 开始完成。我建议您将其映射到不同的键(如果您愿意,可以使用 Ctrl-Space)。有关 Java OmniComplete 插件的更多信息:

Vim omnicompletion for Java

Eclim (http://eclim.org/) 非常全面,但难以设置(您需要在后台运行 Eclipse)。 JDE 脚本更简单也更健壮 (http://www.vim.org/scripts/script.php?script_id=1213)。请注意 IntelliJ IDEA 社区版(免费)还有一个非常棒的 Vim 插件,可以免费使用。但我理解你 - Vim 就是 Vim。

祝你好运!

【讨论】:

  • 感谢您的回答。但我发现TagList 列出的信息正是我所需要的。如果我可以搜索TagList显示的标签,那么这个问题就解决了。
  • 我发现完成标签有优先权。即先显示当前文件中的标签,然后显示其他文件中的标签。所以如果可以使其他文件中的标签不显示就可以了。
【解决方案3】:

不完全是您问题的答案,但似乎没有办法完全满足您的需求,因此,我建议您以下方法:对于您在 Vim 中的 Java 开发,请尝试 eclim

此工具可帮助您使用具有 Eclipse (IDE) 功能的您最喜欢的文本编辑器 Vim。 我找不到:ta 的制表符补全的模拟,但我知道g] 的智能模拟:这是一个命令:JavaSearchContext。您可以将其映射到某物。

例如,如果你有两个类AB,并且每个类都有方法foo(),那么g]会在你每次想跳转到foo()时询问你,但是@ 987654330@ 将始终跳转到 foo() 的正确声明。

当然,还有很多其他功能。

【讨论】:

  • 谢谢。也许对 vim 要求太多是我的错。但是使用 vim 目前的标签功能虽然不完美,但可以完全满足我的需求。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多