[Перевод] Итак, вы установили fzf. Что дальше?

4cvsrhlataedw4_yzjy-gabuh1e.jpeg


Разработчики ПО — если не единственные, то практически единственные, кому очень просто создавать инструменты для улучшения своей профессиональной работы; однако со временем это усложняет жизнь людям, постоянно переключающимся между разными инструментами и не вкладывающим время в глубокое изучение своего инструментария. Имея глубокое уважение к негласным знаниям людей лучше меня, я всё же считаю, что отличная эвристика 80/20 заключается в том, чтобы изучать старые добрые инструменты Unix cat, ls, cd, grep и cut. (а если вам повезло устроиться на должность настоящего современного сисадмина, то ещё и sed с awk.)

Однако существуют инструменты, выгода от использования которых настолько мгновенна и ценность от применения настолько уникальна, что эвристика 80/20 полностью к ним неприменима. Один из них — это fzf. И меня очень печалит то, что многие скачивают его, запускают в командной строке «как есть», а потом просто мотают головой и произносят: «Я не понимаю».

Мне хотелось бы изменить ситуацию. Предположим, что вы работаете на более-менее стандартной машине с Ubuntu. Вы только что установили fzf при помощи стандартного скрипта установки. Что же дальше?

Сначала попробуйте Ctrl+R…


В большинстве терминалов, как в Linux, так и в Windows Ctrl+R позволяет выполнять поиск в обратном порядке введённых команд. Возможно вы, как и я, не слышали об этом до сего момента, несмотря на то, что работаете с шеллом уже десяток лет; причина в том, что базовая версия этого ПО неудобна по двум причинам:

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


fzf — довольно странная программа, потому что её установка полностью перезаписывает целую кучу горячих клавиш, чтобы сделать их лучше. В обычной ситуации мне бы это не понравилось. Но…

847c2c4a2635023a060d75b7d8a8f439.gif


… Это существенное улучшение по сравнению с тем, что было.

(Стоит заметить, что установка fzf через менеджер пакетов наподобие apt может и не дать такого результата! Именно поэтому я продолжаю намекать, что следует использовать скрипт установки, даже если вы согласны со мной в том, что curl | bash — это зло!)

…, а теперь попробуйте Alt+C


Допустим, вы запускаете пустой терминал. Вы пытаетесь быстро найти свои репозитории хобби-проектов и перейти к ним с помощью cd, но вы уже несколько недель не работали с ними, потому что ваша основная работа необычайно интересна и увлекательна… Как их найти?

Ответ: с помощью fzf. fzf превращает Alt+C в сочетание горячих клавиш для тюнингованного cd с нечётким поиском и позволяет очень быстро перемещаться, когда единственное, что вы смутно помните — имя нужной папки.

14df182cd3bc2026917bbe00edba1872.gif


Основная команда fzf


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

6962e640f1ec8348ddb95e606c0500b5.gif


Она выполняет нечёткий поиск местоположений файлов! По крайней мере, относительно вашей собственной папки. Само по себе это не особо полезно.

Но попробуйте vi $(fzf), и вуаля…!


0b3401332091c04d33bc3fed73b56de7.gif


Вы получаете возможность нечёткого поиска в редакторе!

(Кстати, в данном случае в vi нет ничего уникального. Можно вызывать команду с emacs, nano, code и любым другим редактором!)

vi $(find. '/' | fzf): для поиска произвольных файлов конфигурации


Однажды я попытался создать свою первую автоматическую перезагрузку при помощи расширения Firefox, entr и nginx. И у меня возник вопрос: где же находится nginx.conf?

Я составил список возможных действий. Можно было:

  1. Воспользоваться полузабытыми знаниями FHS, чтобы попытаться угадать при помощи trees и grep, или
  2. Просто крепко запомнить местонахождение и ощущать своё превосходство над всеми остальными, или
  3. Присоединить пайпом find.»/» к fzf и начать поиск.


b0c8e92e036fd281709a5f9a39a2fc05.gif


Мне очень нравится этот клип, потому что в нём показаны некоторые тонкости использования fzf, а также одна из наиболее продвинутых функций поиска — поиск conf$ отфильтровывает все строки, которые не заканчиваются на conf. Обратите внимание, что fzf временно сходит с ума, когда find сталкивается с кучей ошибок «Permission denied», но спустя несколько секунд приходит в себя.

Стоят ли платить этими лишними секундами за возможность нахождения файлов конфигурации таким не требующим мыслительных усилий способом? На мой взгляд, да.

Ещё меньше проблем: vi **


Спасибо sigmonsays за то, что напомнил мне об этой возможности!

Примерно посередине спектра между «перезаписать сочетания горячих клавиш» и «использовать стандартный fzf» находится «использовать две звёздочки для нечёткого автозаполнения отступов». Вот пример того, как я применяю это для выполнения чего-то похожего на vi $(fzf):

122e1779beeddc932a9cf096686d3cc2.gif


После получения команды всё-таки придётся ещё раз нажать на Enter.

У меня пока не появилось привычки использовать это часто, потому что в реальной жизни это пригождается мне дома только как замена $(fzf), а вызов явным образом мне запомнить намного проще. Думаю, для любителей tab-tab-звёздочки это похоже на то, как мой коллега копипастит вручную из терминала, вместо того, чтобы воспользоваться :read ! echo "Hello world!".

mv $(fzf) $(fzf) — для реально страдающих амнезией


Для случаев, когда вы не помните точно, ни куда вы выполнили перемещение, ни что переместили, но понимаете, что это точно было сделано.

261559a43e7c737586a77acd2cd0840d.gif


Знакомство с rg: с быстрым и рекурсивным по умолчанию grep


Всё, что описано ниже, можно выполнить и при помощи grep, однако истинные возможности rg (также называемого ripgrep) раскрывает его рекурсивная по умолчанию природа. Крайне рекомендую скачать его и использовать в показанных ниже примерах. Но если вы боитесь новых инструментов, то не стоит волноваться!

rg . | fzf: нечёткий поиск каждой строки в каждом файле

Итак, теперь мы зашли на территорию настоящей амнезии.

rg . | fzf | cut -d ":" -f 1: нечёткий поиск каждой строки в каждом файле и возврат местоположения файла

vim $(rg . | fzf | cut -d ":" -f 1): нечёткий поиск каждой строки в каждом файле и открытие этого файла

© Habrahabr.ru