1

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

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

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

它在我的标签文件中生成以下行(使用 default --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 标签文件并自己处理结果,但对于一个非常大的文件,这将是昂贵的,我希望有一种内置的方式来获取这些基本信息。

4

1 回答 1

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属性。
于 2013-06-23T20:08:39.220 回答