Использование нескольких файлов тегов одновременно в vim / Организация тегов в целом

(Извините за тег C, я сделал это для подсветки синтаксиса. Это больше вопрос vim. Если кто-то более знающий, чем я, думает, что тег следует удалить, пожалуйста, сделайте это)

Скажем, у меня есть эта структура каталогов:

Directory ~/Code/Test/     containing file1.c file2.c file4.c and Sub 
Directory ~/Code/Test/Sub/ containing file3.c

файл1.с:

#include <stdio.h>
#include "file2.c"
#include "Sub/file3.c"

void function1();

int main (int argc, char *argv[]) {
   function1();
   function2();
   function3();
   return 0;
}

void function1() {
   printf("1\n");
}

файл2.с:

#include <stdio.h>

void function2();

void function2() {
   printf("2\n");
}

Sub/file3.c:

#include "../file4.c"

void function3();

void function3() {
   printf("3\n");
   function4();
}

файл4.с:

#include <stdio.h>

void function4();

void function4() {
   printf("4\n");
}

В любом из этих файлов должна быть возможность перейти к определению функций, которые он использует, из других файлов. Так, например, файл1 должен иметь возможность перейти к файлу2, файл1 должен иметь возможность перейти вниз по каталогу к файлу3, файл3 должен иметь возможность перейти вверх по каталогу к файлу4, и вот кикер; все файлы должны иметь возможность перейти к определению printf. Мне также не нужно копировать теги для реализации библиотеки c в каталог Test, чтобы сделать это.

Мне интересно, как я могу это сделать. Я действительно не увлекаюсь монолитными файлами тегов. Меня ужасает наличие файла тегов для всего vim. Файл тегов для каждого каталога меня раздражает. Файл тегов для каждого проекта допустим. Но что мне действительно нужно, так это файл тегов для каждого исходного файла, а затем способ указать, на какие файлы тегов должен ссылаться vim.

В идеале я хотел бы иметь возможность просто нажимать ctrl-] на что угодно, а vim переходить к правильному определению в зависимости от области действия, как в Visual Studio. Я начинаю подозревать, что это невозможно сделать, и если это возможно (с помощью какой-либо комбинации плагинов), это будет очень медленно, что действительно раздражает, потому что я был полностью уверен, что «Vim может делать все, что могут ваши новомодные IDE. Подножка на пару недель есть. Да, это определенно самый мощный текстовый редактор, с которым я когда-либо сталкивался, но как IDE он крайне несовершенен. Когда я использую команду «Перейти к определению», я ожидаю перехода к правильному определению, будь то локальная переменная, в другом файле, в стандартной библиотеке и т. д. До сих пор Vim давал мне веселые результаты, такие как переход от java-файл в ac-файл. И вам нужно использовать отдельную команду, чтобы перейти к определению локальной переменной... Что? (Если есть причина этого, мне было бы интересно узнать)

Мне известно, что я взломал set tags=./tags в моем .vimrc, и это то, что я сделал до сих пор. Но это не будет масштабироваться, если я работаю над чем-то большим, что связывает отдельные сборки и исходные файлы из отдельных проектов вместе.

(Чтобы быть справедливым по отношению к vim, Visual Studio также не позволяет вам переходить между сборками для поиска определений, но, по крайней мере, у него есть изящество для обслуживания файла заголовка, из которого вы можете «загрузить сборку» и перейти к фактическому исходный код, который вы ищете)


person TheIronKnuckle    schedule 27.06.2013    source источник
comment
возможный дубликат Можно ли заставить ctags следовать директивам #include?   -  person Matthew Mellott    schedule 27.06.2013
comment
Я предлагаю вам не заниматься ctags вручную, а вместо этого использовать плагин Indexer ( www.vim.org/scripts/script.php?script_id=3221 ). Он обеспечивает безболезненную автоматическую генерацию тегов для одного или нескольких проектов и поддерживает актуальность тегов.   -  person Dmitry Frank    schedule 27.06.2013


Ответы (1)


Перво-наперво: Vim никогда не был, не является и, вероятно, никогда не будет достойной альтернативой IDE. Тот, кто заставил вас поверить в это, должен быть расстрелян, и вы должны быть расстреляны. слишком для того, чтобы верить в такую ​​ерунду.

Я только полушутя.

Vim — очень мощный текстовый редактор, ориентированный на программирование, но тот простой факт, что вам нужно запустить тупой внешний индексатор кода, чтобы получить тупой «переход к определению», или другой индексатор кода, чтобы получить еще один тупой «переход к использованию», должен быть подсказкой. что Vim нельзя сравнивать с IDE. Подсказка: I в IDE означает "Интегрированный", а E означает "Среда". Поскольку вы не можете получить надлежащую интеграцию и вам будет трудно рассматривать Vim как среду, здесь нет IDE. Только текстовый редактор с множеством подключаемых модулей, делающих разные вещи по-разному, и, прежде всего, без серьезного способа понимать ваш код, который является функцией № 1 любой IDE.

Многие пользователи/блогеры утверждают, что они используют «Vim как IDE» или что вы также можете превратить Vim в Python или любую другую IDE, но правда в том, что Vim не хватает всех низкоуровневых функций, которые сделали бы это возможным. Вы можете превратить его во что-то, что выглядит как IDE, если вы каким-то образом способны поверить в собственную ложь, но, вероятно, это никогда не будет IDE.

