Por que você deve estar usando fzf, o fuzzy finder da linha de comando

by Alexey Samoshkin

Missing demo found

Neste tutorial, vou ajudá-lo a levar seus hábitos de linha de comando para um próximo nível com fzf . Comece a procurar arquivos como um profissional. Aprenda recursos menos conhecidos, como mudar de diretório, pesquisar através de um histórico de comandos, procurar o nome do host para SSH, matar um processo, ter a visualização instantânea do arquivo com destaque de sintaxe, e mais….

demonstração rápida

Hoje vou lhe contar sobre uma ferramenta que pode mudar sua vida tecnológica em partes “antes” e “depois”. Confie em mim – não é uma hipérbole. Conheça o fzf, que significa fuzzy finder. Como a definição diz, é um fuzzy finder de linha de comando de propósito geral. Isso não soa muito descritivo e atraente para aqueles que estão ouvindo sobre isso pela primeira vez. Mas é um projeto muito popular classificado em cerca de 21.000 estrelas no Github. Então é hora de limpar o nevoeiro e obter uma visão mais profunda.

Este post acompanha o meu recente screencast sobre o tema. Então, se você é uma pessoa que aprende assistindo, dê uma olhada. Caso contrário, confira também ?, porque ferramentas como fzf são melhor introduzidas com um demo ao vivo do que toneladas de texto.

Como a página do projeto fzf não tem nenhum vídeo demo até agora, eu chamei este post de “missing demo found”. Mas agora, este vídeo já foi puxado para o repo fzf e tornou-se parte do readme do projeto.

Procura de arquivos

As pessoas que estão acostumadas a um ambiente de linha de comando provavelmente estão familiarizadas com o conceito de filtros Unix. Isto é quando várias utilidades independentes são compostas juntas em um pipeline para produzir a saída desejada passo a passo. Por exemplo, este pipeline produz uma lista de strings:

$ yes | head -10 | awk '{ print NR, NR % 2 == 0 ? "even" : "odd" }'
1 odd2 even3 odd4 even5 odd6 even7 odd8 even9 odd10 even

Cada programa actua como um filtro. Em termos simples, fzf é apenas mais um filtro Unix. Ele lê linhas de stdin, lança um diálogo de busca interativo, e finalmente escreve itens selecionados para stdout. O ponto chave e a diferença de ferramentas como GNU find, é seu diálogo finder interativo que filtra itens instantaneamente enquanto você digita.

“fzf” como um filtro unix interativo

Pode não parecer muito prático até agora, mas o caso de uso primário para fzf é procurar por arquivos na linha de comando. Com a correspondência fuzzy e feedback instantâneo, você está a poucos caracteres de encontrar o arquivo certo, não importa o quão profundamente esteja perdido na hierarquia de diretórios. Não é necessário voltar ao seu gerenciador de arquivos, atravessar a hierarquia de diretórios, copiar o caminho de um arquivo e colá-lo de volta à shell. Compare os fluxos de trabalho “file manager” vs “fzf” abaixo.

fzf vs file manager comparison

fzf suporta a correspondência fuzzy para que você possa apenas digitar vários caracteres em uma linha e ele irá combinar as linhas com aqueles caracteres espalhados ao longo da string. Alternativamente, prefira um termo de busca com uma única citação, como 'string, para optar apenas por correspondência exata, ou execute como fzf --exact .

fuzzy vs correspondência exata

Não suporta expressões regulares ou padrões globais, então *.sh padrão não funcionaria. Mas mantenha-o simples – produtividade e velocidade é o seu objetivo hoje. Você não tem tempo livre para compor e digitar expressões regulares corretas. Em vez disso, basta digitar várias palavras, ou mesmo partes das palavras, delimitadas por um espaço, e isso cobriria >90% dos casos de uso. Para os restantes 10%, use ^ and $ para combinar o início e fim da string respectivamente, e use ! para negar a combinação.

fzf combinando sintaxe

