de Alexey Samoshkin

De ce ar trebui să utilizați fzf, linia de comandă fuzzy finder

Demo lipsă găsită

În acest tutorial, vă voi ajuta să vă duceți obiceiurile din linia de comandă la un nivel următor fzf . Începeți să căutați fișiere ca un profesionist. Aflați caracteristici mai puțin cunoscute, cum ar fi schimbarea directorului, căutarea într-un istoric de comenzi, căutarea numelui gazdei către SSH, uciderea unui proces, previzualizarea instantanee a fișierului cu evidențierea sintaxei și multe altele …

De ce ar trebui sa utilizati fzf linia de comanda
demo rapid

Astăzi vă voi spune despre un instrument care vă poate schimba viața tehnologică în părți „înainte” și „după”. Crede-mă – nu este o hiperbolă. Întâlni fzf, care înseamnă căutare fuzzy. După cum susține definiția, este un instrument de căutare fuzzy de linie de comandă de uz general. Acest lucru nu sună foarte descriptiv și atractiv pentru cei care aud despre asta pentru prima dată. Dar este un proiect foarte popular clasat la aproximativ 21.000 de stele pe Github. Așa că este timpul să curățăm ceața și să obținem o perspectivă mai profundă.

Această postare însoțește Screencast-ul meu recent pe subiect. Deci, dacă ești o persoană care învață vizionând, verifică-l. În caz contrar, verificați și asta?, Deoarece instrumente precum fzf sunt cel mai bine introduse cu o demonstrație live mai degrabă decât cu tone de text.

Dupa cum fzf pagina proiectului nu are niciun videoclip demo până acum, am numit acest post „demo lipsă găsit”. Dar acum, acest videoclip a fost deja tras în fzf repo și a devenit o parte din readme project.

Căutarea fișierelor

Oamenii obișnuiți cu un mediu de linie de comandă sunt probabil familiarizați cu conceptul de filtre Unix. Acesta este momentul în care mai multe utilități independente sunt compuse împreună într-o conductă pentru a produce ieșirea dorită pas cu pas. De exemplu, această conductă produce o listă de șiruri:

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

Fiecare program acționează ca un filtru. In termeni simpli, fzf este doar un alt filtru Unix. Citește rânduri din stdin, lansează un dialog de căutare interactiv și, în cele din urmă, scrie articolele selectate în stdout. Punctul cheie și diferența față de instrumente precum GNU find, este dialogul său interactiv de căutare care filtrează elementele instantaneu pe măsură ce tastați.

1611679269 28 De ce ar trebui sa utilizati fzf linia de comanda
„Fzf” ca filtru interactiv Unix

S-ar putea să nu pară prea practic până acum, dar cazul principal de utilizare pentru fzf este să căutați fișiere pe linia de comandă. Cu potrivire fuzzy și feedback instantaneu, sunteți la doar câteva caractere distanță de a găsi fișierul potrivit, indiferent cât de profund este pierdut în ierarhia directorului. Nu este nevoie să reveniți la managerul de fișiere, să parcurgeți ierarhia directorului, să copiați calea unui fișier și să-l lipiți înapoi în shell. Comparați fluxurile de lucru „manager de fișiere” vs „fzf” de mai jos.

1611679269 182 De ce ar trebui sa utilizati fzf linia de comanda
fzf vs comparația managerului de fișiere

fzf acceptă potrivirea fuzzy, astfel încât să puteți tasta mai multe caractere la rând și acesta va potrivi liniile cu acele caractere împrăștiate pe șir. Alternativ, prefixați un termen de căutare cu un singur ghilimel, cum ar fi 'string, pentru a opta doar pentru potriviri exacte sau pentru a rula ca fzf --exact .

De ce ar trebui sa utilizati fzf linia de comanda
meci fuzzy vs exact

Nu acceptă expresii regulate sau modele glob, deci *.sh modelul 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 mai multe cuvinte, sau chiar părți ale cuvintelor, delimitate de un spațiu și care ar acoperi> 90% din cazurile de utilizare. Pentru restul de 10%, use ^ and $ pentru a se potrivi cu începutul și sfârșitul șirului respectiv cu use! a nega potrivirea.