Что бы ни…

  • Поведение по умолчанию (которое нельзя изменить в вашей конфигурации) <C-]> или :tag foo заключается в переходе к первому совпадению в ваших tags файлах. Ни Vim, ни Ctags не знают об области видимости. В лучшем случае вас могут угостить списком, из которого можно выбрать правильный тег (:ts foo или g]), но это то, насколько далеко вы можете зайти.

    В зависимости от языков, с которыми вы работаете, Cscope может лучше индексировать ваш код, но общий принцип тот же, что и с Ctags. Cscope предлагает функцию «перехода к использованию», поэтому, возможно, стоит переключиться только на нее.

  • Убедиться, что используются правильные файлы tags, может быть непросто, и документ на удивление не очень полезен в этом отношении. Есть куча плагинов, разработанных для упрощения, которые вы можете попробовать. На ум приходит EasyTags.

    Я признаю, что не работаю над очень большими проектами, и даже не на C, поэтому, возможно, это не покажется полезным, но эта строка в моем ~/.vimrc упрощает работу с tags:

    set tags=./tags;/,tags;/
    

    С этой настройкой Vim ищет вверх и вниз (не рекурсивно) до / для tags файлов. Суть этого заключается в том, чтобы иметь один файл tags в корне каждого из моих проектов, который можно использовать из каждого файла в этом проекте без необходимости указывать Vim, где искать файл tags.

    Один из способов справиться с путаницей Java/C может состоять в том, чтобы поместить ваши проекты в языковые каталоги:

    C/
      c.tags
      proj1/
        tags
        …
      proj2/
        tags
        …
    Java/
      j.tags
      proj3/
        tags
        …
      proj4/
        tags
        …
    

и поместите «глобальные» файлы tags в их корень, а файлы tags для конкретных проектов — в корень соответствующих проектов.

Другим способом решения этой проблемы может быть указание Vim загружать определенные файлы tags в зависимости от типа файла:

    autocmd FileType c setlocal tags=/path/to/your/global/c/tags,./tags;/,tags;/
person romainl    schedule 27.06.2013
comment
Почувствуйте, как через вас течет ненависть... нет, но серьезно, с правильным набором плагинов вы обычно можете получить всю функциональность, которую вы на самом деле ХОТИТЕ от IDE, без всего этого раздувания и прочего, что вам не нужно. С IDE вы получаете все или ничего. С помощью VIM вы можете создать IDE с именно теми функциями, которые вам нужны. Лучшая часть? Если нет плагина, который делает то, что вы хотите, не так уж сложно написать свой собственный. - person eeeeaaii; 07.08.2014
comment
@eeeeaaii, вы можете полагать, что ваш Vim и все ваши плагины вместе образуют IDE. Я считаю, что это просто текстовый редактор, раздутый некачественными IDE-подобными функциями. ОС — это среда разработки, а Vim — ее компонент текстового редактора. - person romainl; 07.08.2014
comment
Было сделано несколько очень хороших замечаний, одно совершенно неточное утверждение, несколько полезных советов, но в целом опасное и разрушительное сообщение. Пункты о том, что ни Vim, ни ctags не принимают во внимание контекст, и то, как Vim ищет соответствующий тег, очень важны для понимания при попытке использовать теги для получения хорошего поиска определения кода. Полезны советы о различных способах установки тегов. Заявление о том, что поведение по умолчанию (... не может быть изменено в вашей конфигурации) <C-]> просто неверно. Раньше я его менял в конфиге. - person still_dreaming_1; 10.03.2016
comment
Это опасное сообщение для распространения, потому что чем больше людей верят в то, что, поскольку Vim является текстовым редактором, поэтому он не может достичь чего-то вроде уровня IDE для поиска определений кода, тем больше это становится самоосуществляющимся убеждением. Vim не может обеспечить контекстно-зависимый поиск БЕЗ плагина или очень сложной конфигурации, которая делает это. Нам нужно больше людей, работающих над такими плагинами, а не пессимизм по поводу возможностей Vim. Теперь, если вы хотите предоставить доказательства внутренних ограничений, которые делают практически невозможным создание такого плагина, это может оказаться полезным. - person still_dreaming_1; 10.03.2016
comment
Первые два абзаца не нужны и должны быть удалены из этого «ответа». - person Carlo Wood; 21.02.2017
comment
Я бы порекомендовал вам добавить фразу «На мой взгляд...» в начало вашего ответа. Потому что это ваше мнение, которое довольно противоречиво, и вы, возможно, не хотите продавать его, как если бы это была вечная истина. - person Jan; 22.09.2017
comment
Есть ли что-то неправильное в том, чтобы высказать собственное мнение, отвечая на чей-то вопрос? Этот ответ был очень полезен для меня, и я могу сильно относиться к обоим конфликтующим потокам здесь. Да, вы можете настроить среду разработки разными способами. Но предпочтение IDE или нет не дает вам права топтаться по чьему-то способу ведения дел и его образу мыслей. - person Gob; 14.03.2021
comment
@Gob SO в целом против мнений, которые включают в себя как вопросы, запрашивающие мнения, так и ответы, выражающие мнения. Это хорошо, имхо. Но люди есть люди, и им не нравится, когда их пузырь лопается, поэтому они отрицают правду и называют это мнением. Такова жизнь. - person romainl; 14.03.2021
comment
Да, я просто ненавижу, когда системы голосования используются не по назначению. Мой опыт связан с играми, и вы часто видите это на таких платформах, как Steam, где пользователи пытаются продвигать свою собственную повестку дня, используя голосование против разработчиков как оружие против разработчиков. Кто теряет пользователей и деньги из-за этого. Это прямо худшее, что может случиться с любой платформой, включенной SO. SO полон мнений, да ладно, разработка программного обеспечения на данный момент больше похожа на религию, и многие так называемые факты в любом случае являются просто личным мнением. Спасибо, что написали. Очень признателен! - person Gob; 23.03.2021