从ctags文件中提取枚举值

时间:2013-06-22 21:32:25

标签: c vim ctags

是否可以使用带有Vim的ctags来提取给定枚举的所有枚举值?

例如,如果我有以下枚举类型:

typedef enum fruit {
    APPLE,
    ORANGE,
    PEAR,
} fruit_t;

在我的代码文件中生成以下行(使用默认--c-kinds):

APPLE   minex.c /^    APPLE,$/;"    e   enum:fruit  file:
ORANGE  minex.c /^    ORANGE,$/;"   e   enum:fruit  file:
PEAR    minex.c /^    PEAR,$/;" e   enum:fruit  file:
fruit   minex.c /^typedef enum fruit$/;"    g   file:
fruit_t minex.c /^    } fruit_t;$/;"    t   typeref:enum:fruit  file:

有没有办法指定fruitfruit_t并获取值[ 'APPLE', 'ORANGE', 'PEAR' ]

在Vim中我曾希望:tselect fruit可以做到这一点,但事实并非如此。

当然我可以grep标签文件并自己处理结果,但对于一个非常大的文件,这将是昂贵的,我希望有一种内置的方式来获取这些基本信息。

1 个答案:

答案 0 :(得分:3)

是的,您可以通过过滤taglist()函数的结果,这样可以方便地以编程方式访问标记数据库。

:echo map(filter(taglist('.*'), 'has_key(v:val, "enum") && v:val.enum ==# "fruit"'), 'v:val.name')
['APPLE', 'ORANGE', 'PEAR']

这是做什么的:

  1. 获取所有标记(.*正则表达式)
  2. 保留(filter())所有包含(has_key()enum属性且其名称正好(==#fruit的标记。
  3. 从结果对象中,仅选择map()属性(name)。