Imprimir arquivos selecionados para uma linha de comando não é super útil, então geralmente a busca é combinada com alguma ação adicional. Por exemplo, você pode abri-lo com Vim, ou pipear itens selecionados para o próximo programa.

# Open file in a Vimvim -o `fzf`
# Print info for each selected filefzf | xargs ls -l

Fuzzy completion para bash e zsh

Para torná-lo mais conveniente, fuzzy completion pode ser acionado se a palavra antes do cursor terminar com a seqüência de acionamento que é por padrão **. Por exemplo, digite vim ~/path/** e pressione TAB . Voilà, fzf entra em!

Conclusão fuzzy de dupla estrela

** dispara a sequência fzf finder e assemelha-se a * que é para a expansão da shell nativa. Em algum momento, você pode até esquecer a presença de fzf e ter a impressão de que é um recurso de shell nativo.

Format é o seguinte, onde FUZZY_PATTERN é opcional.

COMMAND **<TAB>

Se você não gostar da seqüência **, você pode usar atalhos de teclado. CTRL+T activa fzf e cola o ficheiro seleccionado na linha de comandos, enquanto ALT+C muda para o directório seleccionado.

Mudar directório

Ok, já chega de procurar ficheiros. Vamos falar sobre outras aplicações úteis. Mudar seu diretório de trabalho é uma operação muito comum. Mas mesmo assim estou sempre um pouco preso tentando lembrar e digitar o caminho correto do diretório, cometendo vários erros ao longo do caminho. Isso atrasa o meu tempo. Mesmo os complementos zsh não o compensam. Mas com fzf, mudar diretórios é uma brisa, não importa quão profundo e distante seja. Basta digitar cd ** e você está quase lá.

mudar de diretório é como uma brisa

Note que enquanto fzf está indexando sua árvore de diretórios, você pode começar a procurar imediatamente. Mudar diretórios é o meu caso de uso favorito, e fuzzy matching realmente se sobressai aqui. Requer de você o mesmo esforço para mudar um diretório, seja um nível de profundidade ou dez níveis de profundidade.

ALT+C atalho é uma forma alternativa de acionar fzf em um modo de diretório de mudança.

Histórico de comando

Você pode estar usando Ctrl+R atalho de teclado para pesquisar através do seu histórico de comandos. Ótimo, mas que tal supercarregá-lo com o fuzzy finder? Procure e compare.

Procurar através do histórico de comandos

Cola o item selecionado na linha de comando, para que você possa ajustá-lo ainda mais.

Procurar o nome do host para SSH em

Se você é um desenvolvedor backend e trabalha com um número de servidores remotos, você pode apreciar ssh+fzf combo. Use a mesma sequência de disparo de dupla estrela e digite ssh ** . Ele puxa endereços IP e nomes de hosts recentemente usados de seu ~/.ssh/config e traz um localizador interativo.

“fzf + ssh” combo

Enviar um sinal para um processo

Por vezes queremos enviar um sinal para um processo, mas primeiro precisamos obter seu PID pelo nome. Normalmente usa-se pgrep <process_name> para resolver o PID seguido de by a kill <process_pid> referindo that PID. Com fzf você pode combinar os passos steps. Type kill <TAB> e fzf na listagem de todos os seus processos. Não é mais necessário mudar para um monitor de processos dedicado, como “Activity Monitor” no Mac.

>>
Localizar um processo e enviar um sinal

Visualizar ficheiros enquanto procura

Suponha que está a procurar ficheiros, mas por vezes o próprio nome do ficheiro não lhe diz o suficiente. Então você pode querer espreitar o conteúdo de um arquivo por um momento para tomar uma decisão. fzfCobre-o aqui também.

Janela de pré-visualização

Por defeito, tenho a janela de pré-visualização desligada, mas ligo-a quando quero espreitar os ficheiros. Além disso, eu a melhorei com uma saída colorida e destaque de sintaxe usando bat como comando de pré-visualização.

Personalização

Existem duas formas principais de personalizar a versão em estoque de fzf:

  • Alterar o comportamento do diálogo de busca (janela de pré-visualização, atalhos de teclado, dimensões, ações personalizadas, etc). Veja FZF_DEFAULT_OPTS variável de ambiente.
  • Alterar o backend de procura subjacente. Por padrão ele usa o utilitário GNU find, mas você pode mudar para as ferramentas mais avançadas como fd ou ripgrep. Primeiro, é mais rápido do que o utilitário de stock find. Segundo, essas ferramentas respeitam .gitignore regras, para que você não receba node_modules ou .git arquivos nos resultados da sua busca. Você também pode usar git ls-tree para listar arquivos quando você estiver em uma repo Git. Veja FZF_DEFAULT_COMMAND variável de ambiente.

Configuração é feita através das variáveis de ambiente. Aqui está o snippet da minha configuração. Não tenho certeza se funcionaria como quando copiado – colado, muito provavelmente há algumas outras dependências que faltam. Mas isto é apenas para lhe dar uma ideia de como a configuração está.

Fzf e Vim

Até agora vimos apenas a utilização da linha de comandos. Mas fzf também é enviado como um plugin do Vim. E confie em mim, se você é um Vimmer, vale a pena adicionar ao seu vimrc. O uso do Vim está fora do escopo deste post, caso contrário ninguém o leria ?. Mas eu falo sobre ele exaustivamente na segunda parte do meu vídeo, também ligado no início do post.

Se você está impaciente, aqui está um pequeno trecho para chamar sua atenção. Use o comando :grep para procurar texto em todo o projecto, abra as correspondências em fzf num modo de ecrã inteiro, filtre mais correspondências dentro de fzf, e salte para a correspondência seleccionada. E não se esqueça da pré-visualização instantânea do arquivo na posição exata da linha. Isso é fantástico, não é?

fzf ❤️ vim

Conclusion

Espero que esteja impressionado com o quão fantástico é o fzf. É provável que você já esteja disposto a instalar e tentar.

Cuidado que fzf não é apenas para pesquisa de arquivos, embora seja a principal característica do mesmo. Como você pode ver, “search + action” é um princípio geral, mas é abstrato e poderoso o suficiente para trabalhar com qualquer tipo de lista: arquivos, diretórios, processos, nomes de hosts, etc. Lembre-se no início deste post – fzf é apenas um filtro Unix. Desbloqueie sua imaginação, alimente-a com qualquer lista e adapte-a às suas próprias necessidades. Você pode tirar alguma inspiração de uma riqueza de exemplos.

BTW, aprecie o quão superior é a filosofia do Unix. fzf é um grande exemplo de um programa que adere a estes princípios.

  • deixe o programa fazer uma coisa e faça-o bem (princípio da responsabilidade única)
  • faça-o abstrato o suficiente para ser agnóstico de detalhes irrelevantes ou tipos de dados
  • componha programas individuais separados usando interfaces padrão bem definidas.

Fique com estes princípios em sua carreira de desenvolvimento de software. Conhecer princípios fundamentais que estão por trás do rápido nascimento e morte de múltiplas ferramentas, linguagens e frameworks lá fora é o que diferencia desenvolvedores profissionais de amadores.

Recursos

junegunn/fzf: Um fuzzy finder de linha de comando – https://github.com/junegunn/fzf

Vim universo. fzf – fuzzy finder de linha de comando – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

Meu canal Youtube. Existem apenas alguns vídeos, pois estou dando meus primeiros passos para fazer screencasts. Seja paciente, eu prometo fazer mais vídeos. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Uma alternativa simples, rápida e fácil de encontrar – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep procura recursivamente directórios para um padrão regex – https://github.com/BurntSushi/ripgrep

junegunn/fzf.vim: fzf vim – https://github.com/junegunn/fzf.vim

Deixe uma resposta

O seu endereço de email não será publicado.