理解`ctags -e`文件格式(emacs的ctags)

Ale*_*bas 5 c emacs etag ctags

我正在使用"ExuberantCtags",也被称为"ctags -e",也被称为"etags"

我试图理解由etags命令生成的TAGS文件格式,特别是我想了解TAGS文件的第2行.

维基百科说第2行描述如下:

{src_file},{size_of_tag_definition_data_in_bytes}
Run Code Online (Sandbox Code Playgroud)

实际上虽然TAGS文件行:2为"foo.c"看起来像这样

foo.c,1683
Run Code Online (Sandbox Code Playgroud)

我的窘境是它究竟是如何找到这个数字的:1683

我知道它是"tag_definition"的大小所以我想知道的是什么是"tag_definition"?

我试过通过ctags源代码查看,但也许在C比我更好的人会有更多的成功来解决这个问题.

谢谢!

编辑#2:

^L^J
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
float bar () {^?bar^A7,59^J
int main() {^?main^A11,91^J
Run Code Online (Sandbox Code Playgroud)

好吧,如果我理解正确,"79"指的是TAGS文件中从79下降到包括"91 ^ J"的字节数.

有一个完美的感觉.

现在维基百科这个例子中的数字20,59,91表示引用{byte_offset}

什么是{byte_offset}偏移量?

谢谢你们所有的帮助!

Ken*_*Fox 5

它是数字后换行符之后的标记数据的字节数.

编辑:它还不包括文件标签数据之间的^ L字符.记住etags来自很久以前读取500KB文件是一项昂贵的操作.;)

这是一个完整的标签文件.我用两种方式展示它,第一种是控制字符为^ X而没有不可见的字符.您的示例中隐含的行尾字符在这里是^ J:

^L^J
hello.cc,45^J
int main(^?5,41^J
int foo(^?9,92^J
int bar(^?13,121^J
^L^J
hello.h,15^J
#define X ^?2,1^J
Run Code Online (Sandbox Code Playgroud)

这是以十六进制显示的相同文件:

0000000    0c  0a  68  65  6c  6c  6f  2e  63  63  2c  34  35  0a  69  6e
          ff  nl   h   e   l   l   o   .   c   c   ,   4   5  nl   i   n
0000020    74  20  6d  61  69  6e  28  7f  35  2c  34  31  0a  69  6e  74
           t  sp   m   a   i   n   ( del   5   ,   4   1  nl   i   n   t
0000040    20  66  6f  6f  28  7f  39  2c  39  32  0a  69  6e  74  20  62
          sp   f   o   o   ( del   9   ,   9   2  nl   i   n   t  sp   b
0000060    61  72  28  7f  31  33  2c  31  32  31  0a  0c  0a  68  65  6c
           a   r   ( del   1   3   ,   1   2   1  nl  ff  nl   h   e   l
0000100    6c  6f  2e  68  2c  31  35  0a  23  64  65  66  69  6e  65  20
           l   o   .   h   ,   1   5  nl   #   d   e   f   i   n   e  sp
0000120    58  20  7f  32  2c  31  0a                                    
           X  sp del   2   ,   1  nl
Run Code Online (Sandbox Code Playgroud)

在这个例子中有两组标签数据:hello.cc的45字节数据和hello.h的15字节.

hello.cc数据从"hello.cc,45 ^ J"后的行开始,运行45个字节 - 这也恰好是完整的行.给出字节的原因是读取文件的代码只能为45字节字符串分配空间并读取45字节."^ L ^ J"行位于45个字节的标签数据之后.您可以将其用作标记,以便剩余更多文件,并验证文件格式是否正确.

hello.h数据从"hello.h,15 ^ J"后的行开始,运行15个字节.


Ken*_*Fox 5

标记条目的{byte_offset}是从定义函数的文件的开头起的字节数.字节偏移之前的数字是行号.在你的例子中:

hello.c,79^J
float foo (float x) {^?foo^A3,20^J
Run Code Online (Sandbox Code Playgroud)

foo函数从hello.c开始的20个字节开始.您可以使用文本编辑器验证该文件,该文本编辑器显示文件中的光标位置.您还可以使用Unix tail命令在多个字节中显示文件:

tail -c +20 hello.c
Run Code Online (Sandbox Code Playgroud)