1611679270 814 De ce ar trebui sa utilizati fzf linia de comanda
sintaxa potrivită fzf

Imprimarea fișierelor selectate pe o linie de comandă nu este foarte utilă, așa că de obicei căutarea este combinată cu alte acțiuni. De exemplu, îl puteți deschide cu Vim sau puteți trimite elementele selectate la următorul program.

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

Finalizare neclară pentru bash și zsh

Pentru a-l face mai convenabil, finalizarea 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 intră!

1611679270 188 De ce ar trebui sa utilizati fzf linia de comanda
Finalizare fuzzy cu stea dublă

** declanșatoare de secvență fzf căutător și seamănă * care este pentru extinderea shell-ului nativ. La un moment dat, s-ar putea chiar să uitați fzfprezența și aveți impresia că este o caracteristică shell nativă.

Formatul este după cum urmează, Unde FUZZY_PATTERN este opțional.

COMMAND [DIRECTORY/][FUZZY_PATTERN]**<TAB>

Dacă nu vă place ** secvență, puteți utiliza comenzile rapide de la tastatură. CTRL+T declanșează fzf și lipeste fișierul selectat pe linia de comandă, în timp ce ALT+C modificări în directorul selectat.

Schimbarea directorului

Ok, suficient despre căutarea fișierelor. Să vorbim despre alte aplicații utile. Schimbarea directorului de lucru este o operațiune atât de obișnuită. Dar, totuși, sunt mereu blocat un pic încercând să amintesc și să tastați calea directorului potrivit, făcând mai multe greșeli pe parcurs. Îmi încetinește ritmul. Chiar și completările zsh nu compensează acest lucru. Dar cu fzf, schimbarea directoarelor este o briză, oricât de profundă și de îndepărtată ar fi. Doar tastați cd ** și ești aproape acolo.

1611679270 406 De ce ar trebui sa utilizati fzf linia de comanda
schimbarea directorului este ca o briză

Observați că, în timp ce fzf indexează arborele directorului, puteți începe să căutați imediat. Schimbarea directoarelor este cazul meu de utilizare preferat, iar potrivirea fuzzy excelează cu adevărat aici. Necesită de la dvs. același efort pentru a schimba un director, fie că este un nivel adânc sau zece niveluri adâncime.

ALT+C comanda rapidă este o modalitate alternativă de declanșare fzf într-un mod de modificare a directorului.

Istoricul comenzilor

S-ar putea să folosiți Ctrl+R comandă rapidă de la tastatură pentru a căuta în istoricul comenzilor. Super, dar ce zici de supraîncărcare cu ajutorul căutătorului fuzzy? Uită-te și compară.

1611679271 205 De ce ar trebui sa utilizati fzf linia de comanda
Căutarea prin istoricul comenzilor

Acesta lipeste elementul selectat pe linia de comandă, astfel încât să îl puteți modifica mai departe.

Căutați numele gazdei în SSH

Dacă sunteți un dezvoltator de backend și lucrați cu mai multe servere la distanță, s-ar putea să apreciați ssh+fzf combo. Utilizați aceeași secvență de declanșare cu stea dublă și tip ssh ** . Scoate adresele IP folosite recent și numele de gazdă de pe ~/.ssh/config și afișează un dispozitiv de căutare interactiv.

1611679271 476 De ce ar trebui sa utilizati fzf linia de comanda
Combo „fzf + ssh”

Trimiteți un semnal unui proces

Uneori vrem să trimitem un semnal către un proces, dar mai întâi trebuie să obținem PID-ul său după nume. De obicei se folosește pgrep <process_naeu> pentru a rezolva PID a urmat by a kill <process_pid> referindu-se la that PID. Cu fzf le puteți combina pe ambele steps. Typomoară pașii și fzf în listarea tuturor proceselor tale. Nu mai este nevoie să treceți la un monitor de proces dedicat, cum ar fi „Activity Monitor” pe Mac.

1611679271 377 De ce ar trebui sa utilizati fzf linia de comanda
Găsiți un proces și trimiteți un semnal

Să presupunem că căutați fișiere, dar uneori numele fișierului în sine nu vă spune suficient. Așadar, poate doriți să aruncați o privire asupra conținutului unui fișier pentru o clipă pentru a lua o decizie. fzf te acoperă și aici.

