de Alexey Samoshkin
Demonstrație lipsă găsită
În acest tutorial, vă voi ajuta să vă duceți obiceiurile din linia de comandă la un nivel superior cu fzf
. Începeți să căutați fișiere ca un profesionist. Învățați caracteristici mai puțin cunoscute, cum ar fi schimbarea directorului, căutarea în istoricul comenzilor, căutarea numelui de gazdă în care să intrați prin SSH, uciderea unui proces, obținerea unei previzualizări instantanee a fișierelor cu evidențierea sintaxei și multe altele…
Astăzi vă voi vorbi despre un instrument care vă poate schimba viața tehnologică în părți „înainte” și „după”. Credeți-mă – nu este o hiperbolă. Faceți cunoștință cu fzf, care vine de la fuzzy finder. După cum pretinde definiția, este un fuzzy finder de linie de comandă cu scop general. Asta nu sună foarte descriptiv și atractiv pentru cei care aud despre el pentru prima dată. Dar este un proiect foarte popular, clasat la aproximativ 21.000 de stele pe Github. Așa că este timpul să risipim ceața și să obținem o perspectivă mai profundă.
Această postare însoțește recentul meu screencast pe această temă. Deci, dacă sunteți o persoană care învață uitându-se, verificați-l. În caz contrar, verificați-l și voi ?, pentru că instrumente precum fzf
sunt cel mai bine prezentate cu o demonstrație live, mai degrabă decât cu tone de text.
Deoarece pagina proiectului fzf
nu are niciun video demonstrativ până acum, am numit această postare „demo lipsă găsit”. Dar acum, acest videoclip a fost deja tras în repo-ul fzf
și a devenit o parte din readme-ul proiectului.
Cercetarea fișierelor
Persoanele care sunt obișnuite cu un mediu de linie de comandă sunt probabil familiarizate cu conceptul de filtre Unix. Acesta este atunci când mai multe utilități independente sunt compuse împreună într-o conductă pentru a produce pas cu pas rezultatul dorit. De exemplu, această conductă produce o listă de șiruri de caractere:
$ yes | head -10 | awk '{ print NR, NR % 2 == 0 ? "even" : "odd" }'
1 odd2 even3 odd4 even5 odd6 even7 odd8 even9 odd10 even
Care program acționează ca un filtru. În termeni simpli, fzf
este doar un alt filtru Unix. Acesta citește liniile din stdin
, lansează un dialog interactiv de căutare și, în final, scrie elementele selectate în stdout
. Punctul cheie și diferența față de instrumente precum GNU find
, este dialogul său de căutare interactiv care filtrează elementele instantaneu pe măsură ce tastați.
Poate că nu sună prea practic până acum, dar cazul principal de utilizare pentru fzf
este căutarea de fișiere în linia de comandă. Cu fuzzy matching și feedback instantaneu, sunteți la doar câteva caractere distanță de a găsi fișierul potrivit, indiferent cât de adânc este pierdut în ierarhia directoarelor. Nu este nevoie să săriți înapoi la managerul de fișiere, să parcurgeți ierarhia directoarelor, să copiați calea unui fișier și să o lipiți înapoi în shell. Comparați mai jos fluxurile de lucru „manager de fișiere” vs „fzf”.
fzf
suportă fuzzy matching, astfel încât puteți tasta mai multe caractere la rând și se va potrivi cu liniile cu acele caractere împrăștiate în șir. Alternativ, prefixați un termen de căutare cu un singur ghilimele, cum ar fi 'string
, pentru a opta doar pentru potriviri exacte, sau rulați ca fzf --exact
.
Nu suportă expresii regulate sau tipare globulare, deci modelul *.sh
nu ar funcționa. Dar păstrați-l simplu – productivitatea și viteza sunt obiectivul dvs. astăzi. Nu aveți timp liber să compuneți și să tastați expresii regulate corecte. În schimb, tastați doar câteva cuvinte, sau chiar părți de cuvinte, delimitate de un spațiu, și asta ar acoperi >90% din cazurile de utilizare. Pentru restul de 10%, us
e ^ an
d $ pentru a potrivi începutul și respectiv sfârșitul șirului și us
e ! pentru a nega potrivirea.
Imprimarea fișierelor selectate pe o linie de comandă nu este super utilă, așa că, de obicei, căutarea este combinată cu o altă acțiune. De exemplu, ați putea să o deschideți cu Vim sau să direcționați elementele selectate către următorul program.
# Open file in a Vimvim -o `fzf`
# Print info for each selected filefzf | xargs ls -l
Completare fuzzy pentru bash și zsh
Pentru a fi mai comodă, completarea fuzzy poate fi declanșată dacă cuvântul dinaintea cursorului se termină cu secvența de declanșare care este în mod implicit **
. De exemplu, tastați vim ~/path/**
și apăsați TAB
. Voilà, fzf intervine!
**
declanșează fzf
finder și seamănă cu *
care este pentru expansiunea nativă a shell-ului. La un moment dat, s-ar putea chiar să uitați de prezența lui fzf
și să aveți impresia că este o caracteristică nativă a shell-ului.
Formul este următorul, unde FUZZY_PATTERN
este opțional.
COMMAND **<TAB>
Dacă nu vă place secvența **
, puteți folosi comenzi rapide de la tastatură. CTRL+T
declanșează fzf
și lipește fișierul selectat pe linia de comandă, în timp ce ALT+C
se schimbă în directorul selectat.
Schimbarea directorului
Ok, destul despre căutarea fișierelor. Haideți să vorbim despre alte aplicații utile. Schimbarea directorului de lucru este o operațiune atât de comună. Dar, cu toate acestea, mă blochez întotdeauna un pic încercând să-mi amintesc și să tastez calea corectă a directorului, făcând mai multe greșeli pe parcurs. Acest lucru îmi încetinește ritmul. Nici măcar finalizările zsh nu compensează acest lucru. Dar cu fzf
, schimbarea directoarelor este floare la ureche, indiferent cât de adânc și de departe este. Este suficient să tastați cd **
și aproape ați ajuns.
Rețineți că, în timp ce fzf indexează arborele de directoare, puteți începe imediat căutarea. Schimbarea directoarelor este cazul meu preferat de utilizare, iar fuzzy matching excelează cu adevărat aici. Necesită din partea dvs. același efort pentru a schimba un director, indiferent dacă este la un nivel de adâncime sau la zece niveluri de adâncime.
ALT+C
scurtătura este un mod alternativ de a declanșa fzf
în modul de schimbare a directorului.
Istoric comenzi
S-ar putea să folosiți Ctrl+R
scurtătura de la tastatură pentru a căuta în istoricul comenzilor dvs. Minunat, dar ce-ar fi să o supraîncărcați cu fuzzy finder? Uitați-vă și comparați.
Căutați elementul selectat pe linia de comandă, astfel încât să îl puteți modifica în continuare.
Cercetați numele gazdei în care să intrați prin SSH
Dacă sunteți un dezvoltator backend și lucrați cu mai multe servere la distanță, ați putea aprecia combinația ssh+fzf
. Folosiți aceeași secvență de declanșare cu stea dublă și tastați ssh **
. Acesta extrage adresele IP și numele de gazdă utilizate recent din ~/.ssh/config
și afișează un căutător interactiv.
În trimiterea unui semnal către un proces
Cîteodată dorim să trimitem un semnal către un proces, dar mai întîi trebuie să obținem PID-ul acestuia după nume. De obicei se folosește pgrep <process_na
me> pentru a rezolva PID-ul urmat de by a kill <pro
cess_pid> care se referă la acelt P
ID. Cu fzf puteți combina atât pașii steps. Typ
e kill <TAB> cât și fzf pentru a lista toate procesele. Nu mai este nevoie să treceți la un monitor de procese dedicat, cum ar fi „Activity Monitor” pe Mac.
Vizualizează fișierele în timp ce cauți
Să presupunem că sunteți în căutare de fișiere, dar uneori numele fișierului în sine nu vă spune suficient. Așa că s-ar putea să doriți să trageți cu ochiul la conținutul unui fișier pentru un moment pentru a lua o decizie. fzf
vă acoperă și aici.
În mod implicit am fereastra de previzualizare dezactivată, dar o activez când vreau să trag cu ochiul în fișiere. În plus, am îmbunătățit-o cu o ieșire colorată și evidențiere a sintaxei folosind bat ca o comandă de previzualizare.
Personalizare
Există două modalități principale de a personaliza versiunea stock a fzf
:
- Modificați comportamentul dialogului finder (fereastra de previzualizare, comenzi rapide de la tastatură, dimensiuni, acțiuni personalizate etc.). A se vedea variabila de mediu
FZF_DEFAULT_OPTS
. - Modificați backend-ul de căutare subiacent. În mod implicit, utilizează utilitarul GNU
find
, dar puteți trece la instrumente mai avansate precum fd sau ripgrep. În primul rând, este mai rapid decât utilitarulfind
stock. În al doilea rând, aceste instrumente respectă regulile.gitignore
, astfel încât nu veți obține fișierenode_modules
sau.git
în rezultatele căutării. De asemenea, puteți utilizagit ls-tree
pentru a lista fișierele atunci când vă aflați într-un repo Git. Consultați variabila de mediuFZF_DEFAULT_COMMAND
.
Configurarea se face prin intermediul variabilelor de mediu. Iată fragmentul din configurația mea. Nu sunt sigur că ar funcționa așa cum este atunci când este copiat-n-pasted, cel mai probabil există alte dependențe lipsă. Dar asta este doar pentru a vă da o idee despre cum arată configurația.
Fzf și Vim
Până acum am văzut doar utilizarea liniei de comandă. Dar fzf
este, de asemenea, livrat ca un plugin Vim. Și credeți-mă, dacă sunteți un Vimmer, merită să îl adăugați la vimrc
dumneavoastră. Utilizarea Vim este în afara scopului acestei postări, altfel nimeni nu ar citi-o ? Dar vorbesc despre el în detaliu în a doua parte a videoclipului meu, de asemenea, legat la începutul postului.
Dacă sunteți nerăbdători, iată un mic extras pentru a vă atrage atenția. Folosiți comanda :grep
pentru căutarea de text la nivelul întregului proiect, deschideți meciurile în fereastra fzf
într-un mod de ecran complet, filtrați în continuare meciurile din fzf
și săriți la meciul selectat. Și nu uitați de previzualizarea instantanee a fișierului la poziția exactă a liniei. E minunat, nu-i așa?
Concluzie
Sper că sunteți impresionați de cât de super minunat este fzf. Sunt șanse să fiți deja dispuși să îl instalați și să îl încercați.
Rețineți că fzf
nu este doar pentru căutarea de fișiere, deși este caracteristica principală a acestuia. După cum puteți vedea, „căutare + acțiune” este un principiu general, dar este suficient de abstract și puternic pentru a lucra cu orice tip de listă: fișiere, directoare, procese, nume de gazdă etc. Amintiți-vă la începutul acestei postări – fzf este doar un filtru Unix. Eliberați-vă imaginația, alimentați-l cu orice listă și adaptați-l la propriile nevoi. Ați putea să vă inspirați din multitudinea de exemple.
BTW, apreciați cât de superioară este filosofia Unix. fzf
este un exemplu excelent de program care aderă la aceste principii.
- Lăsați programul să facă un singur lucru și să-l facă bine (principiul responsabilității unice)
- faceți-l suficient de abstract pentru a fi agnostic față de detalii irelevante sau tipuri de date
- compuneți programe individuale separate folosind interfețe standard bine definite.
Păstrați-vă cu aceste principii în cariera dumneavoastră de dezvoltare de software. Cunoașterea principiilor fundamentale care stau în spatele nașterii și morții rapide a multiplelor instrumente, limbaje și framework-uri existente este ceea ce diferențiază dezvoltatorii profesioniști de amatori.
Resurse
junegunn/fzf: Un fuzzy finder în linie de comandă – https://github.com/junegunn/fzf
Universul Vim. fzf – fuzzy finder în linie de comandă – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els
Canalul meu Youtube. Sunt doar câteva videoclipuri, deoarece fac primii mei pași în realizarea de screencast-uri. Aveți răbdare, promit să fac mai multe videoclipuri. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.
sharkdp/fd: O alternativă simplă, rapidă și prietenoasă pentru ‘find’ – https://github.com/sharkdp/fd
BurntSushi/ripgrep: ripgrep caută recursiv în directoare pentru un model regex – https://github.com/BurntSushi/ripgrep
junegunn/fzf.vim: fzf vim – https://github.com/junegunn/fzf.vim
.