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