Как объединить несколько инструментов, похожих на теги 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).