70

我今天正在尝试在 Vim 上使用(旺盛的)ctags 进行设置,但很难让它正常工作。我使用以下命令在命令行上生成我的 ctags 文件:

cd myproj
ctags -R

这会将标签文件放在 myproj 根目录中。但是,当我处理位于根目录中的源代码时,Vim 似乎只从这个标签文件中读取。当我导航到更深的目录时,如果我尝试使用 跳转到标签<C-]>,我会得到:

E433: No tags file
E426: tag not found: MyClassName

我已经验证 MyClassName 在标签文件中确实有一个标签,只是 Vim 没有看到它。有人能解释一下如何配置 Vim 来引用根的标签文件吗?

谢谢。

4

5 回答 5

141

将此添加到.vimrc文件 中set tags=tags;/

这将检查当前文件夹中的标签文件,并继续向上一个目录一直到根文件夹。

因此,您可以在项目中的任何子文件夹中找到标签文件。

于 2011-02-16T16:27:56.923 回答
15

有一个选项可以告诉 Vim 在哪里寻找标记文件。

我使用以下配置:

" search first in current directory then file directory for tag file
set tags=tags,./tags

从帮助中提取:

当标记文件名以“./”开头时,“.” 替换为当前文件的路径。这使得可以在当前文件所在的目录中使用标签文件(无论当前目录是什么)。使用“./”的想法是,您可以定义首先搜索哪个标签文件:在当前目录中(“tags,./tags”)或在当前文件的目录中(“./tags,tags”) .

例如::set tags=./tags,tags,/home/user/commontags

我将当前工作目录保存在tags生成​​文件的顶级项目目录中。

使用:pwd然后:cd myproj(在 Vim 中)进入包含标签文件的目录。

有关标签路径的更多信息,请参阅:help tags-option

您的问题可能是您在错误的目录中,或者您的tags选项设置不正确。

于 2011-02-16T14:23:22.927 回答
2
#!/bin/sh

FREEZE_NAME=/* Give some version number */

mkdir $HOME/ctags/$FREEZE_NAME

V1=/* Software Path */

find $V1 -name "*.h" | xargs /usr/local/bin/ctags -a -f $HOME/ctags/$FREEZE_NAME/h.tags

find $V1 -name "*.c" | xargs /usr/local/bin/ctags -a -f $HOME/ctags/$FREEZE_NAME/c.tags

cd $HOME/ctags/$FREEZE_NAME/

rm -f all.tags

cat c.tags h.tags >> all.tags

sort all.tags > temp.tags

mv temp.tags all.tags

rm -f c.tags h.tags 

将上述代码放入 .sh 文件并运行...这肯定会生成您的标签。

于 2016-04-25T08:04:16.087 回答
1

如果您为每个项目生成一个标签文件,您可能会喜欢这种模式,特别是如果您.vimrc在不同的机器上共享您的:

let repohome=substitute($REPO_HOME, "\/", "\\\\/", "g")                         
let &tags=substitute(expand("%:p:h"), "\\(".repohome."/.\\{-}\/\\).*", "\\1tags", "")

然后,您必须将环境变量 $REPO_HOME 在您.bashrc的主 repo 目录中设置为没有尾随空格(例如/home/<yourusername>/repos),它会自动在 $REPO_HOME 的每个子目录中查找深度为 1 的标签文件,例如/home/<yourusername>/repos/myproj/tags

于 2013-09-16T14:56:40.877 回答
0

使用以下代码创建一个 .sh 文件。并在你想要标签的地方运行 .sh 文件。这肯定会奏效。

#!/bin/sh`enter code here`
filelist=`mktemp`
find . -name \*.h >> ${filelist}
find . -name \*.c >> ${filelist}
find . -name \*.cc >> ${filelist}
find . -name \*.cpp >> ${filelist}
find . -name \*.hpp >> ${filelist}
if [ "$SDKTARGETSYSROOT" != "" ]; then
find $SDKTARGETSYSROOT/usr/include -name \*.h >> ${filelist}
fi
cat ${filelist} | ctags -L -
于 2020-10-01T04:14:22.477 回答