Более простой способ найти файл, который определяет мою функцию / макрос C / C ++, чем 'grep' - PullRequest
0 голосов
/ 08 октября 2018

Я начинаю работать над огромным проектом с тонами файлов C и C ++, уже написанными кем-то другим.

Существуют ли более быстрые / более простые способы найти в каком файле какой-либо макрос или функция для определения другихчем grep -r?Это довольно долго.

В некоторых IDE есть волшебная вещь, например, щелчок правой кнопкой мыши и «перейти к определению».Но сейчас я использую emacs.Я не знаю, есть ли какие-либо настройки, которые могут сделать это?Каждый раз мне приходится копировать прошлое имя в моем терминале, запускать grep и повторно копировать путь к файлу в моем emacs.(А ты знаешь, я ленивый ...)

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

CTags.Вы можете попробовать использовать Ctags с emacs, и это поможет вам перейти непосредственно к объявлению функции.Для его использования, пожалуйста, обратитесь к https://www.emacswiki.org/emacs/EmacsTags

Вы также можете изучить Cscope, он имеет лучший набор функций, чем ctags, который работает непосредственно на распознавание образов.Но иногда вам просто нужно перемещаться по коду, и чаще всего ctags выполняет свою работу.

0 голосов
/ 08 октября 2018

Каждый раз, когда мне приходится копировать имя в моем терминале, запускать grep и повторно копировать путь к файлу в моем emacs.

Вы можете улучшить этоиспользуя M-x rgrep внутри Emacs.Он запрашивает регулярное выражение, шаблон глобуса файлов для поиска и каталог для запуска. Затем он выполняет рекурсивный grep, выводит результаты в буфер, и вы можете перейти непосредственно от попаданий к соответствующему файлу.

Для шаблона glob вы можете напечатать что-то вроде *.c или использовать один из псевдонимов, определенных в переменной grep-files-aliases.Например, ch эквивалентно *.[ch] (исходные файлы C и файлы заголовков), а cchh эквивалентно *.cc *.[ch]xx *.[ch]pp *.[CHh] *.CC *.HH *.[ch]++ (исходные файлы C ++ и файлы заголовков).

Вы можете обнаружить, что это работает хорошоДостаточно того, что вам не нужны ctags и другие инструменты, предложенные в других ответах и ​​комментариях.


Для простоты поиска определений функций в C некоторые проекты используют соглашение о том, что имя функции в определении начинаетсяв первом столбце:

/* this is just a declaration */
int main(int argc, char *argv[]);

/* in the definition, the function name starts on its own line */
int
main(int argc, char *argv[])
{
    ...

Это означает, что вы можете найти определение, исключая любые вызовы функции, с помощью регулярного выражения ^main.

0 голосов
/ 08 октября 2018

grep должно быть очень быстрым, если вы ограничиваете поиск по каталогам и типам файлов (обычно .h и .hpp), которые могут его содержать.Например, если вы знаете, что это в вашем приложении, просто ищите там, если вы знаете, что это из FreeType (обычно FT_*), ищите там.

Больше оперативной памяти поможет системному кешированию файлов лучше, и если вы наHDD лучше всего получить SSD.Если вы работаете непосредственно на виртуальной машине, особенно с удаленными дисками, если вы можете работать локально, это часто будет быстрее.

В противном случае многие полностью функциональные IDE (Visual Studio, XCode, Eclipse и т. Д.) Имеют интеграцию с C ++ дляследите за этими вещами, и, например, предложите «Перейти к объявлению» и «Перейти к определению» в качестве ярлыка или контекстного меню, когда над символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...