Я работаю в MacOS, почти не использую Finder и все время провожу в консоли. Именно поэтому стараюсь сделать работу из консоли как можно более удобной.


Относительно недавно мне на глаза попалась утилита FZF. И уже через неделю стала незаменимой.


FZF представляет возможность нечеткого поиска в стиле UNIX: умеет быстро и относительно хорошо искать по строкам, которые передали ей на вход, и интегрироваться с другими моими любимыми программами.


Я с удивлением обнаружил, что об этой программе нет ни одной статьи на хабре, кроме некоторых упоминаний вскользь. Я решил восполнить этот пробел. Если вы уже знаете о FZF, то статья скорее всего покажется вам неинформативной, а всем остальным добро пожаловать


Переключение на нужную ветку в git


У нас в Wrike под каждую задачу должна быть создана своя ветка. В имени ветки в том числе есть номер тикета. Хочешь переключиться — помни название и номер. Или ищи. Ищу я примерно так:


 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
}


Установка нужного npm пакета


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)
}

И все. Теперь можно делать как-то так:



Другие примеры


Очень много полезных примеров есть в документации.


Альтернативы


На просторах github я нашел еще две утилиты, которые делают примерно то же самое:
GitHub — jhawthorn/fzy: A better fuzzy finder
GitHub — calleerlandsson/pick: A fuzzy search tool for the command-line


Вместо вывода


Если вы съели собаку в написании скриптов под Bash или Zsh, то статья скорее всего покажется вам наивной. Возможно, вы даже знаете, как улучшить примеры, которые я привел. А может, уже давно используете FZF у себя, и вам есть что сказать.


Если так, то пишите в комментариях и я обязательно обновлю и дополню статью вашими примерами и замечаниями.

Комментарии (2)


  1. Dreyk
    15.12.2017 13:26

    довольно прикольно


    немного оффтоп: можно ваш .bashrc весь посмотреть (на предмет стрелочек и крестиков)


    1. zolotyh Автор
      15.12.2017 14:03

      У меня .zshrc. Там нет ничего особо интересного. Я использую oh-my-zsh и многие вещи из доков по FZF. Расшарить не могу, потому что нужно чистить от кода, который лучше не показывать, потому что небезопасно и стыдно