tags有什么用?
我知道的用途只有两个。一个是根据tag来跳转,一个是根据tag来自动补齐
关于自动补齐的一些说明?
tags的自动补齐实际上是通过vim的omni completion(即ctrl-x,ctrl-o)来实现的。现在还有一种更强大的补齐方式(即clang),这种通过User defined completion(即ctrl-x,ctrl-u)来实现的
两种补齐方式官方文档如下:
https://www.vim.org/scripts/script.php?script_id=2358
https://www.vim.org/scripts/script.php?script_id=3302
下面重点说下ctags的常用选项
--list-maps(列出所有语言和文件后缀的映射关系,即什么样的文件被认为是什么样的语言)
--list-kinds=c(列出指定语言的所有tag类型。注意,有些类型默认是关闭的)
--links=yes(沿着软连接走下去,默认yes,不用理它)
--file-scope=yes(文件范围的tag也打进去,默认yes,不用理它)
--langmap=c:+.h(改变默认的语言映射关系。.h默认映射到c++)
--languages=c,c++(只对特定语言的文件打tag。就是说你输入的这些文件,如果被判定不是指定语言,是不会进行处理的)
--c-kinds=+p(开启c语言的函数原型tag类型。自动补齐需要)
--c++-kinds=+p(开启c++语言的函数原型tag类型。自动补齐需要)
--fields=+iaS(每个tag,给出更详细的信息。自动补齐需要)
--extra=+q(即qualified fileds,也打上tag。自动补齐需要)
-I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__(忽略这些关键字,不然有些c函数没法识别)
--exclude=c++(打tag的时候,忽略指定的目录或者文件)
-L project.files(把要打tag的文件列表写入project.files文件)
-f ~/mytags/cpp(指定tags的文件名称)
-R(对目录递归执行)
标准c++ tags
1 下载cpp_src源码(https://www.vim.org/scripts/script.php?script_id=2358)
2 ctags --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -R -f ~/mytags/cpp ~/cpp_src
标准c tags
ctags -I __THROW -I __attribute_pure__ -I __nonnull -I __attribute__ \
--langmap=c:+.h --languages=c \
--c-kinds=+p --fields=+iaS --extra=+q \
-f ~/mytags/systags \
/usr/include/*.h \
/usr/include/sys/*.h
/usr/include/netinet/*.h
头文件目录,根据需求自己加。我不喜欢用-R /usr/include(没用的符号太多)
也可以选择用-L tmp.txt这种方式,下面是自动生成tmp.txt的方法
ls -lh /usr/include | grep '^d' | awk '{print $9}' | sed -E 's#(.*)#/usr/include/&/*.h#' | sed '1i /usr/include/*.h' > tmp.txt
Project tags
ctags --c-kinds=+p --c++-kinds=+p --fields=+iaS --extra=+q --languages=c,c++ -R ./
网友评论