Vim:难以设置ctags。子目录中的源不会在项目根目录中看到标记文件

时间:2011-02-16 14:16:58

标签: vim ctags

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

cd myproj
ctags -R

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

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

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

感谢。

5 个答案:

答案 0 :(得分:112)

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

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

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

答案 1 :(得分: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选项未正确设置。

答案 2 :(得分:1)

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

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

然后,您必须将.bashrc中的环境变量$ REPO_HOME设置为主要仓库目录,而不用结尾空格(例如/home/<yourusername>/repos),它会自动显示对于深度为1的$ REPO_HOME的每个子目录中的标签文件,例如/home/<yourusername>/repos/myproj/tags

答案 3 :(得分:1)

#!/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文件中并运行...这将确保生成您的代码。

答案 4 :(得分: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 -