Dlaczego powinieneś używać fzf, fuzzy finder z wiersza poleceń

by Alexey Samoshkin

Znaleziono brakujące demo

W tym poradniku pomogę ci przenieść twoje nawyki z wiersza poleceń na wyższy poziom dzięki fzf . Zacznij wyszukiwać pliki jak profesjonalista. Naucz się mniej znanych funkcji, takich jak zmiana katalogu, przeszukiwanie historii poleceń, szukanie nazwy hosta do SSH, zabijanie procesu, natychmiastowy podgląd pliku z kolorowaniem składni i wiele więcej…

quick demo

Dzisiaj opowiem ci o narzędziu, które może zmienić twoje techniczne życie na części „przed” i „po”. Zaufaj mi – to nie jest hiperbola. Poznajcie fzf, czyli skrót od fuzzy finder. Jak głosi definicja, jest to fuzzy finder ogólnego przeznaczenia, działający w wierszu poleceń. Nie brzmi to zbyt opisowo i atrakcyjnie dla tych, którzy słyszą o tym po raz pierwszy. Jest to jednak bardzo popularny projekt, który na Githubie ma około 21 000 gwiazdek. Nadszedł więc czas, aby oczyścić mgłę i uzyskać głębszy wgląd.

Ten post towarzyszy mojemu ostatniemu screencastowi na ten temat. Tak więc, jeśli jesteś osobą, która uczy się przez oglądanie, sprawdź to. W przeciwnym razie, sprawdź to również, ponieważ narzędzia takie jak fzf są najlepiej wprowadzane za pomocą demonstracji na żywo, a nie tony tekstu.

Jako że strona projektu fzf nie ma żadnego wideo demo do tej pory, nazwałem ten post „brakujące demo znalezione”. Ale teraz, ten filmik został już wciągnięty do fzf repo i stał się częścią readme projektu.

Szukanie plików

Ludzie, którzy są przyzwyczajeni do środowiska wiersza poleceń są prawdopodobnie zaznajomieni z koncepcją filtrów uniksowych. Jest to sytuacja, w której kilka niezależnych narzędzi jest połączonych w jeden potok, aby krok po kroku wyprodukować pożądane dane wyjściowe. Na przykład, ten potok produkuje listę łańcuchów:

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

Każdy program działa jak filtr. W uproszczeniu, fzf jest po prostu kolejnym filtrem uniksowym. Odczytuje on wiersze z stdin, uruchamia interaktywny dialog findera i wreszcie zapisuje wybrane elementy do stdout. Kluczowym punktem i różnicą w stosunku do narzędzi takich jak GNU find, jest jego interaktywny dialog findera, który filtruje elementy natychmiast po wpisaniu.

„fzf” jako interaktywny filtr unixowy

Może nie brzmi to zbyt praktycznie, ale podstawowym zastosowaniem fzf jest wyszukiwanie plików w wierszu poleceń. Dzięki dopasowaniu rozmytemu i natychmiastowej informacji zwrotnej, jesteś tylko kilka znaków od znalezienia właściwego pliku, bez względu na to, jak głęboko jest on zagubiony w hierarchii katalogów. Nie ma potrzeby skakania z powrotem do menedżera plików, przemierzania hierarchii katalogów, kopiowania ścieżki pliku i wklejania jej z powrotem do powłoki. Porównaj przepływy pracy „menedżer plików” vs „fzf” poniżej.

porównanie fzf vs menedżer plików

fzfobsługuje dopasowywanie rozmyte, więc możesz wpisać kilka znaków z rzędu, a program dopasuje linie z tymi znakami rozrzuconymi po całym łańcuchu. Alternatywnie można poprzedzić wyszukiwane hasło pojedynczym cudzysłowem, jak 'string, aby wybrać tylko dokładne dopasowanie, lub uruchomić jako fzf --exact .

dopasowanie rozmyte vs dokładne

Nie obsługuje wyrażeń regularnych ani wzorców globalnych, więc *.shwzór nie będzie działać. Ale zachowaj prostotę – produktywność i szybkość to Twój cel na dziś. Nie masz wolnego czasu na komponowanie i wpisywanie poprawnych wyrażeń regularnych. Zamiast tego po prostu wpisz kilka słów, lub nawet części słów, ograniczonych spacją, a to pokryje >90% przypadków użycia. Dla pozostałych 10%, use ^ and $, aby dopasować odpowiednio początek i koniec łańcucha, oraz use !, aby zanegować dopasowanie.

