#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 (который мог бы делать то, что вы ищете). Но в последнее время я ничего с этим не делал, я даже не уверен, что он все еще будет компилироваться.