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….
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.
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
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
.
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%, us
e ^ an
d $ para combinar o início e fim da string respectivamente, e us
e ! para negar a combinação.
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!
**
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á.
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.
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.
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_na
me> para resolver o PID seguido de by a kill <pro
cess_pid> referindo that P
ID. Com fzf você pode combinar os passos steps. Typ
e 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.
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. fzf
Cobre-o aqui também.
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 stockfind
. Segundo, essas ferramentas respeitam.gitignore
regras, para que você não recebanode_modules
ou.git
arquivos nos resultados da sua busca. Você também pode usargit ls-tree
para listar arquivos quando você estiver em uma repo Git. VejaFZF_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 é?
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