Чи можна перейти до оголошення функції або визначення у кількох проектних файлах вихідних файлів C ++?


15

Чи можна перейти до оголошення функції або визначення у кількох проектних файлах вихідних файлів C ++?

Скажімо, у мене є файл заголовка foo.hpp:

int bar();

і вихідний файл foo.cpp:

#include "foo.hpp"
int bar() { return 42; }

і основний файл main.cpp:

#include "foo.hpp"
int main() { bar(); return 0; }

Чи може vim знайти як визначення, так і оголошення функції bar()від mainфункції?

Відповіді:


15

Насичені ctags - це найпростіший спосіб досягти цього. У GNU / Linux (наприклад, Ubuntu чи Debian) ви можете просто робити

sudo apt-get install exuberant-ctags

(Для OSX "$ brew install ctags" повинно вистачити; для Windows, можливо, ви захочете відвідати http://ctags.sourceforge.net/ та завантажити окремий виконуваний файл)

Потім перейдіть до кореневої папки вашого проекту та запустіть

ctags -R --exclude=.git .

Це сканує весь ваш проект та створить файл ./tags, який vim автоматично використовуватиме для надання вам можливості переходити до функцій натисканням клавіші. А саме:

Ctrl + ]

з курсором, розміщеним на функції, для якої потрібно бачити реалізацію. Існують і інші комбінації та багато функцій командного режиму, які дозволяють вам переміщуватися по коду також за допомогою тегів (наприклад, Ctrl+ tдля переходу до старішої записи стека тегів). Дивіться :help 29.1для огляду.

Зауважте, що вам потрібно повторно запустити ctags для кожної суттєвої зміни коду та дозволити йому повторно індексувати ваш проект. Ви можете це зробити вручну, або навчити vim робити це за допомогою гарячої клавіші або для запису.

Підказка: якщо ви широко використовуєте ctags, можливо, плагін vim-taglist ( http://vim-taglist.sourceforge.net ) варто також переглянути. Це дає вам контур у стилі IDE із переліком усіх функцій для цього класу / файлу.


Варто знати дві речі: Universal-ctags багато в чому витіснив зграйні-ctags. Також, як дозволити Git синхронізувати ваші теги
D. Ben Knoble

4

Поки що я можу назвати два рішення проблеми пошуку або декларації, або визначення функції. Я знаю, що існує ще одне добре відоме рішення на основі тегів, але оскільки я не використовую його, я дозволяю іншим надати вам це.

Наймодніший перший: YouCompleteMe має команди :GoToDefinitionта :GoToDeclarationпару команд.

Я використовую (важко змінити довгі звички на 10 років). Мій плагін lh-тегів має можливість генерувати базу даних ctags та поступово її оновлювати. А також він пропонує спосіб ( CTRL+W Meta+Down) представити всі декларації та визначення, які відповідають тому, що знаходиться під курсором (/ що вибрано). Оскільки це рішення покладається на ctags, воно не зможе дізнатися, з яким дійсно пов’язаним також перевантаження ідентифікатора під курсором. Інші рішення, що базуються на тегах, мають настільки ж погано (/ як добре) на цю тему. Однак YCM має бути набагато кращим.

Discl .: Я реалізував lh-теги як більш ергономічну альтернативу :tselect.

(Насправді я пам’ятаю третє рішення: я запустив вилку clang-індексатора та відповідний плагін vim, який би його інкапсулював. Але з YCM навколо, я б забув це рішення)

EDIT: На 2019 рік найефективніше рішення покладається на сервери LSP . Я використовую COC + ccls, щоб індексувати, стрибати та робити багато інших речей. Я повертаюсь до базованих на тегах рішень, коли я лінивий налаштувати COC для проекту, на який я не витрачу багато часу, або де не можу встановити останні версії clang та ccls.


1
Дякую за вклад, перевіримо кожне рішення. Я протестував YouCompleteMe і GoToDeclarationпрацює лише з декількома вихідними файлами. Ось цитата з документації про GoToDefinition: For C-family languages this only works ... when the definition of the symbol is in the current translation unit.. Також команди є :YcmCompleter GoTo*.
Аллан Хасегава

Я пропустив цю лінію. Це означає, що clang_indexer може бути корисним. Інші рішення можуть бути трохи складними в установці. Якщо не потрібно, надішліть мені електронний лист.
Люк Ермітт

3

Альтернативи мало. Перший - це ctags. Якщо вам потрібен більш просунутий індексатор, то cscopeце краща альтернатива. Наприклад, це дозволить вам перерахувати всіх абонентів даної функції. Ці інструменти індексують ваш код, не розуміючи його належним чином (вони мають просте визначення граматики, щоб знати, що означає даний символ). Розширити цю граматику також порівняно просто. Для цих taglistплагінів необхідний вміст, і можна розширити граматику індекса, щоб відобразити результати в списку тегів.

Якщо вам потрібно щось більше, ніж індексатор, то, наприклад, перевірка синтаксису YouCompleteMe- це, мабуть, шлях. Він побудований на вершині llvmта, таким чином, має належний парсер. Це дозволяє перевірити синтаксис та семантику коду .

Тоді, якщо ви працюєте з кодом, який має доменну мову або вбудований код, то ви часто закінчуєтесь просто жаданнями через файли. Альтернативою є Ackсценарій perl, який намагається допомогти з цим завданням.


0

Я думаю, що ctags - це те, що вам потрібно. Vim інтегрований з ctags на самому собі, і може легко переходити до функцій визначень та декларацій.

Погляньте на цю статтю http://andrew.stwrt.ca/posts/vim-ctags


Будь ласка, додайте резюме пов’язаної публікації. Відповіді, що стосуються лише посилань, стають марними, коли посилання відмирає.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.