Может ли ack / ag / grep напечатать имя функции?

Можно ли распечатать имя функции или класса, в котором встречается ключевое слово, при использовании ack или ag? Это то, чего я очень желал довольно долгое время.

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

Обратите внимание, что моя цель - поиск в исходном коде C, однако я бы предпочел универсальное решение, которое охватывает больше языков / синтаксиса.


person shivams    schedule 06.06.2019    source источник
comment
Инструмент, который не знает грамматики основного языка, не сможет этого сделать, очевидно, что ack / ag не может этого сделать по своей сути   -  person Inian    schedule 06.06.2019
comment
@Inian Есть ли альтернативы _1 _ / _ 2_, у которых есть знание грамматики?   -  person shivams    schedule 06.06.2019
comment
Если git -L может сделать это, как описано, здесь почему не могу подтвердить?   -  person mmigdol    schedule 30.06.2020
comment
@mmigdol Вау. Это восхитительно. Git продолжает меня удивлять! Вы можете упомянуть это как ответ, объяснив, как это решит нашу проблему.   -  person shivams    schedule 01.07.2020


Ответы (3)


Как прокомментировал @Inian, было бы сложно получить надежное решение с использованием ack, ag и grep, поскольку они не знают грамматики языков.

Однако для моего случая просмотра файлов исходного кода C я использовал ack с условием OR для включения строк, которые начинаются с определений функций. В моем случае все мои функции либо возвращали int, либо ничего. Следовательно, следующий код распечатал строки определения функции вместе со строками, содержащими KEYWORD:

ack 'KEYWORD|^void|^int'
person shivams    schedule 06.06.2019

Автор акка здесь. Нет, я не знаю ни одного инструмента greplike, который понимает что-либо о текстовых файлах, которые он ищет. Это то, о чем люди все время просят, но я даже не думал об этом.

Вы сказали: «Я думаю, это будет довольно сложно, поскольку разные языки программирования имеют разные способы включения функций / классов». Вы совершенно правы. Также подумайте о таких вещах, как комментарии

/ * void foo () * /

и буквальные строки

printf ("void foo ()");

это вызовет проблемы для любого поискового инструмента. Ни один из этих экземпляров строки void foo() на самом деле не является объявлением функции.

Посетите страницу Дополнительные инструменты на сайтеyondgrep.com. Вам может помочь что-то вроде cscope.

person Andy Lester    schedule 10.06.2019
comment
Спасибо @Andy Lester. Страница дополнительных инструментов на сайтеyondgrep.com действительно обширна :) - person shivams; 10.06.2019
comment
Спасибо, я рад, что вы нашли это полезным. Вас также может заинтересовать аналогичный проект, который я начал в altbox.dev, который представляет собой альтернативные инструменты * nix. - person Andy Lester; 11.06.2019
comment
Вот это да!! Это какой-то убийственный список на altbox.dev :) - person shivams; 11.06.2019

Хотя ни одна из перечисленных вами программ в настоящее время не имеет этой функции, Git использует регулярные выражения на основе языка для реализации git grep -L (поиск по имени функции). В этом сообщении блога описывается, как это работает. Текущий список регулярных выражений находится в дереве исходного кода git здесь, и может быть расширен, как описано в блоге выше.

Кроме того, ctags предоставляет универсальный способ перечисления тегов из файлов на нескольких языках, но я не t (пока) нашел способ интегрировать этот вывод с git grep -L.

person mmigdol    schedule 01.07.2020
comment
Спасибо. Я посмотрю, как мы можем использовать git в нашем случае. - person shivams; 02.07.2020