了解“ctags-e”文件格式(用于emacs的ctags)

了解“ctags-e”文件格式(用于emacs的ctags),c,emacs,ctags,etag,C,Emacs,Ctags,Etag,我使用的是“ExuberantCtags”,也称为“ctags-e”,也称为“etags” 我试图理解etags命令生成的标签文件格式,特别是我想理解标签文件的第2行 第2行是这样描述的: {src_file},{size_of_tag_definition_data_in_bytes} 实际上,虽然“foo.c”的标记文件行:2如下所示 foo.c,1683 我的困惑是它到底是如何找到这个数字的:1683 我知道这是“tag_定义”的大小,所以我想知道的是 “标签定义” 我已经试着看了一遍

我使用的是“ExuberantCtags”,也称为“ctags-e”,也称为“etags”

我试图理解etags命令生成的标签文件格式,特别是我想理解标签文件的第2行

第2行是这样描述的:

{src_file},{size_of_tag_definition_data_in_bytes}
实际上,虽然“foo.c”的标记文件行:2如下所示

foo.c,1683
我的困惑是它到底是如何找到这个数字的:1683

我知道这是“tag_定义”的大小,所以我想知道的是 “标签定义”

我已经试着看了一遍,但也许C语言比我好的人会更成功地理解这一点

谢谢

编辑#2:

好的,如果我理解正确的话,“79”指的是标签文件中的字节数,从79到91^J

这很有道理

现在这个例子中的数字20,59,91是指{byte_offset}

{byte_offset}的偏移量是多少


谢谢你的帮助,肯

它是编号后换行符后标记数据的字节数

编辑:文件标记数据之间也不包含^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
以下是以十六进制显示的相同文件:

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
本例中有两组标记数据: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个字节。

标记项的{byte_offset}是从定义函数的文件开始的字节数。字节偏移量之前的数字是行号。在您的示例中:

hello.c,79^J
float foo (float x) {^?foo^A3,20^J
foo函数从hello.c的开头开始20个字节。您可以使用显示光标在文件中位置的文本编辑器来验证这一点。您还可以使用Unix tail命令在以下位置显示一个字节数的文件:

tail -c +20 hello.c

谢谢,但是现在我有另一个问题,但是我会把它放在主要的帖子里。非常感谢你的帮助,这很有意义,但是{bytes_offset}是什么?我已将编辑内容更新到主要帖子。
tail -c +20 hello.c