了解“ctags-e”文件格式(用于emacs的ctags)
我使用的是“ExuberantCtags”,也称为“ctags-e”,也称为“etags” 我试图理解etags命令生成的标签文件格式,特别是我想理解标签文件的第2行 第2行是这样描述的:了解“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_定义”的大小,所以我想知道的是 “标签定义” 我已经试着看了一遍
{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