DEV Community

Rafael Dutra for apsis-cc

Posted on

Fzf - o que é, como instalar e onde usar no dia a dia

1. O problema que o Fzf resolve

Quem vive no terminal conhece a cena: Ctrl+R para buscar um comando no histórico, mas a busca é linear e só mostra um resultado por vez; cd para um diretório profundo, mas é preciso lembrar (ou digitar) o caminho inteiro; git checkout para uma branch, mas primeiro é necessário rodar git branch e copiar o nome exato. Em todos esses casos, o gargalo é o mesmo: escolher um item entre muitos, digitando cada vez mais texto até sobrar só um.

O fzf (fuzzy finder) resolve isso de um jeito genérico: ele pega qualquer lista de linhas — histórico de comandos, arquivos, branches, processos, o que for — e transforma essa lista em um filtro interativo, digitado em tempo real, onde não é preciso acertar a grafia exata nem a ordem das letras. Basta digitar pedaços do que se lembra e o fzf ordena os resultados por relevância.

2. O que é o Fzf

Fzf é um filtro de linha de comando escrito em Go, de código aberto, mantido por Junegunn Choi. Ele não sabe nada sobre arquivos, git ou processos — a única coisa que ele faz é ler linhas da entrada padrão (stdin) e devolver, na saída padrão (stdout), a linha (ou linhas) selecionada interativamente. Essa simplicidade é o que o torna tão versátil: qualquer comando que produza uma lista de texto pode ser "encanado" (|) para dentro do fzf.

# a ideia básica: qualquer lista vira um menu interativo
ls | fzf
history | fzf
git branch | fzf
ps aux | fzf
Enter fullscreen mode Exit fullscreen mode

Na prática, o fzf raramente é usado sozinho dessa forma — o valor real aparece quando ele é integrado ao shell e a outras ferramentas, o que este artigo cobre a partir da próxima seção.

3. Instalando o Fzf

O fzf está disponível nos principais gerenciadores de pacote:

# Debian/Ubuntu
sudo apt install fzf

# Fedora
sudo dnf install fzf

# Arch Linux
sudo pacman -S fzf

# macOS (Homebrew)
brew install fzf
Enter fullscreen mode Exit fullscreen mode

Também é possível instalar via git, o que traz um script auxiliar de configuração dos atalhos de shell (usados na próxima seção):

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Enter fullscreen mode Exit fullscreen mode

O instalador pergunta se deseja habilitar os atalhos de autocompletar e os bindings de tecla — vale responder "sim" às duas perguntas, é exatamente o que torna o fzf útil no dia a dia. Depois de instalado, confirme a versão:

fzf --version
Enter fullscreen mode Exit fullscreen mode

4. Integração com o shell: os três atalhos essenciais

A maior parte do valor do fzf no terminal vem de três atalhos de teclado que ele registra no shell (bash, zsh ou fish) depois de configurado:

Atalho Ação
Ctrl+R Busca fuzzy no histórico de comandos
Ctrl+T Insere o caminho de um arquivo/diretório selecionado na linha
Alt+C Muda (cd) para um diretório selecionado, buscando abaixo do atual

Ctrl+R substitui a busca reversa padrão do shell (que já usa Ctrl+R, mas de forma linear e sem preview) por uma lista filtrável de todo o histórico, digitando qualquer parte do comando lembrado. Ctrl+T, no meio de qualquer comando, abre uma busca de arquivos a partir do diretório atual e insere o caminho escolhido na posição do cursor — útil para não precisar digitar caminhos longos por completo. Alt+C faz o mesmo, mas para navegar diretamente para dentro de um diretório.

Se a instalação via apt/dnf/pacman não habilitou esses atalhos automaticamente, adicione ao .bashrc ou .zshrc:

# bash
[ -f /usr/share/doc/fzf/examples/key-bindings.bash ] && \
  source /usr/share/doc/fzf/examples/key-bindings.bash
[ -f /usr/share/doc/fzf/examples/completion.bash ] && \
  source /usr/share/doc/fzf/examples/completion.bash

# zsh
source /usr/share/doc/fzf/examples/key-bindings.zsh
source /usr/share/doc/fzf/examples/completion.zsh
Enter fullscreen mode Exit fullscreen mode

(O caminho exato dos exemplos varia por distribuição; ~/.fzf/install resolve isso automaticamente.)

5. Usos no dia a dia

Além dos três atalhos, o fzf combina bem com comandos que já fazem parte da rotina, encanando a saída deles para dentro do filtro:

# trocar de branch git interativamente
git checkout $(git branch --all | fzf | tr -d '* ')

# matar um processo escolhendo da lista
kill -9 $(ps aux | fzf | awk '{print $2}')

# abrir um arquivo no editor, buscando pelo nome
vim $(fzf)

# buscar e copiar um commit específico do log
git log --oneline | fzf
Enter fullscreen mode Exit fullscreen mode

Esses exemplos funcionam porque $(comando | fzf) captura a linha selecionada e a devolve como argumento — o mesmo padrão se aplica a praticamente qualquer ferramenta de linha de comando que aceite um nome ou identificador como argumento.

6. Customizando o Fzf: comando padrão e preview

Por padrão, Ctrl+T e fzf sozinho usam find para listar arquivos, o que inclui diretórios como .git e node_modules e pode ser lento em projetos grandes. É comum substituir isso por uma ferramenta mais rápida, como fd ou rg --files, via a variável FZF_DEFAULT_COMMAND:

# no .bashrc/.zshrc
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
Enter fullscreen mode Exit fullscreen mode

Outro recurso muito usado é o preview, que mostra o conteúdo do item selecionado em um painel lateral enquanto se navega pela lista:

# preview de arquivos com bat (syntax highlighting) ao usar Ctrl+T
export FZF_CTRL_T_OPTS="--preview 'bat --color=always --line-range :50 {}'"

# preview do diff ao buscar branches
git branch | fzf --preview 'git log --oneline --graph --color=always {1} | head -20'
Enter fullscreen mode Exit fullscreen mode

7. Conclusão e próximos passos

Nesta primeira parte, vimos o problema que o fzf resolve, como instalá-lo, os três atalhos de shell que fazem a maior diferença no dia a dia (Ctrl+R, Ctrl+T, Alt+C) e como combiná-lo com outros comandos e personalizar seu comportamento. No próximo artigo, o foco é a integração do fzf com o tmux: como abrir buscas em pop-ups nativos, trocar de sessão ou painel sem sair do teclado, e os plugins que tornam esse combo ainda mais produtivo.


Referências:

  1. fzf — GitHub
  2. fzf — Wiki de exemplos

Top comments (0)