- PVSM.RU - https://www.pvsm.ru -
Я работаю в MacOS, почти не использую Finder и все время провожу в консоли. Именно поэтому стараюсь сделать работу из консоли как можно более удобной.
Относительно недавно мне на глаза попалась утилита FZF [1]. И уже через неделю стала незаменимой.
FZF представляет возможность нечеткого поиска в стиле UNIX: умеет быстро и относительно хорошо искать по строкам, которые передали ей на вход, и интегрироваться с другими моими любимыми программами.
Я с удивлением обнаружил, что об этой программе нет ни одной статьи на хабре, кроме некоторых упоминаний вскользь [2]. Я решил восполнить этот пробел. Если вы уже знаете о FZF, то статья скорее всего покажется вам неинформативной, а всем остальным добро пожаловать
У нас в Wrike [3] под каждую задачу должна быть создана своя ветка. В имени ветки в том числе есть номер тикета. Хочешь переключиться — помни название и номер. Или ищи. Ищу я примерно так:
git branch -a | grep слово_из_названия_ветки
Только вместо grep использую ripgrep
git branch -a | rg слово_из_названия_ветки
Но каждый раз набирать эту длинную команду лень. Да и вместо angular у меня часто получается agnular. Короче, одно расстройство. Поэтому достаточно в .zshrc или .bashrc прописать простенькую функцию (взята из документации).
fbr() {
local branches branch
branches=$(git branch --all | grep -v HEAD) &&
branch=$(echo "$branches" |
fzf-tmux -d $(( 2 + $(wc -l <<< "$branches") )) +m) &&
git checkout $(echo "$branch" | sed "s/.* //" | sed "s#remotes/[^/]*/##")
}
И теперь можно поискать по всем веткам. Выглядит это следующим образом:
Примерно так же можно убить зависший процесс. Только функция теперь будет называться fkill
fkill() {
local pid
pid=$(ps -ef | sed 1d | fzf -m | awk '{print $2}')
if [ "x$pid" != "x" ]
then
echo $pid | xargs kill -${1:-9}
fi
}
FZF поддерживает множественный выбор. То есть при помощи кнопки Tab можно выбирать строку а по Enter отправлять все выбранное на вывод (если, конечно, запустить FZF с флагом -m).
Я использую пакет all-the-package-names, чтобы загружать все имена пакетов, которые есть в официальном регистре пакетов npm:
npm -g i all-the-package-names
Дальше пишу совсем простую функцию:
fnpm() {
local packages
packages=$(all-the-package-names | fzf -m) &&
echo "$packages" &&
npm i $(echo $packages)
}
И все. Теперь можно делать как-то так:
Очень много полезных примеров есть в документации [4].
На просторах github я нашел еще две утилиты, которые делают примерно то же самое:
GitHub — jhawthorn/fzy: A better fuzzy finder [5]
GitHub — calleerlandsson/pick: A fuzzy search tool for the command-line [6]
Если вы съели собаку в написании скриптов под Bash или Zsh, то статья скорее всего покажется вам наивной. Возможно, вы даже знаете, как улучшить примеры, которые я привел. А может, уже давно используете FZF у себя, и вам есть что сказать.
Если так, то пишите в комментариях и я обязательно обновлю и дополню статью вашими примерами и замечаниями.
Автор: zolotyh
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bash/270792
Ссылки в тексте:
[1] FZF: https://github.com/junegunn/fzf
[2] вскользь: https://habrahabr.ru/post/323496/
[3] Wrike: http://wrike.com
[4] документации: https://github.com/junegunn/fzf/wiki/examples
[5] GitHub — jhawthorn/fzy: A better fuzzy finder: https://github.com/jhawthorn/fzy
[6] GitHub — calleerlandsson/pick: A fuzzy search tool for the command-line: https://github.com/calleerlandsson/pick
[7] Источник: https://habrahabr.ru/post/344770/?utm_campaign=344770
Нажмите здесь для печати.