【问题标题】:How to generate ctags for google protobuf如何为 google protobuf 生成 ctags
【发布时间】:2024-08-18 04:15:02
【问题描述】:

我的源代码有一些 protobuf 文件,例如 common.proto。

看起来 ctags 不会为消息生成标签。如何为消息生成标签,以便搜索消息中存在的字段。

【问题讨论】:

    标签: indexing protocol-buffers protobuf-net ctags cscope


    【解决方案1】:

    Universal-ctags (https://ctags.io) 支持 protobuf。

    $ cat input.proto
    package TestPackage;
    
    message Message1 {
        required string field1 = 1 [default="; required string thisIsNotAField = 1;"];
        //optional string commentedField2 = 2;
        /* optional string commentedField3 = 3; */
    }
    
    message Message2 {
        message NestedMessage {
            required string field2 = 2;
        }
    
        enum Enum1 {
            YES = 1;
            NO = 2;
        }
    
        repeated NestedMessage field3 = 3;
        optional Enum1 field4 = 4;
    }
    
    message Message3 {
        required Message2.NestedMessage field5 = 5;
        required .TestPackage.Message2.Enum1 field6 = 6;
    
        extensions 7 to 8;
    }
    
    extend Message3 {
        optional Message2 . NestedMessage field7 = 7;
        repeated int32 field8 = 8 [packed=true];
    }
    
    service Service1 {
        rpc Method1(Message1) returns(Message2);
    }
    
    $ ./ctags -o - input.proto
    Enum1   Units/simple-protobuf.d/input.proto /^    enum Enum1 {$/;"  g
    Message1    Units/simple-protobuf.d/input.proto /^message Message1 {$/;"    m
    Message2    Units/simple-protobuf.d/input.proto /^message Message2 {$/;"    m
    Message3    Units/simple-protobuf.d/input.proto /^message Message3 {$/;"    m
    NO  Units/simple-protobuf.d/input.proto /^        NO = 2;$/;"   e
    NestedMessage   Units/simple-protobuf.d/input.proto /^    message NestedMessage {$/;"   m
    Service1    Units/simple-protobuf.d/input.proto /^service Service1 {$/;"    s
    TestPackage Units/simple-protobuf.d/input.proto /^package TestPackage;$/;"  p
    YES Units/simple-protobuf.d/input.proto /^        YES = 1;$/;"  e
    field1  Units/simple-protobuf.d/input.proto /^    required string field1 = 1 [default="; required string thisIsNotAField = 1;"];$/;"    f
    field2  Units/simple-protobuf.d/input.proto /^        required string field2 = 2;$/;"   f
    field3  Units/simple-protobuf.d/input.proto /^    repeated NestedMessage field3 = 3;$/;"    f
    field4  Units/simple-protobuf.d/input.proto /^    optional Enum1 field4 = 4;$/;"    f
    field5  Units/simple-protobuf.d/input.proto /^    required Message2.NestedMessage field5 = 5;$/;"   f
    field6  Units/simple-protobuf.d/input.proto /^    required .TestPackage.Message2.Enum1 field6 = 6;$/;"  f
    field7  Units/simple-protobuf.d/input.proto /^    optional Message2 . NestedMessage field7 = 7;$/;" f
    field8  Units/simple-protobuf.d/input.proto /^    repeated int32 field8 = 8 [packed=true];$/;"  f
    

    【讨论】: