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…
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.
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.
fzf
obsł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
.
Nie obsługuje wyrażeń regularnych ani wzorców globalnych, więc *.sh
wzó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%, us
e ^ an
d $, aby dopasować odpowiednio początek i koniec łańcucha, oraz us
e !, aby zanegować dopasowanie.
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!
**
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.
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+C
skrót jest alternatywnym sposobem, aby wywołać fzf
w trybie zmiany katalogu.
Historia poleceń
Możesz być przy użyciu Ctrl+R
skrót klawiaturowy do przeszukiwania historii poleceń. Świetnie, ale co powiesz na doładowanie go wyszukiwarką rozmytą? Zobacz i porównaj.
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ę.
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_na
me> do rozwiązania PID, a następnie by a kill <pro
cess_pid> odnoszącego się do that P
ID. Z fzf możesz połączyć oba kroki steps. Typ
e 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.
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.
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ędziefind
. Po drugie, narzędzia te respektują reguły.gitignore
, więc nie dostaniesz plikównode_modules
lub.git
w wynikach wyszukiwania. Możesz także użyćgit ls-tree
do wylistowania plików, gdy jesteś w repo Git. ZobaczFZF_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ż?
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