Если вы, как и я, проводите большую часть времени в терминале, то точно знакомы с командами find, grep и cat, когда нужно что-то быстро отыскать. Работают — да, но пользоваться ими неудобно, особенно когда спешишь. А между тем, есть решение куда лучше! Сейчас расскажу, как сделать поиск по файлам в терминале по-настоящему современным и удобным — буквально в одно действие.
Без лишних слов: этот однострочник объединяет возможности fzf, ripgrep и bat и добавляет к поиску красивый интерактив прямо в вашем терминале. Ниже подробно разберём каждую часть команды, чтобы вы легко её подстроили под себя.
Как связать ripgrep с fzf и получить быстрый поиск
Сначала разберёмся с флагом “--bind” для fzf: он связывает определённые события внутри fzf с любыми внешними командами.
События — это просто ключевые моменты в работе fzf: запуск, загрузка, изменение запроса, выбор строки, смена фокуса и т.д. Их довольно много — подробности можно глянуть в документации.
Например, событие “change” запускает команду при каждом изменении введённого текста. “{q}” — это ваш текущий поисковый запрос:
Вместо echo сюда можно подставить любую нужную команду:
Теперь улучшаем команду, чтобы 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}” и т.д. заполняются фрагментами совпадения, отделёнными двоеточием. Вот так это выглядит:
Для Vim и Neovim параметры будут такими:
Для Emacs используйте такую конструкцию:
Реальный предпросмотр содержимого файла во время поиска — через “--preview”
Чтобы выбирать нужные строки ещё быстрее, стоит добавить предпросмотр. Лучше всего подходит bat — он не только показывает код, но и красиво его подсвечивает.
Вид предпросмотра задаётся “--style”. Самый информативный вариант — “full”: с номерами строк, названием файла и красивой рамкой. Все нюансы описаны в инструкции по bat.
Для подсветки нужной строки используем “--highlight-line” и подставляем “{2}” — это номер строки из результата поиска.
А сам файл для bat будет подставляться через “{1}”.
--preview-window
Следующий важный параметр — “--preview-window”, с помощью которого можно задать размер и расположение окна с предпросмотром:
На первый взгляд всё кажется сложно, но на деле схема простая.
Порядок частей можно менять местами — fzf прекрасно разбирает синтаксис по ключевым символам (например, “~” или “+”). Я советую ориентироваться на схему позиция:размер,тип-рамки,фиксированная-голова,скролл-отступ.
“Позиция” — где появится предпросмотр: сверху, снизу, слева или справа; “размер” — какой процент экрана он займёт.
Подписывайтесь — чтобы не пропустить свежие хакерские приёмы для терминала!
“Тип рамки” (например, “border-bottom”) даёт чистое визуальное разделение между предпросмотром и списком совпадений. Мой фаворит — “border-bottom”:
“Фиксированная голова” — это количество служебных строк, которые всегда видны в предпросмотре сверху (например, “~4” удобно, чтобы была видна шапка bat).
“Скролл-отступ” определяет, где окажется подсвеченная строка в окне предпросмотра.
Я долго экспериментировал, и для себя выбрал вариант “+{2}+4/3”: строка подсветки всегда примерно по центру, что очень удобно. В мануале описано чуть-чуть по-другому, но этот вариант отлично себя показал.
Я протестировал Ghostty на Linux — правда ли, что этот терминал круче всех?
Ещё одна оболочка для команд — стоит ли тратить на неё время?
Дальше всё просто: сохраните свою функцию в .bashrc (или любую другую конфигурацию вашей оболочки) и перезапустите терминал. Теперь всё, что нужно — ввести команду "s" с нужным поисковым запросом, а если надо — добавить любые флаги ripgrep и указать папку или файл.
Обратите внимание: в начале команды используется “: | fzf” — такой трюк даёт пустой старт fzf, и он не выводит ничего лишнего, пока вы сами не введёте запрос.
Из минусов — такой поиск не использует индекс: сканировать весь диск вручную непрактично, зато ripgrep блистательно справляется с “живым” поиском. Просто указывайте максимально конкретный путь (например, папку проекта), а лишние файлы исключайте — тогда скорость вас приятно удивит.
Как за секунду получить шпаргалку по любой команде прямо в терминале Linux
Порой одна короткая подсказка экономит часы работы — отличный хак для продуктивности.
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru