Как объединить несколько инструментов, похожих на теги ctags?

Ctags является наиболее известным инструментом тегов. Тем не менее, у ctags есть некоторые недостатки, и есть несколько лучших вариантов, варьирующихся от целевых языков к языкам.

Например, для Ruby я предпочитаю использовать теги ripper. А для JavaScript люди часто используют jsctags. Также есть что-то вроде CoffeeTags.

Итак, мой вопрос, как интегрировать или объединить эти инструменты? Можно ли написать сценарий оболочки (или что-то еще), например: omni-tagsтак что я могу использовать omni-tags для всех видов файлов. И это будет автоматически вызывать различные теги инструментов в зависимости от типов файлов?

Иногда в проектах существует несколько типов файлов, поэтому будет удобнее, если мы сможем использовать унифицированный инструмент для генерации тегов.

Благодарю.

1 ответ

Решение

Ваша гипотетическая omni-tags Команду легко реализовать в оболочке или на любом языке сценариев (Perl, Python, Ruby и т. д.), если вы имеете дело только с проектами с одним конкретным видом исходного кода. Просто рекурсивно сканируйте каталог проекта, ищите преобладающий тип файла в нем (сопоставляя расширения файлов или используя Unix file программа), а затем запустить программу генерации тегов, связанную с этим конкретным видом исходного файла.

Это будет сложнее, но не невозможно, если у вас есть проект, содержащий код на нескольких языках. Одним из примеров будет Ruby gem, содержащий оба Ruby .rb исходные файлы и некоторые .c а также .h файлы, реализующие собственное расширение C. В этом случае файлы Ruby и C обычно довольно четко разделены - т. Е. Одно дерево каталогов в корневом каталоге gem - это все Ruby, а другое - C. omni-tags может быть написано, чтобы распознать этот случай и запустить ctags на .c а также .h файлы и ripper-tags на .rb файлы. Поскольку большинство редакторов могут объединять несколько файлов тегов в одном проекте (по крайней мере, я знаю, что Emacs может), вы сможете перемещаться между символами, определенными в источнике C и используемыми в источнике Ruby (например).

Самым хитрым будет то, как работать с базами кода, где смешаны несколько языков, которые вы хотите пометить. Для вашего примера JavaScript, вероятно, у вас есть каталог, содержащий файлы JavaScript и CoffeeScript, например? В этом случае omni-tags Необходимо запустить инструмент, соответствующий каждому языку в каждом исходном файле. Если инструменты генерации тегов написаны так, чтобы игнорировать любой файл неправильного типа, вы можете просто запустить каждый из корневого каталога вашего проекта, а затем снова использовать редактор, который объединяет несколько файлов тегов. Если инструментам нужно подавать только нужные файлы, то omni-tags Необходимо создать индекс файлов, о которых идет речь, а затем передать имена только правильных файлов для каждого инструмента. Это не невозможно, но потребует немного больше работы (в отличие от простейшего случая, описанного в первом абзаце, который, вероятно, выполним примерно в 10 строках Python или Ruby).

Другие вопросы по тегам