Найти в Дзене
Герман Геншин

Эта Bash-функция перевернула мой подход к поиску в терминале — больше не вернусь к find и grep!

Если вы, как и я, проводите большую часть времени в терминале, то точно знакомы с командами find, grep и cat, когда нужно что-то быстро отыскать. Работают — да, но пользоваться ими неудобно, особенно когда спешишь. А между тем, есть решение куда лучше! Сейчас расскажу, как сделать поиск по файлам в терминале по-настоящему современным и удобным — буквально в одно действие. Без лишних слов: этот однострочник объединяет возможности fzf, ripgrep и bat и добавляет к поиску красивый интерактив прямо в вашем терминале. Ниже подробно разберём каждую часть команды, чтобы вы легко её подстроили под себя. Сначала разберёмся с флагом “--bind” для fzf: он связывает определённые события внутри fzf с любыми внешними командами. События — это просто ключевые моменты в работе fzf: запуск, загрузка, изменение запроса, выбор строки, смена фокуса и т.д. Их довольно много — подробности можно глянуть в документации. Например, событие “change” запускает команду при каждом изменении введённого текста. “{q}” —
Оглавление

Если вы, как и я, проводите большую часть времени в терминале, то точно знакомы с командами find, grep и cat, когда нужно что-то быстро отыскать. Работают — да, но пользоваться ими неудобно, особенно когда спешишь. А между тем, есть решение куда лучше! Сейчас расскажу, как сделать поиск по файлам в терминале по-настоящему современным и удобным — буквально в одно действие.

Без лишних слов: этот однострочник объединяет возможности fzf, ripgrep и bat и добавляет к поиску красивый интерактив прямо в вашем терминале. Ниже подробно разберём каждую часть команды, чтобы вы легко её подстроили под себя.

-2

Как связать ripgrep с fzf и получить быстрый поиск

Сначала разберёмся с флагом “--bind” для fzf: он связывает определённые события внутри fzf с любыми внешними командами.

События — это просто ключевые моменты в работе fzf: запуск, загрузка, изменение запроса, выбор строки, смена фокуса и т.д. Их довольно много — подробности можно глянуть в документации.

Например, событие “change” запускает команду при каждом изменении введённого текста. “{q}” — это ваш текущий поисковый запрос:

-3

Вместо echo сюда можно подставить любую нужную команду:

-4

Теперь улучшаем команду, чтобы ripgrep максимально раскрывал свои возможности:

Фрагмент “change:reload:sleep 0.1” не даёт системе перегружаться — команда не будет запускаться при каждом нажатии, а лишь спустя 100 миллисекунд после последнего ввода. Так поиск плавнее и не грузит процессор.

Опция “command rg” нужна, чтобы запускался именно системный ripgrep, а не какой-нибудь alias. Главное — стабильный вывод для следующей обработки.

Ключ “--column” заставляет ripgrep показывать не только номера строк, но и колонок — полезно, если хотите открывать нужную строку файла сразу с нужного символа.

Команда “$*” — сюда можно подставить дополнительные параметры, например, конкретные директории и файлы.

Остальные опции (“--no-heading”, “--color=always”, “--smart-case”) делают вывод аккуратнее и удобнее. “Smart case” автоматически включает чувствительность к регистру, если в запросе есть заглавные буквы.

Для красивого цветового вывода нужно указать “--ansi”. А “--disabled” отключает внутреннюю фильтрацию fzf, и весь поиск доверяется ripgrep — все спецсимволы и синтаксис будут такие же.

“|| :” — короткий аналог “|| true”; не даёт fzf завершиться, если ripgrep ничего не нашёл (чтобы поиск не закрывался на пустом результате).

Открывайте найденные строки в редакторе моментально — по горячей клавише!

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

В одной настройке “bind” открывает Nano по Enter, а в другой — по Ctrl+O (варианты вызова чуть отличаются).

“execute” после закрытия редактора возвращает вас обратно в fzf — удобно, если нужно просмотреть несколько совпадений. “become” полностью завершает fzf после редактора и возвращает в терминал.

“+{2},{3} {1}” — здесь магия: открывает нужный файл ровно на той строке и колонке, куда попало совпадение. fzf сам подставляет значения, и вы попадаете прямо к нужному кусочку кода.

Подстановки “{1}”, “{2}” и т.д. заполняются фрагментами совпадения, отделёнными двоеточием. Вот так это выглядит:

-5

Для Vim и Neovim параметры будут такими:

Для Emacs используйте такую конструкцию:

Реальный предпросмотр содержимого файла во время поиска — через “--preview”

Чтобы выбирать нужные строки ещё быстрее, стоит добавить предпросмотр. Лучше всего подходит bat — он не только показывает код, но и красиво его подсвечивает.

Вид предпросмотра задаётся “--style”. Самый информативный вариант — “full”: с номерами строк, названием файла и красивой рамкой. Все нюансы описаны в инструкции по bat.

Для подсветки нужной строки используем “--highlight-line” и подставляем “{2}” — это номер строки из результата поиска.

А сам файл для bat будет подставляться через “{1}”.

--preview-window

Следующий важный параметр — “--preview-window”, с помощью которого можно задать размер и расположение окна с предпросмотром:

На первый взгляд всё кажется сложно, но на деле схема простая.

Порядок частей можно менять местами — fzf прекрасно разбирает синтаксис по ключевым символам (например, “~” или “+”). Я советую ориентироваться на схему позиция:размер,тип-рамки,фиксированная-голова,скролл-отступ.

“Позиция” — где появится предпросмотр: сверху, снизу, слева или справа; “размер” — какой процент экрана он займёт.

Подписывайтесь — чтобы не пропустить свежие хакерские приёмы для терминала!

“Тип рамки” (например, “border-bottom”) даёт чистое визуальное разделение между предпросмотром и списком совпадений. Мой фаворит — “border-bottom”:

-6

“Фиксированная голова” — это количество служебных строк, которые всегда видны в предпросмотре сверху (например, “~4” удобно, чтобы была видна шапка bat).

“Скролл-отступ” определяет, где окажется подсвеченная строка в окне предпросмотра.

-7

Я долго экспериментировал, и для себя выбрал вариант “+{2}+4/3”: строка подсветки всегда примерно по центру, что очень удобно. В мануале описано чуть-чуть по-другому, но этот вариант отлично себя показал.

-8

Я протестировал Ghostty на Linux — правда ли, что этот терминал круче всех?

Ещё одна оболочка для команд — стоит ли тратить на неё время?

Дальше всё просто: сохраните свою функцию в .bashrc (или любую другую конфигурацию вашей оболочки) и перезапустите терминал. Теперь всё, что нужно — ввести команду "s" с нужным поисковым запросом, а если надо — добавить любые флаги ripgrep и указать папку или файл.

Обратите внимание: в начале команды используется “: | fzf” — такой трюк даёт пустой старт fzf, и он не выводит ничего лишнего, пока вы сами не введёте запрос.

Из минусов — такой поиск не использует индекс: сканировать весь диск вручную непрактично, зато ripgrep блистательно справляется с “живым” поиском. Просто указывайте максимально конкретный путь (например, папку проекта), а лишние файлы исключайте — тогда скорость вас приятно удивит.

-9

Как за секунду получить шпаргалку по любой команде прямо в терминале Linux

Порой одна короткая подсказка экономит часы работы — отличный хак для продуктивности.

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: