vim не удалось перейти к навигации по определению для функций шаблона

#vim #ctags #youcompleteme

#vim #ctags #youcompleteme

Вопрос:

У меня есть файл .h, который содержит этот код:

 template<BLA>
func1() {}

// something 

template<BLA>
func2() {
  func1();
}
 

когда я ввел команду GoToDefinition, появилась ошибка:»YCM: ‘RuntimeError: не удается перейти к определению.'».
Я что-то пропустил? И как найти определение?

Кстати, у меня есть это в моем .vimrc:

 let g:ycm_global_ycm_extra_conf = ' ~/ycm_extra_conf.py'
 

**************вторая правка*******************

Я переустановил свой YCM и попробовал ctags для YCM с помощью этой команды :

 ctags -R --fields= l 
 

Это работает, и спасибо.

Ответ №1:

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

Другими словами, он должен работать до тех пор, пока вы хотите перейти к определению, которое находится в том же .cpp-файле, что и тот, который вы редактируете в данный момент. Таким образом, он также должен работать при попытке получить доступ к определению функции шаблона с его сайта вызова — поскольку мы должны включить соответствующий код. Если это не так, это может быть связано с неправильным пониманием исходного кода движком clang, который использует YCM, или с тем, что YCM не настроен на использование clang.

Что касается тегов, они могли бы выполнить эту работу, но на самом деле в C вам понадобится способ сузить представленные теги. Вот что заставило меня запустить lh-tags: он представляет все совпадающие теги и позволяет фильтровать их по различным критериям (имя файла, вид, область действия, …)

Комментарии:

1. Спасибо за эти два полезных плагина.

2. @FrankWang, я не имею никакого отношения к коду YCM ^^. Одно время я работал над clang-indexer (который мог бы делать то, что вы ищете). Но в последнее время я ничего с этим не делал, я даже не уверен, что он все еще будет компилироваться.