%3F.png)
Opágina wiki de exemplos de fzfdescreve como fzf pode ser usado para pesquisar difusamente no conteúdo de todos os arquivos de um diretório. Mas nos exemplos da página wiki, por exemplo, com
ag --nobreak --nonumbers --noheading . | fzf
os arquivos são divididos por linhas e cada linha é tratada separadamente.
Por exemplo um arquivo:
hello
world
não corresponderia ao termo de pesquisa "olá mundo" porque os termos de pesquisa estão em linhas diferentes.
Como posso usar o fzf para que ele pesquise em todo o arquivo e não apenas por linhas?
Responder1
Eu tenho uma solução um tanto suja.
rg --heading --glob "*.txt" . some_directory_path | sed 's/^$/NEWLINEHEREYO/g' | tr '\n' ' ' | sed 's/NEWLINEHEREYO/\n/g' | fzf
explicação:
quando você faz
rg .
em algum lugar, ele imprime a saída no terminal em um formato específico que se perde se você tentar canalizá-la para algum lugar. Acho que o formato é necessário para poder fazer isso com eficiência. Conseqüentemente, o sinalizador --heading que mantém o formato. --glob e o diretório que adicionei apenas porque fiz isso em meu próprio caso de uso e não queria modificar o comando para que não quebrasse - não sou muito bom com computadores.
Em seguida, ele substitui todas as linhas vazias, que delimitam os arquivos, pela tag NEWLINEHEREYO usando sed. Em seguida, ele trunca todos os caracteres de nova linha (o que destruiria as linhas vazias) usando tr, fornecendo uma saída de linha única, que é o que você queria. Em seguida, ele reintroduz as quebras com outro comando sed, convertendo os NEWLINEHEREYOs de volta em quebras de linha para que fzf não as pesquise como se fosse literalmente uma única linha.
É muito ineficiente, mas funciona bem para o meu caso. Acho que os comandos sed, tr e sed provavelmente podem ser mesclados em um, mas sou estúpido demais para fazer isso.