Ctags patched

В оригинальной версии ctags 5.8 есть очень неприятный косяк. Рассмотрим на примере.

Допустим, у нас есть два файла: "one.c" и "two.c"

one.c:

typedef struct {
int iOne;
int iTwo;
} T_MyStruct1;

two.c:

typedef struct {
long lLong1;
long lLong2;
long lLong3;
} T_MyStruct2;

Я индексирую их такой командой: 

ctags -f tags ./one.c ./two.c

тогда содержимое файла tags будет:

T_MyStruct1 ./one.c /^} T_MyStruct1;/;" t typeref:struct:__anon1 file:
T_MyStruct2 ./two.c /^} T_MyStruct2;/;" t typeref:struct:__anon2 file:
iOne ./one.c /^ int iOne;$/;" m struct:__anon1 file:
iTwo ./one.c /^ int iTwo;$/;" m struct:__anon1 file:
lLong1 ./two.c /^ long lLong1;$/;" m struct:__anon2 file:
lLong2 ./two.c /^ long lLong2;$/;" m struct:__anon2 file:
lLong3 ./two.c /^ long lLong3;$/;" m struct:__anon2 file:

Тут, как видно, все правильно. А если я буду индексировать их по-отдельности, с ключом -a (append), то есть такими командами:

ctags -f tags ./one.c
ctags -a -f tags ./two.c

Тогда содержимое файла tags будет таким:

T_MyStruct1 ./one.c /^} T_MyStruct1;/;" t typeref:struct:__anon1 file:
T_MyStruct2 ./two.c /^} T_MyStruct2;/;" t typeref:struct:__anon1 file:
iOne ./one.c /^ int iOne;$/;" m struct:__anon1 file:
iTwo ./one.c /^ int iTwo;$/;" m struct:__anon1 file:
lLong1 ./two.c /^ long lLong1;$/;" m struct:__anon1 file:
lLong2 ./two.c /^ long lLong2;$/;" m struct:__anon1 file:
lLong3 ./two.c /^ long lLong3;$/;" m struct:__anon1 file:

Смотрите: члены обоих структур смешались в одну стуктуру __anon1. Это косяк.

На первый взгляд - чего такого? - значит, надо просто индексировать файлы одной командой, и все будет хорошо.
Все, действительно, так, пока длина команды не превышает максимально допустимый размер команды ОС. Для Windows XP, например, это 8192 байта, для современных дистрибутивов Linux - больше двух миллионов.

Я столкнулся с этим, когда делал свой плагин Indexer для Vim. Плагин генерирует теги для всех файлов проекта. Так вот, если в проекте около 200 файлов, то в Windows мой плагин уже не работал, т.к. команда получалась слишком длинной. А если попытаться проиндексировать какой-то очень большой проект, то и линуксовых двух миллионов не хватало. Поэтому пришлось написать патч для ctags.

Патченая версия ctags 5.8.1 именует анонимные структуры другим образом: "__anon_<имя_файла>_<номер_строки>".

Вы можете скачать: 

Linux source (gzipped): ctags-5.8.1.tar.gz
Patch for version 5.8: patch_ctags_581.patch
Windows binary: ctags.zip