Найти тему
Блокнот математика

Рубрика "Секреты Вим". Поиск по include-файлам

Во многих языках программирования (в широком смысле) есть возможность вставить файл. Имеется в виду, что в каком-то месте указано имя файла командой вроде include, которая предписывает вставить в это место содержимое указанного файла. Это широко используется в Си и других языках GNU Compiler Collection. Есть такая команда и в Фортране, есть \input в ТеХ, и много где еще. Это не лучший способ организации кода, но иногда бывает полезен и, главное, до сих пор используется.

Картинка не моя. Отсюда: http://images.myshared.ru/6/656277/slide_77.jpg. Фокус в том, что  если в коде есть эти i1, i2, i3, то мы можем их отыскать, не открывая h-файлы вручную.
Картинка не моя. Отсюда: http://images.myshared.ru/6/656277/slide_77.jpg. Фокус в том, что если в коде есть эти i1, i2, i3, то мы можем их отыскать, не открывая h-файлы вручную.

Вим обладает средствами поиска по файлу с учетом внедренных, и средства эти могут быть полезны и в других случаях, например, для модулей.

Немаловажно, что поиск этот рекурсивен: внедренные во внедренные файлы тоже просматриваются.

Если файл не удалось найти, он игнорируется без сообщений об ошибке. И есть команды, позволяющие имена файлов посмотреть, чтобы определиться. Они полезны сами по себе, например, чтобы посмотреть зависимости.

Искомое может быть словом или макросом. Слово просто ищется, как таковое, а вот макрос должен подходить под определение макроса, которое указано в опции define. По умолчанию там ^\s*#\s*define (в начале строки решетка и потом слово define, и могут быть пробелы) — это для Си. Можете настроить для своего языка, например

:set define=^\\\\input

пригодно для ТеХ. Почему четыре слеша? Каждая пара означает один слеш в команде set, так что в переменной окажется ^\\input и именно это будет искаться, и двойной слеш означает просто слеш.

Поиск ведется в пределах строки, выражение не может содержать символ конца строки.

Многие команды начинаются с квадратной скобки. Команды с [ ищут от начала файла, а с ] ищут от курсора.

Опция include определяет команду, задающую внедряемый файл. По умолчанию это "\^#\s*include", что соответствует Си и ряду языков коллекции gcc. Однако в синтаксис Вим не вникает и найдет вхождения в комментариях и других местах. Но это обычно нестрашно.

Опция isfname описывает множество символов, которые могут входить в имя файла.

Для поиска файлов, для которых не указан абсолютный путь, используется опция path; о поиске файлов у нас был материал.

При поиске игнорируются комментарии (указанные в опции comment), но если в строке есть # define, то это никогда не считается комментарием.

Команды с квадратными скобками

Скобку, открывающую или закрывающую, здесь не указываем. Так что если ниже описана команда i, то это пара [i и ]i, отличающиеся точкой начала поиска.

i — поиск и показ первой строки, содержащей слово под курсором. Если дан повторитель, ищется соответственное совпадение и комментарии в этом случае не игнорируются.

I — поиск и показ всех строк, содержащих слово под курсором.

<C-I> — прыжок на первую строку, содержащую слово под курсором.

d, D, <C-D> — то же самое, что и команды семейства i, но для макросов.

Варианты командной строки

Все эти команды имеют аналоги командной строки, которые дают некоторые дополнительные возможности. Это isearch, ilist, ijump и dsearch, dlist, djump.

Все они ищут в указанном диапазоне строк (по умолчанию это весь файл).

Все они могут снабжаться восклицательным знаком и тогда не пропускают комментарии.

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

Однако d-команды ищут строку, а не регулярное выражение.

Все команды, кроме двух list-команд, могут принять перед выражением число-повторитель, и тогда они ищут соответствующее вхождение.

Открытие найденного в новом окне

Все описанные команды показывают найденную строку или строки (в последнем случае показывают еще и файл и номер строки), но иногда надо туда попасть и что-то отредактировать или изучить повнимательнее. Команда <C-W>i или ее синоним <C-W><C-I> открывают новое окно и первой его строкой будет найденная строка. В остальном команда аналогична [i: поиск идет с начала файла, комментарии игнорируются, если указан повторитель, то берется соответствующее совпадение, и комментарии при этом не пропускаются.

Аналог этой команды для командной строки тоже есть: это isplit.

Для поиска макросов так тоже можно: команды <C-W>d (синоним <C-W><C-D>) и dsplit.

Команда :checkpath покажет все include-файлы, который можно найти. С восклицательным знаком покажет вообще все, что имеются в проекте (то есть, в данном файле и в найденных файлах рекурсивно).

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

Удачи, коллеги.

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022