składnia dopasowania fzf

Wydrukowywanie wybranych plików do wiersza poleceń nie jest super użyteczne, więc zwykle wyszukiwanie jest połączone z jakąś dalszą akcją. Na przykład, możesz otworzyć go za pomocą Vima, lub przekazać wybrane elementy do następnego programu.

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

Uzupełnianie rozmyte dla basha i zsh

Aby uczynić je wygodniejszym, uzupełnianie rozmyte może być uruchamiane, jeśli słowo przed kursorem kończy się sekwencją wyzwalającą, którą domyślnie jest **. Na przykład, wpisz vim ~/path/** i naciśnij TAB . Voila, fzf wkracza!

Sekwencja podwójnej gwiazdy rozmytego uzupełniania

** wyzwala fzf findera i przypomina *, który jest dla natywnej ekspansji powłoki. W pewnym momencie możesz nawet zapomnieć o obecności fzf i odnieść wrażenie, że jest to natywna funkcja powłoki.

Format jest następujący, gdzie FUZZY_PATTERN jest opcjonalny.

COMMAND **<TAB>

Jeśli nie podoba Ci się sekwencja **, możesz użyć skrótów klawiaturowych. CTRL+T wywołuje fzf i wkleja wybrany plik do wiersza poleceń, podczas gdy ALT+C przechodzi do wybranego katalogu.

Zmiana katalogu

Ok, dość o wyszukiwaniu plików. Porozmawiajmy o innych przydatnych zastosowaniach. Zmiana katalogu roboczego jest tak powszechną operacją. Ale mimo to zawsze trochę utknąłem próbując przypomnieć sobie i wpisać właściwą ścieżkę do katalogu, popełniając po drodze kilka błędów. To spowalnia moje tempo. Nawet uzupełnienia zsh nie rekompensują tego. Ale z fzf, zmiana katalogów to pestka, bez względu na to jak głęboko i daleko to jest. Wystarczy wpisać cd ** i jesteś prawie na miejscu.

zmiana katalogu jest jak bryza

Zauważ, że podczas gdy fzf indeksuje drzewo katalogów, możesz od razu rozpocząć wyszukiwanie. Zmiana katalogów jest moim ulubionym przypadkiem użycia, a fuzzy matching naprawdę wyróżnia się tutaj. To wymaga od ciebie tego samego wysiłku, aby zmienić katalog, czy jest to jeden poziom głęboko lub dziesięć poziomów głęboko.

ALT+Cskrót jest alternatywnym sposobem, aby wywołać fzf w trybie zmiany katalogu.

Historia poleceń

Możesz być przy użyciu Ctrl+Rskrót klawiaturowy do przeszukiwania historii poleceń. Świetnie, ale co powiesz na doładowanie go wyszukiwarką rozmytą? Zobacz i porównaj.

Przeszukiwanie historii poleceń

Wkleja wybrany element do wiersza poleceń, dzięki czemu możesz go dalej podrasować.

Wyszukuje nazwę hosta do SSH

Jeśli jesteś programistą zaplecza i pracujesz z wieloma zdalnymi serwerami, możesz docenić kombinację ssh+fzf. Użyj tej samej sekwencji wyzwalania podwójnej gwiazdy i wpisz ssh ** . Pobiera ono ostatnio używane adresy IP i nazwy hostów z twojego ~/.ssh/config i wywołuje interaktywną wyszukiwarkę.

„fzf + ssh” combo

Wyślij sygnał do procesu

Czasami chcemy wysłać sygnał do procesu, ale najpierw musimy uzyskać jego PID po nazwie. Zazwyczaj używa się pgrep <process_name> do rozwiązania PID, a następnie by a kill <process_pid> odnoszącego się do that PID. Z fzf możesz połączyć oba kroki steps. Type kill <TAB> i fzf w listowaniu wszystkich procesów. Nie trzeba już przełączać się na dedykowany monitor procesów, jak „Monitor aktywności” na Macu.

Znajdź proces i wyślij sygnał

Podglądaj pliki podczas wyszukiwania

Załóżmy, że szukasz plików, ale czasami sama nazwa pliku nie mówi ci wystarczająco dużo. Możesz więc chcieć zajrzeć na chwilę do zawartości pliku, aby podjąć decyzję. fzf obejmuje cię również tutaj.

Okno podglądu

Domyślnie mam wyłączone okno podglądu, ale włączam je, gdy chcę zajrzeć do plików. Dodatkowo, wzbogaciłem je o kolorowe wyjście i podświetlanie składni używając bat jako komendy podglądu.

Kustomizacja

Istnieją dwa główne sposoby na dostosowanie stockowej wersji fzf:

  • Zmień zachowanie okna dialogowego findera (okno podglądu, skróty klawiaturowe, wymiary, niestandardowe akcje, itp.) Zobacz FZF_DEFAULT_OPTS zmienna środowiskowa.
  • Zmień bazowy backend wyszukiwarki. Domyślnie używa narzędzia GNU find, ale możesz przełączyć się na bardziej zaawansowane narzędzia, takie jak fd lub ripgrep. Po pierwsze, jest to szybsze niż standardowe narzędzie find. Po drugie, narzędzia te respektują reguły .gitignore, więc nie dostaniesz plików node_modules lub .git w wynikach wyszukiwania. Możesz także użyć git ls-tree do wylistowania plików, gdy jesteś w repo Git. Zobacz FZF_DEFAULT_COMMAND zmienna środowiskowa.

Konfiguracja odbywa się poprzez zmienne środowiskowe. Oto wycinek z mojej konfiguracji. Nie jestem pewien, czy to zadziała tak jak jest po skopiowaniu i wklejeniu, najprawdopodobniej są jakieś inne brakujące zależności. Ale to tylko po to, aby dać ci wyobrażenie o tym, jak wygląda konfiguracja.

Fzf i Vim

Do tej pory widzieliśmy tylko użycie wiersza poleceń. Ale fzf jest również dostarczany jako plugin do Vima. I zaufaj mi, jeśli jesteś Vimowcem, warto go dodać do swojego vimrc. Użycie Vima jest poza zakresem tego postu, inaczej nikt by go nie przeczytał ? Ale mówię o tym dokładnie w drugiej części mojego wideo, również link na początku postu.

Jeśli jesteś niecierpliwy, tutaj jest mały fragment, aby zwrócić uwagę. Użyj polecenia :grep do wyszukiwania tekstu w całym projekcie, otwórz dopasowania w oknie fzf w trybie pełnoekranowym, dalej filtruj dopasowania w obrębie fzf i skocz do wybranego dopasowania. I nie zapomnij o natychmiastowym podglądzie pliku w dokładnej pozycji linii. To jest niesamowite, nieprawdaż?

fzf ❤️ vim

Zakończenie

Mam nadzieję, że jesteś pod wrażeniem tego, jak super niesamowite jest fzf. Szanse są takie, że już chcesz go zainstalować i spróbować.

Pamiętaj, że fzf nie służy tylko do wyszukiwania plików, chociaż jest to jego podstawowa funkcja. Jak widzisz, „search + action” to ogólna zasada, ale jest ona wystarczająco abstrakcyjna i potężna, aby pracować z każdym rodzajem listy: plikami, katalogami, procesami, nazwami hostów, itp. Pamiętaj na początku tego wpisu – fzf to tylko filtr uniksowy. Uwolnij swoją wyobraźnię, podaj mu dowolną listę i dostosuj go do własnych potrzeb. Możesz zaczerpnąć trochę inspiracji z bogactwa przykładów.

BTW, doceń, jak doskonała jest filozofia Uniksa. fzf jest doskonałym przykładem programu, który przestrzega tych zasad.

  • pozwól programowi robić jedną rzecz i robić to dobrze (zasada pojedynczej odpowiedzialności)
  • zrób go na tyle abstrakcyjnym, aby był agnostykiem nieistotnych szczegółów lub typów danych
  • składaj oddzielne indywidualne programy za pomocą standardowych, dobrze zdefiniowanych interfejsów.

Przytrzymaj te zasady w swojej karierze programisty. Znajomość podstawowych zasad, które stoją za szybkimi narodzinami i śmiercią wielu narzędzi, języków i frameworków jest tym, co odróżnia profesjonalnych programistów od amatorów.

Źródła

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

Wszechświat Vima. fzf – command-line fuzzy finder – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

Mój kanał na Youtube. Jest tam tylko kilka filmów, ponieważ stawiam pierwsze kroki w robieniu screencastów. Bądź cierpliwy, obiecuję, że będę robił więcej filmów. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Prosta, szybka i przyjazna dla użytkownika alternatywa dla 'find’ – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep przeszukuje rekurencyjnie katalogi w poszukiwaniu wzorca regex – https://github.com/BurntSushi/ripgrep

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.