【问题标题】:Vim and Ctags: Ignoring certain files while generating tagsVim 和 Ctags:生成标签时忽略某些文件
【发布时间】:2011-10-12 07:33:24
【问题描述】:

我有一个文件夹 llvm2.9,我在其中运行了这个命令。

$> ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++

这是 *.html 文件中的索引方法,也存在于 llvm2.9/docs 中。我发现了这一点,因为当我为某个类按 ctrl-] 时,它转到了 html 文件。

如何强制 ctags 单独使用 .cpp/.h 文件或忽略特定目录。

谢谢

【问题讨论】:

  • 似乎 80% 的问题是由 强制语言 到 cpp 引起的。你为什么这样做?
  • 否则,单击某些函数定义会将我带到一个列出它的 html 文件而不是 cpp 文件。
  • 你确定吗?我的猜测是,处理 without --language-force=C++ 的 html 文件将 not 首先获取 HTML 中的 C++ 定义。你验证了吗?另外,我想你已经看到了我的答案(我理解了这个问题,我也只是想挑战一下这个前提)

标签: vim ctags


【解决方案1】:

您可以使用排除文件类型 --exclude='*.html'

【讨论】:

  • (这适用于 exeburant ctags,不确定常规标签程序)
  • 那么多种类型呢?用逗号分隔?
【解决方案2】:

vim 中最简单的方法是

 :!ctags {.,**}/*.{cpp,h}

解释:大括号展开为

:!ctags ./*.cpp **/*.cpp **/*.h **/*.h 

因此它会在当前目录 (./) 或任何嵌套目录 (**/) 中查找源文件或头文件。注意**/ 不会匹配当前目录(它总是匹配至少 1 个子目录级别)

在外壳中:

 find -iname '*.cpp' -o '*.h' -print0 | xargs -0 ctags

说明:递归查找当前目录下的所有 .cpp 和 .h 文件,并在命令行中将它们传递给ctags

print0-0 一起工作的方式是确保它可以正确处理奇怪的文件名(例如包含空格甚至换行符)

剩下的 ctags 选项留给你自己想象吧:)

PS。对于最近的 bash-es,您可以使用

 shopt -s globstar
 ctags {.,**}/*.{cpp,h}

并获得与 vim 中相同的行为!

【讨论】:

  • 你能解释一下每个命令发生了什么吗?
【解决方案3】:

如果您需要排除的不仅仅是 .html 文件:

您不能在排除选项内用逗号分隔列表。这不起作用:

ctags --exclude=*.html,*.js ./*

但是,您可以传递多个排除选项:

ctags --exclude=*.html --exclude=*.js ./*

传递 -V 选项以帮助调试:

ctags -V --exclude=*.html --exclude=*.js ./*

给出输出:

Reading initial options from command line
  Option: --exclude=*.html
    adding exclude pattern: *.html
  Option: --exclude=*.js
    adding exclude pattern: *.js

【讨论】:

  • 引用您的排除模式以避免外壳扩展。
【解决方案4】:

我不想跟踪可能在大型项目中处理的每个文件类型,而且我只对 Python 感兴趣,所以我明确地只使用 ctags --languages=Python ... 处理 Python 文件。可以使用ctags --list-languages查看语言名称列表。

【讨论】: