1 pontos por GN⁺ 4 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • O fzf melhora imediatamente a busca no histórico de comandos com Ctrl+R, trocando-a por uma busca difusa
  • Com Alt+C, dá para ir rapidamente a um diretório de trabalho antigo sem saber o caminho exato
  • O comando fzf pode ser combinado com substituição de comando para abrir imediatamente o arquivo selecionado no vi, emacs ou code
  • Ao passar a saída do find para o fzf, fica fácil localizar arquivos de configuração cujo local você não sabe, como nginx.conf
  • rg. | fzf permite abrir o arquivo desejado usando como pista uma linha do conteúdo, em vez do nome do arquivo

O valor imediato que você ganha logo após instalar o fzf

  • Engenheiros de software conseguem criar facilmente ferramentas para melhorar o próprio trabalho, mas, se ficarem alternando entre várias ferramentas sem aprendê-las a fundo, o custo aumenta com o tempo
  • Uma boa heurística 80/20 é primeiro dominar ferramentas Unix antigas como cat, ls, cd, grep e cut; em funções modernas de administração de sistemas, isso também inclui sed e awk
  • O fzf pode ser visto como uma exceção a essa heurística, porque seu retorno sobre o investimento é imediato e seu valor é único
  • O ponto principal são os recursos que já ficam disponíveis logo após instalar pelo script de instalação do fzf em um ambiente Ubuntu padrão

Efeito imediato dos atalhos padrão

  • Ctrl+R: transforma o histórico de comandos em busca difusa

    • Na maioria dos terminais Linux e Windows, Ctrl+R oferece busca reversa de comandos
    • O Ctrl+R padrão exige correspondência exata para achar o comando desejado e mostra apenas uma prévia por vez, então basta errar uma letra para ficar difícil encontrá-lo
    • Ao instalar o fzf, vários atalhos de teclado passam a ser sobrescritos com comportamentos melhores, e o Ctrl+R também melhora bastante em relação ao modo antigo
    • Se você instalar por um gerenciador de pacotes como apt, essa integração de atalhos pode não vir incluída; por isso faz sentido usar o script de instalação do fzf
  • Alt+C: vá rapidamente para diretórios que você só lembra vagamente

    • O fzf transforma Alt+C em um atalho de cd difuso aprimorado
    • Você pode navegar rápido quando não lembra o caminho exato de um diretório, mas ainda recorda mais ou menos o nome
    • É útil para encontrar repositórios antigos ou diretórios de trabalho que você não visita há algum tempo a partir de um terminal vazio

O próprio comando fzf e combinações com o shell

  • fzf básico

    • Executar o comando fzf sozinho faz uma busca difusa por caminhos relativos de arquivos com base no diretório atual
    • Sozinho, ele serve basicamente para escolher a localização de um arquivo, então sua utilidade é limitada
  • vi $(fzf)

    • Quando combinado com substituição de comando, como em vi $(fzf), você pode abrir diretamente no editor o arquivo escolhido pela busca difusa
    • Essa ideia não tem nada de especial para o vi; também funciona com emacs, nano, code ou qualquer editor que você prefira
  • vi $(find . '/' | fzf)

    • Ao combinar find . '/' | fzf com um editor, você pode abrir um arquivo de configuração cujo local desconhece pesquisando difusamente entre candidatos com caminho completo
    • Ao procurar um arquivo como nginx.conf, em vez de tentar adivinhar com base no FHS ou decorar o local, basta enviar a saída do find para o fzf
    • Se você buscar por algo como conf$, dá para filtrar só as linhas que terminam em conf
    • Se o find encontrar muitos erros Permission denied, o fzf pode oscilar por um instante, mas se recupera depois de alguns segundos
    • Esses poucos segundos de atraso são o trade-off pela conveniência de localizar arquivos de configuração de um jeito muito simples
  • vi **<TAB>

    • Um recurso citado em um comentário do sigmonsays no Hacker News: entre sobrescrever atalhos e executar fzf diretamente, existe a completação difusa com tab usando dois asteriscos
    • vi **<TAB> também pode ser usado para escolher arquivos de forma parecida com vi $(fzf)
    • Depois que o comando é completado, ainda é preciso apertar Enter mais uma vez
    • Funciona bem no bash e no zsh, mas pode não funcionar no fish
    • Se for mais fácil lembrar do uso explícito de $(fzf), talvez você não use esse recurso com tanta frequência

Usando fzf também para mover arquivos

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf) serve quando você não lembra exatamente o que quer mover nem para onde, mas tem pistas bem específicas sobre cada lado
    • A ideia é escolher com dois fzf: um para o item a mover e outro para o destino
    • Isso pode acabar sendo usado com frequência ao reorganizar arquivos, como ao colocar GIFs em um README do GitHub
    • Como exemplo relacionado, há o README do modo interativo do finstem

Busca difusa até no conteúdo dos arquivos com rg

  • rg: um grep rápido com busca recursiva por padrão

    • A combinação abaixo também pode ser feita com grep, mas rg, ou ripgrep, se destaca nesse caso porque a busca recursiva já é o padrão
    • Para acompanhar os exemplos, é recomendável instalar e usar rg
  • rg . | fzf

    • rg . envia como resultado de busca cada linha dos arquivos, e, ao passar isso para o fzf, você pode fazer busca difusa em todas as linhas de todos os arquivos
    • Assim, em vez do nome do arquivo, a pista passa a ser o conteúdo de uma linha dentro dele
  • rg . | fzf | cut -d ":" -f 1

    • Ao adicionar cut -d ":" -f 1 ao resultado escolhido com rg . | fzf, você retorna o primeiro campo separado por dois-pontos, ou seja, a localização do arquivo
    • É uma combinação para buscar difusamente pelo conteúdo de uma linha e obter apenas o caminho do arquivo que contém essa linha
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) faz busca difusa em todas as linhas de todos os arquivos e depois abre no vim o arquivo que contém a linha selecionada
    • Quando você não lembra o nome do arquivo e só se recorda de parte do conteúdo, isso permite seguir direto para o editor

1 comentários

 
GN⁺ 4 시간 전
Opiniões no Lobste.rs
  • Parece que o público-alvo deste texto sou exatamente eu. Instalei o fzf, achei “genial”, mas acabava sempre esquecendo de usar; agora talvez eu passe a usar

    • O ponto principal é integrá-lo à configuração do shell existente, scripts pessoais e aliases. Eu uso fzf o tempo todo, mas quase nunca o executo diretamente
  • Pode até ser um bom texto, mas se o objetivo é responder “o que fazer agora?”, começar pela integração com o shell do fzf dá a sensação de falar com um público mais restrito
    Estou acostumado a usar ctrl-r no bash, então pedir para trocar isso parece exigir demais. Eu preferiria que mostrasse primeiro como praticar o mesmo comportamento sem substituir o padrão

    • Na prática, é mais um padrão aprimorado. Faz sentido deixá-lo substituir o ctrl-r, e metade do apelo principal está em manter uma ação já familiar, com um fluxo quase igual ao de antes, mas com uma experiência mais rica
      ctrl-r provavelmente é o comando que mais uso, e o fzf foi uma melhoria que se encaixou de imediato, sem curva de aprendizado. Como ele é acionado com ctrl-r, eu também não esqueço de usar o fzf. Depois acabei migrando para o Fish shell, onde esse mesmo comportamento já vem por padrão
  • Fui convencido. Vou adicionar integração com o shell ao fzf em breve, e hoje aprendi uma coisa nova

  • Ao procurar arquivos para colocar em um comando, também dá para usar o atalho ctrl-t. Eu uso bastante com git para escolher arquivos incluídos em uma alteração específica, e também já usei para filtrar a saída do grep e reduzir o escopo da busca

  • Além de melhorar a busca no histórico do shell, também venho usando fzf com estes dois aliases
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    Uso principalmente para escolher quais branches locais apagar depois de mesclar pull requests. Talvez exista uma forma melhor, mas até hoje nunca falhou
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    Isso me permite trocar rapidamente o AWS_PROFILE com base nos valores em ~/.aws/config. Agora estou pensando em criar um alias parecido para trocar de namespace no Kubernetes

  • Se você usar o plugin fzf.vim, poderá usar o fzf dentro do vim. Não só para abrir arquivos, mas também para fazer busca difusa em buffers, histórico de comandos, conteúdo de arquivos etc.

  • O principal uso do fzf para mim é percorrer e pesquisar um histórico linear de commits do Git para entender o que mudou recentemente
    Na minha configuração padrão do Git, defini git fzf assim

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • Acho que estou deixando passar alguma coisa. Fico me perguntando por que alguém instalaria o fzf sem saber o que fazer com ele

  • Também houve um texto relacionado recentemente. Um usuário está usando o fzf como seletor de arquivos para o jj
    https://lobste.rs/s/exlogg/jjj