我正在尝试今天在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的标签文件吗?
感谢。
答案 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 -