Vim和Ctags:在生成标签时忽略某些文件

30

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

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

这也包括了在 llvm2.9/docs 中存在的 *.html 文件中的索引方法。我发现这是因为当我按下 ctrl-] 键时,它跳转到了 html 文件。

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

谢谢


似乎80%的问题是由于强制使用cpp语言引起的。为什么要这样做? - sehe
1
否则,点击某个函数定义会将我带到一个HTML文件中,其中列出了该函数的定义,而不是CPP文件。 - excray
你确定吗?我猜想如果没有使用--language-force=C++参数处理HTML文件,将无法首先获取HTML中的C++定义。你验证过了吗?另外,我猜你已经看到了我的回答(我理解了问题,只是想挑战一下前提)。 - sehe
与 https://dev59.com/Pmsy5IYBdhLWcg3w-i7h 相关 - Ciro Santilli OurBigBook.com
4个回答

29

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


这适用于exuberant ctags,不确定常规标签程序。 - skeept
3
多种类型呢?用逗号隔开吗? - eddy147

18

如果你需要排除的不仅仅是.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

2
引用排除模式以避免 shell 扩展。 - Walf

5
在vim中最简单的方法就是:
 :!ctags {.,**}/*.{cpp,h}

Explanation: The braces expand to

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

So it looks for source or header files in the current directory (./) or any nested directory (**/). Note **/ wouldn't match the current directory (it always matches at least 1 sub directory level)

在Shell中:

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

解释:这个命令会递归地查找当前目录下所有的 .cpp 和 .h 文件,并将它们传递给命令行上的 ctags

print0-0 的工作方式是确保它能正确地处理奇怪的文件名(例如包含空格或换行符的文件名)。

我会让其他 ctags 选项留给你自己想象 :)

PS. 对于最近的 bash,您可以使用

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

并且可以得到与vim中相似的行为!

你能解释一下每个命令正在发生什么吗? - still_dreaming_1

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接