Исключение каталогов в Exuberant CTags

Я работаю с очень большой кодовой базой и считаю полезным избирательно выбирать, какие каталоги включать для использования с Exuberant Ctags.

Параметр --exclude хорошо работает, чтобы исключить отдельные имена файлов и каталогов (с подстановочными знаками), но я не могу понять, как заставить его исключать шаблоны путей, содержащие более одного каталога.

Например, я могу захотеть исключить каталог tests, но только при обработке thirdparty\tests (под Windows). Проблема в том, что если я просто использую --exclude=tests, я исключаю слишком много каталогов, включая тестовый каталог в коде, над которым я активно работаю.

Вот некоторые вещи, которые я пробовал:

--exclude=thirdparty\tests
--exclude=thirdparty\\tests
--exclude=*\thirdparty\tests
--exclude=*\\thirdparty\\tests
--exclude=thirdparty/tests

Ctags молча игнорирует все это, о чем свидетельствует проверка файла тегов.

Как я могу исключить каталог, только если ему предшествует данный родительский каталог?

ДОБАВЛЕН:

Вот мой вывод ctags --version:

Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul  9 2009, 17:05:35
  Addresses: <[email protected]>, http://ctags.sourceforge.net
  Optional compiled features: +win32, +regex, +internal-sort

person Codie CodeMonkey    schedule 19.11.2011    source источник
comment
ctags --version показывает +wildcards в выводе?   -  person sarnold    schedule 19.11.2011
comment
@sarnold: Хм, нет! Итак, вы думаете, что один из *\thirdparty\tests сработал бы, если бы у меня был такой вариант?   -  person Codie CodeMonkey    schedule 19.11.2011
comment
Да, наверное, да, но я не знаю, как добиться поддержки подстановочных знаков в Windows. (Установки /bin/sh при компиляции может быть достаточно.)   -  person sarnold    schedule 19.11.2011
comment
Первоначально я ответил на ваш вопрос, как будто вы хотели исключить только несколько каталогов. Я думаю, вам лучше всего использовать параметр --exclude, чтобы использовать файл с именами каталогов, которые вы хотите исключить. это в руководстве, я думаю, все, что вам нужно сделать, это поставить @ перед именем файла   -  person Will    schedule 19.02.2013
comment
@Will: Спасибо, это было давно, но я думаю, что написал скрипт Python для фильтрации именно так, как мне нужно, записал это в файл и использовал @, как вы упомянули.   -  person Codie CodeMonkey    schedule 20.02.2013
comment
В руководстве также отмечается, что подстановочные знаки следует заключать в кавычки, если они поддерживаются (в противном случае оболочка их расширяет).   -  person Sam Brightman    schedule 24.02.2015
comment
Возможный дубликат Как исключить несколько каталогов с Exuberant ctags?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 16.10.2017
comment
@CiroSantilli刘晓波死六四事件法轮功, обратите внимание, что этот вопрос был задан первым. Другой вопрос - дубликат.   -  person Codie CodeMonkey    schedule 25.10.2017
comment
@CodieCodeMonkey привет, Коди, текущий консенсус заключается в том, чтобы закрыть по качеству: meta.stackexchange.com/questions/147643/ Поскольку качество не измеримо, я просто голосую за. ;-) Скорее всего, все сводится к тому, какой вопрос попал в заголовки лучших новых ключевых слов Google.   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 25.10.2017


Ответы (3)


В какой-то момент может быть проще определить список файлов, которые вы хотите проиндексировать; сохраните этот список в файл и используйте ctags -L <filename> для индексации только избранных.

Это позволяет вам использовать find(1) для удаления каталогов, которые вы не хотите индексировать, например:

find . -path ./Documentation -prune -o -print > indexme

пропустит все файлы во всех подкаталогах ./Documentation.

person sarnold    schedule 19.11.2011
comment
Однако вам потребуется версия find для Windows. - person Martijn; 19.11.2011
comment
Или соберите что-нибудь достаточно хорошее, если find(1) слишком сложно портировать. Вам действительно нужен только список имен файлов, а не полная функциональность find(1). - person sarnold; 19.11.2011
comment
+1 это хорошее предложение, я могу использовать инструмент для создания списка нужных мне каталогов, что даст мне больше возможностей фильтрации, чем те, о которых я просил. Сегодня я слишком ленив. :-) - person Codie CodeMonkey; 19.11.2011
comment
Ленивый — это хорошо; это заставляет вас искать новые пути решения проблем. :) - person sarnold; 19.11.2011
comment
Может ли кто-нибудь сделать нуб шаг за шагом этого процесса? Tnx - person Jose Browne; 03.01.2013
comment
@JoseBrowne: я думаю, что консенсус заключается в использовании двухэтапного процесса: сначала запустите инструмент для создания файла для использования ctags, затем запустите ctags и сошлитесь на этот файл. Выбор инструментов остается за вами. Если вы создаете список файлов для включения, вы можете использовать параметр -L, как предложил Сарнольд, или, если вы создаете список параметров, в частности --exclude options, вы можете использовать ctags @‹file› для чтения этих параметров. как если бы вы набрали их все в командной строке. - person Codie CodeMonkey; 20.02.2013
comment
Я предпочитаю find . -type f -not -path './Documentation/*', потому что он более интуитивно понятен и менее запутан. - person blockloop; 07.10.2014

ack -f | ctags -L -

ack отобразит исходные файлы в данном каталоге. Вы можете ограничить область действия определенным языком с помощью ack -f --ruby или ack -f --type=ruby. Вы также можете исключить каталоги с помощью --ignore-dir.

Используйте ack --dump, чтобы увидеть встроенные типы файлов для ack.

person name    schedule 10.06.2014
comment
Это качается. Это никогда не приходило мне в голову. - person Brian Ledsworth; 12.12.2014
comment
Отличный ответ. Я использовал git ls-files | ctags -L - - person zzxyz; 17.07.2018

ctags -R --exclude=сторонний/тест/**

используйте dir/** исправить мой случай

person Neo li    schedule 04.06.2021