Подтвердить что ты не робот

Есть ли альтернатива ctags, которая работает лучше?

Я только что открыл плагин taglist для vim и прочитал о как использовать его с ctags.

Однако, неутешительно ctags - очень простой парсер.

Есть ли более полная альтернатива?

В частности, я ищу что-то, что:

  • расширяет #define(x, y) x ## y макросы стиля для объявлений функций

  • процессы #include statements

  • позволяет включать пути, которые должны быть указаны для зависимостей

Я вижу, что clang предоставляет программный api для доступа к c AST, так что, конечно, это не так сложно сделать?

Кто-нибудь уже это сделал?

-

Edit:

Эти не режут:

  • clang_indexer - не компилируется; когда он делает (после взлома), не работает (бесконечные ошибки).

  • clang_complete - не кажется лучше, чем ctags. Контекстно-ориентированных рекомендаций нет, нет завершения структуры, нет аргументов функции, нет расширения макросов; просто список символов и файл, из которого они пришли.

4b9b3361

Ответ 1

Я потратил немало времени на борьбу с этим сам.

Ближайшее, что я когда-либо получал, было gccsense. К сожалению, проект кажется заброшенным, и, кроме того, его сложно настроить, потому что английский не был первым языком автора.

В итоге я подошел к проблеме под другим углом. Я принял решение, что intellisense/autocomplete более важна для моего кодирования, чем наличие всех доступных функций vim, поэтому я выбрал IDE, например Eclipse, а затем нашел плагин для Eclipse, который эмулирует Vim. Пока что лучший вид плагина, который я нашел, был Viable.

Вот полный список вариантов, которые я пробовал и нашел неудовлетворительными:

  • clang - требуется переключение с gcc на другой и "лучший" компилятор. Проблема в том, что gcc намного более зрелый [edit, по-видимому, вам не нужно переключать компиляторы, см. Комментарии ниже, я могу дать эту другую попытку в будущем.]
  • gccsense - отличная идея (с помощью gcc, чтобы дать вам завершение кода), однако работа над проектом заброшена:( и версия, которая выше, является бета-качеством
  • xref в vim - xref - отличный автономный инструмент и отлично подходит для разбора C. Его можно заставить работать в vim с vxref, однако из моего опыта xref не хватает в синтаксическом анализе текущего кода на С++, и его развитие остановилось (а также разработка на vxref. )
  • eclim - отлично работает для поддержки Java с использованием eclipse, чрезвычайно медленным и полностью ненадежным при анализе кода на С++ или C. Что обычно происходит, все работает долгое время, но затем внезапно парсер перестает разбирать любой новый код, который вы пишете, и ничего, кроме загрузки самого затмения и принудительного затмения для повторного анализа проекта, похоже, помогает. Кроме того, менее важный факт, но больше раздражает то, что eclim берет на себя ошибки обработки, поэтому он закручивает способ, которым vim обычно анализирует ошибки от gcc, что означает, что у вас нет доступа к списку quickfix, который раздражает.
  • netbeans + jvi - многие люди клянутся этим, но у меня были всевозможные проблемы с jvi. Одна из основных проблем, с которыми я столкнулась, - это jvi, я бы сказал, что я в нормальном режиме, но на самом деле был в режиме вставки, ничего, кроме перезагрузки, не помогло бы.
  • eclipse + viplugin/vrapper - это было похоже на лучший вариант; каждый из них имел свой собственный набор ошибок + недостаток функций, но все же был наиболее привлекательным, пока я не нашел жизнеспособным, который, казалось, был самым стабильным и имел большинство функций.

Если вы найдете решение, которое вам нравится, пожалуйста, поделитесь им в комментарии, потому что я буду заинтересован в нем.

Ответ 2

Я еще не пробовал это сам, но clang_indexer кажется очень близким к тому, что вы ищете (источники). Он по-прежнему использует внешнюю базу данных (т.е. Не индексируется "на лету" как таковой), но, похоже, она предлагает функциональные возможности, которые обычно встречаются только в cscope (что не слишком хорошо поддерживает С++).

Для автозаполнения я использую clang_complete. Он не требует генерации индекса и работает большую часть времени довольно хорошо. Он также может выполнять автоматическую проверку синтаксиса в vim, поэтому предупреждаются о возможных проблемах. Он не автозаполняет пример макроса, который вы указали

#define blah(x) blah__ ## x
void blah_<TAB>

как bla__x хотя (только как blah(x)). Было бы хорошо, если бы это было более настраиваемым, но я бы тоже не подумал об этом.

Ответ 3

CScout версия 2.8 предлагает параметр командной строки (-C), который создаст vim-совместимый файл тегов для источника C код будет обрабатываться. CScout является анализатором исходного кода и браузером рефакторинга для коллекций программ на C. Он может обрабатывать рабочие пространства нескольких проектов, отображая сложность, представленную препроцессором C, в исходные файлы исходного кода C. Следовательно, созданный файл тегов содержит правильную информацию для сущностей, таких как функции, переменные и структуры, которые создаются с помощью макросов препроцессора. CScout будет обрабатывать включенные файлы, используя включенные пути к файлам, указанные в файле конфигурации проекта кода (эквивалент файла Makefile). Чтобы попробовать, загрузите пакет, соответствующий вашей настройке, перейдите в каталог примеров, содержащий исходный код awk и запустите

../bin/cscout -Cc awk.cs

Вы можете увидеть некоторые типы конструкций препроцессора, которые CScout может обрабатывать в этой странице. Например, если вы обработаете следующий код

#define typefun(name, type, op) \
type type ## _ ## name(type a, type b) { return a op b; }

typefun(add, int, +)
typefun(sub, int, -)
typefun(mul, int, *)
typefun(div, int, /)
typefun(add, double, +)
typefun(sub, double, -)
typefun(mul, double, *)
typefun(div, double, /)

main()
{
        printf("%d\n", int_add(5, 4));
        printf("%g\n", double_mul(3.14, 2.0));
}

CScout создаст файл тегов со следующими записями.

double_add  test.c  8       ;"  f
double_div  test.c  11      ;"  f
double_mul  test.c  10      ;"  f
double_sub  test.c  9       ;"  f
int_add test.c  4       ;"  f
int_div test.c  7       ;"  f
int_mul test.c  6       ;"  f
int_sub test.c  5       ;"  f
main    test.c  13      ;"  f
typefun test.c  1       ;"  d

Вы можете попробовать сами, добавив несколько макросов, генерирующих код, в исходный код примера, чтобы увидеть теги, которые создаст CScout.

Ответ 4

Одна из возможностей - использовать Eclim. Это мощный инструмент, который можно использовать разными способами; в вашем случае вам придется запустить безгласный сервер Eclipse и в основном использовать индексатор Eclipse и т.д. Я думаю, вам нужно, чтобы ваш проект был зарегистрирован как проект Eclipse.

Ответ 5

Я использую 'global'. После его установки у вас есть "глобальная" команда для поиска кода и "гагг" для индексирования.

Я работаю с ядром Linux, и он много помогает: он работает с более интеллектуальными (но все же не такими хорошими, как я хочу), и он знает о прототипе функции, реализации функции и всех ссылках на функцию из кода.

Можно также интегрировать "глобальный" с VIM, плагин для него:

Удачи.

Ответ 6

Coc кажется многообещающим, объединяет intellisense с vim (8.0 и выше) и neovim