- PVSM.RU - https://www.pvsm.ru -
Разработчики ПО — если не единственные, то практически единственные, кому очень просто создавать инструменты для улучшения своей профессиональной работы; однако со временем это усложняет жизнь людям, постоянно переключающимся между разными инструментами и не вкладывающим время в глубокое изучение своего инструментария. Имея глубокое уважение к негласным знаниям людей лучше меня [1], я всё же считаю, что отличная эвристика 80/20 заключается в том, чтобы изучать старые добрые инструменты Unix cat
, ls
, cd
, grep
и cut
. (а если вам повезло устроиться на должность настоящего современного сисадмина, то ещё и sed
с awk
.)
Однако существуют инструменты, выгода от использования которых настолько мгновенна и ценность от применения настолько уникальна, что эвристика 80/20 полностью к ним неприменима. Один из них — это fzf
. И меня очень печалит то, что многие скачивают его, запускают в командной строке «как есть», а потом просто мотают головой и произносят: «Я не понимаю».
Мне хотелось бы изменить ситуацию. Предположим, что вы работаете на более-менее стандартной машине с Ubuntu. Вы только что установили fzf
при помощи стандартного скрипта установки [2]. Что же дальше?
В большинстве терминалов, как в Linux, так и в Windows Ctrl+R
позволяет выполнять поиск в обратном порядке введённых команд. Возможно вы, как и я, не слышали об этом до сего момента, несмотря на то, что работаете с шеллом уже десяток лет; причина в том, что базовая версия этого ПО неудобна по двум причинам:
fzf
— довольно странная программа, потому что её установка [2] полностью перезаписывает целую кучу горячих клавиш, чтобы сделать их лучше. В обычной ситуации мне бы это не понравилось. Но…
… Это существенное улучшение по сравнению с тем, что было.
(Стоит заметить, что установка fzf
через менеджер пакетов наподобие apt
может и не дать такого результата! Именно поэтому я продолжаю намекать, что следует использовать скрипт установки [2], даже если вы согласны со мной в том, что curl | bash
— это зло!)
Допустим, вы запускаете пустой терминал. Вы пытаетесь быстро найти свои репозитории хобби-проектов и перейти к ним с помощью cd
, но вы уже несколько недель не работали с ними, потому что ваша основная работа необычайно интересна и увлекательна… Как их найти?
Ответ: с помощью fzf
. fzf
превращает Alt+C
в сочетание горячих клавиш для тюнингованного cd
с нечётким поиском и позволяет очень быстро перемещаться, когда единственное, что вы смутно помните — имя нужной папки.
Итак, мы разобрались с горячими клавишами. Откровенно говоря, эти две функции сами по себе представляют основную ценность, получаемую мной от fzf
, но давайте всё-таки посмотрим, что делает сама эта команда.
Она выполняет нечёткий поиск местоположений файлов! По крайней мере, относительно вашей собственной папки. Само по себе это не особо полезно.
Вы получаете возможность нечёткого поиска в редакторе!
(Кстати, в данном случае в vi
нет ничего уникального. Можно вызывать команду с emacs
, nano
[3], code
и любым другим редактором!)
Однажды я попытался создать свою первую автоматическую перезагрузку при помощи расширения Firefox, entr
и nginx
. И у меня возник вопрос: где же находится nginx.conf
?
Я составил список возможных действий. Можно было:
trees
и grep
, илиfind
. ‘/’ к fzf
и начать поиск.
Мне очень нравится этот клип, потому что в нём показаны некоторые тонкости использования fzf
, а также одна из наиболее продвинутых функций поиска — поиск conf$
отфильтровывает все строки, которые не заканчиваются на conf
. Обратите внимание, что fzf
временно сходит с ума, когда find
сталкивается с кучей ошибок «Permission denied», но спустя несколько секунд приходит в себя.
Стоят ли платить этими лишними секундами за возможность нахождения файлов конфигурации таким не требующим мыслительных усилий способом? На мой взгляд, да.
Спасибо sigmonsays [4] за то, что напомнил мне об этой возможности!
Примерно посередине спектра между «перезаписать сочетания горячих клавиш» и «использовать стандартный fzf» находится «использовать две звёздочки для нечёткого автозаполнения отступов». Вот пример того, как я применяю это для выполнения чего-то похожего на vi $(fzf)
:
После получения команды всё-таки придётся ещё раз нажать на Enter
.
У меня пока не появилось привычки использовать это часто, потому что в реальной жизни это пригождается мне дома только как замена $(fzf)
, а вызов явным образом мне запомнить намного проще. Думаю, для любителей tab-tab-звёздочки это похоже на то, как мой коллега копипастит вручную из терминала, вместо того, чтобы воспользоваться :read ! echo "Hello world!"
.
Для случаев, когда вы не помните точно, ни куда вы выполнили перемещение, ни что переместили, но понимаете, что это точно было сделано.
Всё, что описано ниже, можно выполнить и при помощи grep
, однако истинные возможности rg
(также называемого ripgrep
) раскрывает его рекурсивная по умолчанию природа. Крайне рекомендую скачать его и использовать в показанных ниже примерах. Но если вы боитесь новых инструментов, то не стоит волноваться!
rg . | fzf
: нечёткий поиск каждой строки в каждом файле
Итак, теперь мы зашли на территорию настоящей амнезии.
rg . | fzf | cut -d ":" -f 1
: нечёткий поиск каждой строки в каждом файле и возврат местоположения файла
vim $(rg . | fzf | cut -d ":" -f 1)
: нечёткий поиск каждой строки в каждом файле и открытие этого файла
Автор:
PatientZero
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/386327
Ссылки в тексте:
[1] негласным знаниям людей лучше меня: https://commoncog.com/how-to-learn-tacit-knowledge/
[2] при помощи стандартного скрипта установки: https://github.com/junegunn/fzf#using-git
[3] nano
: https://ariadne.space/2021/08/13/gnu-nano-is-my-editor-of-choice/
[4] sigmonsays: https://news.ycombinator.com/item?id=35249935
[5] Источник: https://habr.com/ru/articles/724070/?utm_source=habrahabr&utm_medium=rss&utm_campaign=724070
Нажмите здесь для печати.