![](https://habrastorage.org/webt/4c/vs/rh/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
— довольно странная программа, потому что её установка полностью перезаписывает целую кучу горячих клавиш, чтобы сделать их лучше. В обычной ситуации мне бы это не понравилось. Но…![](https://habrastorage.org/getpro/habr/post_images/847/c2c/4a2/847c2c4a2635023a060d75b7d8a8f439.gif)
… Это существенное улучшение по сравнению с тем, что было.
(Стоит заметить, что установка
fzf
через менеджер пакетов наподобие apt
может и не дать такого результата! Именно поэтому я продолжаю намекать, что следует использовать скрипт установки, даже если вы согласны со мной в том, что curl | bash
— это зло!)… а теперь попробуйте Alt+C
Допустим, вы запускаете пустой терминал. Вы пытаетесь быстро найти свои репозитории хобби-проектов и перейти к ним с помощью
cd
, но вы уже несколько недель не работали с ними, потому что ваша основная работа необычайно интересна и увлекательна… Как их найти?Ответ: с помощью
fzf
. fzf
превращает Alt+C
в сочетание горячих клавиш для тюнингованного cd
с нечётким поиском и позволяет очень быстро перемещаться, когда единственное, что вы смутно помните — имя нужной папки.![](https://habrastorage.org/getpro/habr/post_images/14d/f18/2cd/14df182cd3bc2026917bbe00edba1872.gif)
Основная команда fzf
Итак, мы разобрались с горячими клавишами. Откровенно говоря, эти две функции сами по себе представляют основную ценность, получаемую мной от
fzf
, но давайте всё-таки посмотрим, что делает сама эта команда.![](https://habrastorage.org/getpro/habr/post_images/696/2e6/40f/6962e640f1ec8348ddb95e606c0500b5.gif)
Она выполняет нечёткий поиск местоположений файлов! По крайней мере, относительно вашей собственной папки. Само по себе это не особо полезно.
Но попробуйте vi $(fzf), и вуаля…!
![](https://habrastorage.org/getpro/habr/post_images/0b3/401/332/0b3401332091c04d33bc3fed73b56de7.gif)
Вы получаете возможность нечёткого поиска в редакторе!
(Кстати, в данном случае в
vi
нет ничего уникального. Можно вызывать команду с emacs
, nano
, code
и любым другим редактором!)vi $(find. '/' | fzf): для поиска произвольных файлов конфигурации
Однажды я попытался создать свою первую автоматическую перезагрузку при помощи расширения Firefox,
entr
и nginx
. И у меня возник вопрос: где же находится nginx.conf
?Я составил список возможных действий. Можно было:
- Воспользоваться полузабытыми знаниями FHS, чтобы попытаться угадать при помощи
trees
иgrep
, или - Просто крепко запомнить местонахождение и ощущать своё превосходство над всеми остальными, или
- Присоединить пайпом
find
. ‘/’ кfzf
и начать поиск.
![](https://habrastorage.org/getpro/habr/post_images/b0c/8e9/2e0/b0c8e92e036fd281709a5f9a39a2fc05.gif)
Мне очень нравится этот клип, потому что в нём показаны некоторые тонкости использования
fzf
, а также одна из наиболее продвинутых функций поиска — поиск conf$
отфильтровывает все строки, которые не заканчиваются на conf
. Обратите внимание, что fzf
временно сходит с ума, когда find
сталкивается с кучей ошибок «Permission denied», но спустя несколько секунд приходит в себя.Стоят ли платить этими лишними секундами за возможность нахождения файлов конфигурации таким не требующим мыслительных усилий способом? На мой взгляд, да.
Ещё меньше проблем: vi **<TAB>
Спасибо sigmonsays за то, что напомнил мне об этой возможности!
Примерно посередине спектра между «перезаписать сочетания горячих клавиш» и «использовать стандартный fzf» находится «использовать две звёздочки для нечёткого автозаполнения отступов». Вот пример того, как я применяю это для выполнения чего-то похожего на
vi $(fzf)
:![](https://habrastorage.org/getpro/habr/post_images/122/e17/79b/122e1779beeddc932a9cf096686d3cc2.gif)
После получения команды всё-таки придётся ещё раз нажать на
Enter
.У меня пока не появилось привычки использовать это часто, потому что в реальной жизни это пригождается мне дома только как замена
$(fzf)
, а вызов явным образом мне запомнить намного проще. Думаю, для любителей tab-tab-звёздочки это похоже на то, как мой коллега копипастит вручную из терминала, вместо того, чтобы воспользоваться :read ! echo "Hello world!"
.mv $(fzf) $(fzf) — для реально страдающих амнезией
Для случаев, когда вы не помните точно, ни куда вы выполнили перемещение, ни что переместили, но понимаете, что это точно было сделано.
![](https://habrastorage.org/getpro/habr/post_images/261/559/a43/261559a43e7c737586a77acd2cd0840d.gif)
Знакомство с rg: с быстрым и рекурсивным по умолчанию grep
Всё, что описано ниже, можно выполнить и при помощи
grep
, однако истинные возможности rg
(также называемого ripgrep
) раскрывает его рекурсивная по умолчанию природа. Крайне рекомендую скачать его и использовать в показанных ниже примерах. Но если вы боитесь новых инструментов, то не стоит волноваться!rg . | fzf
: нечёткий поиск каждой строки в каждом файлеИтак, теперь мы зашли на территорию настоящей амнезии.
rg . | fzf | cut -d ":" -f 1
: нечёткий поиск каждой строки в каждом файле и возврат местоположения файлаvim $(rg . | fzf | cut -d ":" -f 1)
: нечёткий поиск каждой строки в каждом файле и открытие этого файла