Vim:设置 ctag 很困难。子目录中的源在项目根目录中看不到标签文件

发布于 2024-10-18 05:20:14 字数 407 浏览 8 评论 0原文

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

cd myproj
ctags -R

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

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

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

谢谢。

I'm trying to get setup with (exuberant) ctags on Vim today and am having difficulty getting it to work properly. I generate my ctags file on the command line with with:

cd myproj
ctags -R

This puts the tags file in myproj root. However, Vim only seems to read from this tags file when I'm working on source that reside in root. As I navigate to deeper directories, if I try to jump to a tag using <C-]>, I get:

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

I've verified that MyClassName does have a tag in the tags file, it's just that Vim doesn't see it. Can someone please explain how to configure Vim to reference the root's tags file?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

爱的故事 2024-10-25 05:20:14

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

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

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

add this to .vimrc file set tags=tags;/

This will check the current folder for tags file and keep going one directory up all the way to the root folder.

So you can be in any sub-folder in your project and it'll be able to find the tags files.

小梨窩很甜 2024-10-25 05:20:14

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

我使用以下配置:

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

摘自帮助:

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

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

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

使用 :pwd 然后使用 :cd myproj (在 Vim 内)转到包含标签文件的目录。

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

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

There is an option to tell Vim where to look for tag file.

I use the following configuration:

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

Extract from help :

When a tag file name starts with "./", the '.' is replaced with the path of
the current file. This makes it possible to use a tags file in the directory
where the current file is (no matter what the current directory is). The idea
of using "./" is that you can define which tag file is searched first: In the
current directory ("tags,./tags") or in the directory of the current file
("./tags,tags").

For example:
:set tags=./tags,tags,/home/user/commontags

And I keep my current working directory in the top project directory where my tagsfile is generated.

Use :pwd and then :cd myproj (inside Vim) to go to the directory containing your tags file.

See :help tags-option for more information on tags path.

You issue is probably that you are either in the wrong directory, or your tags option is not properly set.

焚却相思 2024-10-25 05:20:14
#!/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 文件中并运行...这肯定会生成您的标签。

#!/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 

Put the above code in a .sh file and run... This will generate your tags for sure.

檐上三寸雪 2024-10-25 05:20:14

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

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

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

If you generate a tags file for every project, you might like this pattern, especially if you share your .vimrc across different machines:

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

You would then have to set the environment variable $REPO_HOME in your .bashrc to your main repo directory without the trailing space (e.g. /home/<yourusername>/repos) and it will automatically look for a tags file in each subdirectory of $REPO_HOME with a depth of 1, e.g. /home/<yourusername>/repos/myproj/tags.

玩心态 2024-10-25 05:20:14

使用以下代码创建一个 .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 -

Create a .sh file with below code. And run .sh file where you want tags.
That will work for sure.

#!/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 -
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文