Я использую ctags (-e), и он работает очень хорошо. Однако, когда я ищу функцию-член, ctags возвращает первое найденное определение. Например:
ClassA classA;
classA.Initialize();
classA.DoSomething();
ClassB classB;
classB.Initialize();
classB.PerformAction();
Если я ищу тег Initialize()
(M-.
или же g^]
) на classA.Initialize()
Я ожидаю пойти в ClassA::Initialize()
, Если так получилось, что есть другой класс с таким же методом, и его тег появляется раньше classA
тег в файле тега (скажем, это ClassB::Initialize()
) Меня отвезли в ClassB::Initialize()
,
Тем не менее, если, когда я печатаю M-.
и я исправляю тег, который хочу посетить ClassA::Initialize()
тогда я иду в ClassA::Initialize()
, Есть ли способ сделать это автоматически?
Такое поведение одинаково для emacs и vim.
Более того, с глобальным GNU (gtags) даже не найдешь ClassA::Initialize()
, Он просто распечатает все классы, которые имеют Initialize()
метод.
РЕДАКТИРОВАТЬ:
Если вопрос еще не ясен, я спрашиваю, есть ли плагин, который будет проверять метод (например, это функция-член, доступ к которой осуществляется через .
или же ->
) и если он найдет тип объекта, а затем искать Object::Method
а не для метода.
Это простая функциональность. Например:
ClassA::Initialize()
если все вышеперечисленное верно вместо Initialize()
,Это понятнее?
Ctags только индексирует ваш код. Вы используете его только для генерации tags
файл, пока поиск выполняется вашим редактором. Как это делает поиск — дело вашего редактора, и ctags не имеет к этому никакого отношения.
Когда вы делаете <C-]>
по имени метода Vim переходит к первому найденному совпадению. Поскольку у него нет средств для анализа вашего кода и ваших мыслей, он не может решить, какое соответствие вы на самом деле хотите.
Наиболее близким является понятие «приоритет», см. :h tag-priority
, но это тебе не поможет.
И обычный способ справиться с этим ограничением — использовать команду, которая перечисляет все совпадения, например g]
или же g<C-]>
,
Других решений пока нет …