Perché dovresti usare fzf, il fuzzy finder a riga di comando

di Alexey Samoshkin

Missing demo found

In questo tutorial, ti aiuterò a portare le tue abitudini della riga di comando ad un livello superiore con fzf . Inizia a cercare file come un professionista. Impara le caratteristiche meno conosciute, come cambiare directory, cercare nella cronologia dei comandi, cercare il nome dell’host per SSH, uccidere un processo, avere un’anteprima istantanea del file con l’evidenziazione della sintassi, e altro ancora…

piccola demo

Oggi ti parlerò di uno strumento che può cambiare la tua vita tecnologica in “prima” e “dopo”. Credetemi – non è un’iperbole. Vi presento fzf, che sta per fuzzy finder. Come dice la definizione, è un fuzzy finder a riga di comando per scopi generali. Questo non suona molto descrittivo e attraente per coloro che ne sentono parlare per la prima volta. Ma è un progetto molto popolare classificato a circa 21.000 stelle su Github. Perciò è il momento di diradare la nebbia e ottenere una visione più profonda.

Questo post accompagna il mio recente screencast sull’argomento. Quindi, se sei una persona che impara guardando, controllalo. Altrimenti, controllate anche voi, perché strumenti come fzf sono meglio introdotti con una dimostrazione dal vivo piuttosto che con tonnellate di testo.

Come la pagina del progetto fzfnon ha alcun video dimostrativo finora, ho chiamato questo post “demo mancante trovata”. Ma ora, questo video è già stato inserito nel repo fzf ed è diventato parte del readme del progetto.

Ricerca di file

Le persone che sono abituate ad un ambiente a riga di comando hanno probabilmente familiarità con il concetto di filtri Unix. Questo è quando diverse utilità indipendenti sono composte insieme in una pipeline per produrre l’output desiderato passo dopo passo. Per esempio, questa pipeline produce una lista di stringhe:

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

Ogni programma agisce come un filtro. In termini semplici, fzf è solo un altro filtro Unix. Legge le righe da stdin, lancia un dialogo interattivo di ricerca e infine scrive gli elementi selezionati in stdout. Il punto chiave e la differenza rispetto a strumenti come GNU find, è il suo dialogo interattivo di ricerca che filtra gli elementi istantaneamente mentre si digita.

“fzf” come filtro unix interattivo

Potrebbe non sembrare troppo pratico finora, ma il caso d’uso primario per fzf è la ricerca di file sulla riga di comando. Con la corrispondenza fuzzy e il feedback istantaneo, sei solo a pochi caratteri di distanza dal trovare il file giusto, non importa quanto profondamente sia perso nella gerarchia delle directory. Non c’è bisogno di saltare indietro al vostro file manager, attraversare la gerarchia delle directory, copiare il percorso di un file e incollarlo di nuovo nella shell. Confronta i flussi di lavoro “file manager” e “fzf” qui sotto.

confronto fzf vs file manager

fzf supporta il fuzzy matching così puoi semplicemente digitare diversi caratteri in una riga e corrisponderà alle linee con quei caratteri sparsi nella stringa. In alternativa, prefissa un termine di ricerca con un singolo apice, come 'string, per optare solo per le corrispondenze esatte, o esegui come fzf --exact .

fuzzy vs exact match

Non supporta espressioni regolari o glob patterns, quindi il pattern *.sh non funzionerebbe. Ma tenetelo semplice – la produttività e la velocità sono il vostro obiettivo oggi. Non avete tempo libero per comporre e digitare espressioni regolari corrette. Invece basta digitare diverse parole, o anche parti di parole, delimitate da uno spazio, e questo coprirebbe il >90% dei casi d’uso. Per il restante 10%, use ^ and $ per abbinare rispettivamente l’inizio e la fine della stringa, e use ! per negare l’abbinamento.

sintassi di abbinamento di fzf

Stampare i file selezionati su una linea di comando non è super utile, quindi di solito la ricerca è combinata con qualche altra azione. Per esempio, potreste aprirlo con Vim, o fare un pipe degli elementi selezionati al programma successivo.

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

Completamento fuzzy per bash e zsh