1611679272 9 De ce ar trebui sa utilizati fzf linia de comanda
Fereastra de previzualizare

În mod implicit, am fereastra de previzualizare dezactivată, dar o activez când vreau să arunc o privire în fișiere. În plus, l-am îmbunătățit cu o ieșire colorată și evidențierea sintaxei folosind băţ ca o comandă de previzualizare.

Personalizare

Există două modalități principale de a personaliza versiunea stoc a fzf:

  • Schimbați comportamentul dialogului Finder (fereastră de previzualizare, comenzi rapide de la tastatură, dimensiuni, acțiuni personalizate etc.). Vedea FZF_DEFAULT_OPTS variabilă de mediu.
  • Schimbați backend-ul de căutare subiacent. În mod implicit, folosește GNU find utilitar, dar puteți trece la instrumentele mai avansate cum ar fi fd sau ripgrep. În primul rând, este mai rapid decât stocul find utilitate. În al doilea rând, aceste instrumente respectă .gitignore reguli, astfel încât să nu primești node_modules sau .git fișiere în rezultatele căutării. Tu poate folosi, de asemenea git ls-tree pentru a afișa fișiere atunci când vă aflați într-o repo Git. Vedea FZF_DEFAULT_COMMAND variabilă de mediu.

Configurarea se face prin intermediul variabilelor de mediu. Iată fragmentul din configurarea mea. Nu sunt sigur dacă ar funcționa așa cum este atunci când copiați-n-lipiți, cel mai probabil lipsesc alte dependențe. Dar aceasta este doar pentru a vă face 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 Plugin Vim. Și credeți-mă, dacă sunteți un Vimmer, merită să-l adăugați vimrc. Utilizarea Vim nu intră în sfera acestei postări, altfel nimeni nu l-ar citi? Dar vorbesc despre asta temeinic în a doua parte a my video, legat, de asemenea, la începutul postării.

Dacă ești nerăbdător, iată un mic extras pentru a-ți atrage atenția. Utilizare :grep comanda pentru căutare text la nivel de proiect, deschideți potrivirile în fzf fereastră într-un mod ecran complet, filtrează în continuare potrivirile din interior fzfși săriți la meciul selectat. Și nu uitați de previzualizarea instantanee a fișierului la poziția precisă a liniei. E minunat, nu-i așa?

1611679272 538 De ce ar trebui sa utilizati fzf linia de comanda
fzf ❤️ vim

Concluzie

Sper că ești impresionat de cât de super minunat fzf este. Este posibil să fiți deja dispus să instalați și să încercați.

Ține minte că fzf nu este doar pentru căutarea fișierelor, 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 de puternic pentru a lucra cu orice fel de listă: fișiere, directoare, procese, nume de gazdă etc. Rețineți la începutul acestui post – fzf este doar un filtru Unix. Deblochează-ți imaginația, hrănește-o cu orice listă și adaptează-o pentru propriile nevoi. S-ar putea să vă inspirați dintr-un bogăție de exemple.

BTW, apreciați cât de superioară este filosofia Unix. fzf este un excelent exemplu de program care respectă aceste principii.

  • lăsați programul să facă un lucru și să îl facă bine (principiul responsabilității unice)
  • faceți-l suficient de abstract pentru a fi agnostic de detalii sau tipuri de date irelevante
  • compune programe individuale separate folosind interfețe standard bine definite.

Respectați aceste principii în cariera dvs. de dezvoltare software. Cunoașterea principiilor fundamentale care stau la baza nașterii și morții rapide a mai multor instrumente, limbaje și cadre acolo diferențiază dezvoltatorii profesioniști de amatori.

Resurse

junegunn / fzf: Un căutare fuzzy din linia de comandă – https://github.com/junegunn/fzf

Universul Vim. fzf – linie de comandă căutare fuzzy – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

Canalul meu Youtube. Există doar câteva videoclipuri, deoarece fac primii mei pași în realizarea de emisiuni de ecran. Ai 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 ușor de utilizat pentru a „găsi” – https://github.com/sharkdp/fd

BurntSushi / ripgrep: ripgrep caută recursiv în directoare un model regex – https://github.com/BurntSushi/ripgrep

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