仅在当前文件中搜索标签

时间:2011-12-28 13:22:31

标签: vim tags editor ctags

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

我发现tagslist在这项工作中做得非常好。因此,如果我可以使用taglist生成的标签进行搜索,那将非常好。

3 个答案:

答案 0 :(得分:3)

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

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

ctags也能够仅为单个文件或任意选择的文件生成标签。它可以在几个步骤中完成,但它的定义并不像您习惯做的那么简单......

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

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

  3. 此时,您应该有一个tags文件,其中只包含步骤1中指定的文件中的标记。

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

    修改

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

答案 1 :(得分: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 来启动completition。我建议你把它映射到一个不同的键(如果你愿意,可能是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。

祝你好运!

答案 2 :(得分:1)

不完全是你的问题的答案,但似乎没有办法完全按照你的需要做,所以,我建议你使用以下内容:对于你在Vim中的Java开发,试试eclim

此工具可帮助您使用自己喜欢的文本编辑器Vim,具有Eclipse(IDE)的强大功能。 我无法找到:ta的标签完成的模拟,但我知道g]的明智模拟:这是一个命令:JavaSearchContext。你可以将它映射到某个东西。

例如,如果您有两个课程AB,并且每个课程中都有方法foo(),那么g]每次都会询问您跳转到foo(),但:JavaSearchContext将始终跳转到foo()的正确声明。

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