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:

値を指定fruitまたはfruit_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 に答える