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}偏移量?
谢谢你们所有的帮助!
它是数字后换行符之后的标记数据的字节数.
编辑:它还不包括文件标签数据之间的^ 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个字节.
标记条目的{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)