Per renderlo più conveniente, il completamento fuzzy può essere attivato se la parola prima del cursore termina con la sequenza di trigger che è di default **. Per esempio, digitate vim ~/path/** e premete TAB . Voilà, fzf interviene!

La sequenza fuzzy completion a doppia stella

** attiva fzf finder e assomiglia a * che è per l’espansione nativa della shell. Ad un certo punto, potreste anche dimenticare la presenza di fzf e avere l’impressione che sia una caratteristica nativa della shell.

Il formato è il seguente, dove FUZZY_PATTERN è opzionale.

COMMAND **<TAB>

Se non vi piace la sequenza **, potete usare le scorciatoie da tastiera. CTRL+T attiva fzf e incolla il file selezionato sulla linea di comando, mentre ALT+C cambia nella directory selezionata.

Cambio directory

Ok, basta con la ricerca dei file. Parliamo di altre applicazioni utili. Cambiare la directory di lavoro è un’operazione così comune. Ma tuttavia mi blocco sempre un po’ cercando di ricordare e digitare il giusto percorso della directory, facendo diversi errori lungo la strada. Questo rallenta il mio tempo. Anche i completamenti di zsh non compensano. Ma con fzf, cambiare directory è un gioco da ragazzi, non importa quanto sia profondo e lontano. Basta digitare cd ** e ci sei quasi.

cambiare directory è un gioco da ragazzi

Si noti che mentre fzf indicizza l’albero delle directory, si può iniziare subito la ricerca. Cambiare directory è il mio caso d’uso preferito, e il fuzzy matching eccelle davvero qui. Richiede lo stesso sforzo per cambiare una directory, che sia di un livello o di dieci livelli.

ALT+CLa scorciatoia è un modo alternativo per attivare fzf in modalità cambio directory.

Storia dei comandi

Potresti usare Ctrl+Rscorciatoia da tastiera per cercare nella tua storia dei comandi. Ottimo, ma che ne dici di sovralimentarlo con il fuzzy finder? Guarda e confronta.

Ricerca nella cronologia dei comandi

Incolla l’elemento selezionato sulla riga di comando, così puoi modificarlo ulteriormente.

Ricerca il nome dell’host in cui SSH

Se sei uno sviluppatore backend e lavori con un certo numero di server remoti, potresti apprezzare la combinazione ssh+fzf. Usa la stessa sequenza di attivazione a doppia stella e digita ssh ** . Tira fuori indirizzi IP e nomi di host usati di recente dal tuo ~/.ssh/config e porta su un finder interattivo.

combo “fzf + ssh”

Invia un segnale a un processo

A volte vogliamo inviare un segnale a un processo, ma prima dobbiamo ottenere il suo PID per nome. Di solito si usa pgrep <process_name> per risolvere il PID seguito by a kill <process_pid> riferendosi a questot PID. Con fzf puoi combinare entrambi i passi steps. Type kill <TAB> e fzf per elencare tutti i tuoi processi. Non c’è più bisogno di passare a un monitor di processo dedicato, come “Activity Monitor” su Mac.

Trova un processo e invia un segnale

Anteprima dei file mentre cerchi

Supponiamo che tu stia cercando dei file, ma a volte il nome stesso del file non ti dice abbastanza. Quindi potresti voler sbirciare il contenuto di un file per un momento per prendere una decisione. fzf ti copre anche qui.

Finestra di anteprima

Di default ho la finestra di anteprima disattivata, ma la attivo quando voglio sbirciare nei file. Inoltre, l’ho migliorata con un output colorato e l’evidenziazione della sintassi usando bat come comando di anteprima.

Personalizzazione

Ci sono due modi principali per personalizzare la versione stock di fzf:

  • Cambiare il comportamento del dialogo finder (finestra di anteprima, scorciatoie da tastiera, dimensioni, azioni personalizzate, ecc). Vedi la variabile d’ambiente FZF_DEFAULT_OPTS.
  • Cambia il backend di ricerca sottostante. Di default usa l’utilità GNU find, ma puoi passare a strumenti più avanzati come fd o ripgrep. Primo, è più veloce dell’utilità find di serie. Secondo, questi strumenti rispettano le regole .gitignore, quindi non si ottengono file node_modules o .git nei risultati della ricerca. Puoi anche usare git ls-tree per elencare i file quando sei in un repo Git. Vedi la variabile d’ambiente FZF_DEFAULT_COMMAND.

La configurazione è fatta attraverso le variabili d’ambiente. Ecco lo snippet della mia configurazione. Non sono sicuro che funzionerebbe così com’è quando viene copiato e incollato, molto probabilmente ci sono altre dipendenze mancanti. Ma questo è solo per darvi un’idea di come appare la configurazione.

Fzf e Vim

Finora abbiamo visto solo l’uso della riga di comando. Ma fzf è anche distribuito come plugin per Vim. E credetemi, se siete un Vim, vale la pena aggiungerlo al vostro vimrc. L’uso di Vim è fuori dallo scopo di questo post, altrimenti nessuno lo leggerebbe. Ma ne parlo approfonditamente nella seconda parte del mio video, anch’esso collegato all’inizio del post.

Se siete impazienti, ecco un piccolo estratto per attirare la vostra attenzione. Usa il comando :grep per la ricerca di testo in tutto il progetto, apri le corrispondenze nella finestra fzf in modalità schermo intero, filtra ulteriormente le corrispondenze all’interno di fzf e salta alla corrispondenza selezionata. E non dimenticare l’anteprima istantanea del file nella posizione precisa della linea. È fantastico, vero?

fzf ❤️ vim

Conclusione

Spero tu sia impressionato da quanto sia super fantastico fzf. È probabile che tu voglia già installarlo e provarlo.

Tenete a mente che fzf non è solo per la ricerca di file, anche se è la sua caratteristica principale. Come puoi vedere, “ricerca + azione” è un principio generale, ma è abbastanza astratto e potente per lavorare con qualsiasi tipo di elenco: file, directory, processi, nomi di host, ecc. Ricordate all’inizio di questo post – fzf è solo un filtro Unix. Liberate la vostra immaginazione, dategli in pasto qualsiasi lista e adattatela ai vostri bisogni. Potresti trarre ispirazione da una grande quantità di esempi.

BTW, apprezza quanto sia superiore la filosofia Unix. fzf è un grande esempio di un programma che aderisce a questi principi.

  • Lasciate che il programma faccia una cosa sola e la faccia bene (principio della responsabilità singola)
  • fate che sia abbastanza astratto da essere agnostico rispetto a dettagli o tipi di dati irrilevanti
  • componete programmi individuali separati usando interfacce standard ben definite.

Aderite a questi principi nella vostra carriera di sviluppo software. Conoscere i principi fondamentali che stanno dietro la rapida nascita e morte di molteplici strumenti, linguaggi e framework là fuori è ciò che differenzia gli sviluppatori professionisti dai dilettanti.

Risorse

junegunn/fzf: A command-line fuzzy finder – https://github.com/junegunn/fzf

L’universo di Vim. fzf – command line fuzzy finder – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

Il mio canale Youtube. Ci sono solo pochi video, perché sto facendo i miei primi passi nel fare screencast. Siate pazienti, prometto di fare più video. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Un’alternativa semplice, veloce e user-friendly a ‘find’ – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep cerca ricorsivamente nelle directory un modello regex – https://github.com/BurntSushi/ripgrep

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.