De ce ar trebui să folosiți fzf, fuzzy finder-ul din linia de comandă

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…

Demonstrație rapidă

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.

„fzf” ca filtru interactiv unix

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”.

comparare fzf vs manager de fișiere

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 .

fuzzy vs potrivire 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%, use ^ and $ pentru a potrivi începutul și respectiv sfârșitul șirului și use ! pentru a nega potrivirea.

fzf matching syntax

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!

Secvența de completare fuzzy cu stea dublă

** 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.

Schimbarea directorului este ca o briză

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.

Cercetare prin istoricul comenzilor

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.

„fzf + ssh” combo

Î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_name> pentru a rezolva PID-ul urmat de by a kill <process_pid> care se referă la acelt PID. Cu fzf puteți combina atât pașii steps. Type 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.

Găsește un proces și trimite un semnal

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.

Fereastra de previzualizare

Î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 utilitarul find stock. În al doilea rând, aceste instrumente respectă regulile .gitignore, astfel încât nu veți obține fișiere node_modules sau .git în rezultatele căutării. De asemenea, puteți utiliza git ls-tree pentru a lista fișierele atunci când vă aflați într-un repo Git. Consultați variabila de mediu FZF_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?

fzf ❤️ vim

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

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.