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…
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 fzf
non 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.
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.
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
.
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%, us
e ^ an
d $ per abbinare rispettivamente l’inizio e la fine della stringa, e us
e ! per negare l’abbinamento.
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!
**
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.
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+C
La scorciatoia è un modo alternativo per attivare fzf
in modalità cambio directory.
Storia dei comandi
Potresti usare Ctrl+R
scorciatoia da tastiera per cercare nella tua storia dei comandi. Ottimo, ma che ne dici di sovralimentarlo con il fuzzy finder? Guarda e confronta.
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.
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_na
me> per risolvere il PID seguito by a kill <pro
cess_pid> riferendosi a questot P
ID. Con fzf puoi combinare entrambi i passi steps. Typ
e 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.
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.
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 filenode_modules
o.git
nei risultati della ricerca. Puoi anche usaregit ls-tree
per elencare i file quando sei in un repo Git. Vedi la variabile d’ambienteFZF_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?
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