Возможно ли подскакивать ctags типа в vim? - PullRequest
9 голосов
/ 12 сентября 2011

Учитывая следующий код:

// MyClass.h
class A {
    void foo();
}

class B {
    void foo();
}

// MyClass.cpp
void main() {
    A a();
    a.foo();
}

Учитывая, что я использую vim и сгенерировал мои ctags, если я наведу курсор на foo() в main() и нажму ctrl+], яполучит список реализаций foo, так как их более одного.Если бы был только один, то он немедленно перешел бы к этой реализации.

Есть ли в vim способ для вывода типа a, чтобы при выводе ctrl+] он сразу переходил креализация A::foo() вместо того, чтобы предоставить мне список вариантов?Похоже, такой плагин должен существовать, и я просто не могу его найти.

Обновление: Похоже, что в настоящее время нет решения этой проблемы, поэтому я выбрал ответ Exclipy ниже.Если решение само представится и будет доступен новый ответ, я обновлю ответ на этот вопрос.

1 Ответ

4 голосов
/ 27 сентября 2011

То, что вы хотите сделать, невозможно, если Vim не сможет на самом деле проанализировать весь модуль перевода C ++, как это сделал бы компилятор C ++. Это далеко выходит за рамки ctags, которые используют очень простую эвристику, чтобы просто маркировать окрестности курсора.

Итак, очевидное решение этого вопроса - подключите C ++-парсер к Vim! На самом деле существует плагин с именем clang_complete, который уже выполняет большую часть тяжелой работы по подключению к синтаксическому анализатору Clang C ++. Исходя из этой базы, будет просто расширить его, чтобы использовать API Clang для реализации перехода к определению.

На самом деле я начал работать над такой функцией через два проекта: clang_indexer , который сканирует исходное дерево для построения индекса на диске, и мой форк clang_complete, который добавляет функцию запроса индекса для использования символа под курсором. Это на самом деле немного больше, чем то, что вы ищете, потому что я стремлюсь к функции «найти все ссылки» (с возможностью фильтрации результатов только по определениям).

Это на очень ранней стадии, и я делаю это только для себя, поэтому не ожидайте, что это будет очень отточенное решение.

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