fzf – sprytne uniwersalne szukadełko

W komputerze szukamy wielu rzeczy: plików, poleceń w historii, uruchomionych procesów. A im sprytniej szukamy tym szybciej możemy znaleźć.

TL;DR

fzf (fuzzy finder) to program, który ułatwia wyszukiwanie różnych elementów w konsoli: plików, katalogów, ale także uruchomionych procesów, wydanych poleceń w historii itp.

Niezwykle wydajny, konfigurowalny, pozwala wygodnie wyszukiwać, wybierać wiele elementów z listy, umożliwia szybki (również konfigurowalny) podgląd plików.

Rozmyta wyszukiwarka

fzf – „fuzzy finder” – to program, która stara się wyszukać podaną frazę – nie dokładnie jednak, ale na swój sposób „inteligentnie”. Jak pisze autor – używa algorytmu FuzzyMatchV2, który stosuje zmodyfikowaną wersję algorytmu Smitha-Watermana, aby znaleźć optymalne rozwiązanie (najwyższy wynik) zgodnie z kryteriami punktacji. Cokolwiek by to nie oznaczało, dla nas najważniejsze jest, że możemy wpisać ciąg mniej więcej pasujący do kryteriów, a program podpowie nam najbardziej odpowiednie do niego elementy.

Mechanizm jest oczywiście dość skomplikowany, nas jednak interesuje, to, że nie musimy dokładnie pamiętać nazwy pliku, żeby go znaleźć. Dla przykładu fraza „kat” dopasuje się zarówno do „kąt” jak i „Kat” (domyślnie wyszukiwanie nie jest wrażliwe na wielkość liter, a znaki diakrytyczne mają „przycinane” ogonki). Jednak fraza „Kąt” dopasuje się tylko do „Kąt” – skoro już użyliśmy znaku diakrytycznego i wielkiej litery to znaczy, że one mają tam być. I mnóstwo innych tego typu zabiegów.

Instalacja

Program fzf można zainstalować na kilka sposobów, ale wydaje się, że jeden jest najwłaściwszy: ściągnięcie projektu ze strony twórcy: https://github.com/junegunn/fzf (można ściągnąć archiwum lub sklonować projekt za pomocą git). Należy go umieścić w jakimś przytulnym kąciku swojego katalogu domowego i uruchomić skrypt instalacyjny install (właśnie w tej kolejności, ponieważ skrypt instalacyjny zapisuje położenie katalogu programu).

W trakcie instalacji program zada trzy pytania:

  • czy włączyć rozmyte autouzupełnianie?
  • czy przyporządkować klawisze do programu
  • czy zapisać te zmiany w plikach konfiguracyjnych?

Tych pytań można uniknąć, jeśli instalator zostanie uruchomiony z parametrem:

$ ./install –all

Zdecydowanie polecam taki sposób instalacji – najważniejsze funkcje zostaną włączone.

Skróty klawiszowe

W trakcie instalacji definiowane są trzy dodatkowe skróty klawiszowe:

  • Ctrl+T – wyświetla listę bieżącego katalogu i pozwala wybrać plik lub katalog, którego nazwa zostanie wpisana w linii poleceń,
  • Ctrl+R – wyświetla historię poleceń i umożliwia wybranie jednego, które następnie zostanie wpisane do linii poleceń, może być zmodyfikowane i uruchomione,
  • Alt+C – Wyświetla listę wszystkich katalogów (i tylko katalogów) w bieżącym katalogu (rekursywnie), po czym przechodzi do niego. Takie bardzo szybkie cd.
    W moim Xubuntu Alt+C otwiera menu pomocy. Najprostszym (choć mało eleganckim) wyjściem jest wyłączenie klawiszy skrótów w menu w aplikacji XFCE4-terminal (menu Edycja polecenie Preferencje zakładka Zaawansowane zaznacz pole „Wyłączenie skrótów menu”. Rzadko używam klawiszy do obsługi menu więc mi takie rozwiązanie odpowiada.
Wynik działania skrótów: Alt+C (na górze) i Ctrl+R (na dole)

Każdą z powyższych list można szybko przefiltrować, co powoduje, że wyszukiwanie jest bardzo sprawne.

Poza skrótami klawiszowymi fzf definiuje dodatkowy symbol – dwie gwiazdki (**). Wpisanie polecenia (np. kill -16), potem dwóch gwiazdek i wciśnięcie tabulatora wywołuje program fzf, który pokaże listę procesów.

Teraz można już sprawdzić, co potrafi program, choćby przekierowując do niego listę plików:

$ ls | fzf

Wybrany z listy element zostanie wpisany do linii poleceń. Jeśli nie chcemy niczego wybierać – należy po prostu nacisnąć klawisz escape.

Fitrowanie

„Fuzzy finding” oznacza, że wyszukiwanie jest bardzo elastyczne i pozwala na wpisanie przybliżonego choćby wzorca, by odnaleźć potrzebny element. Wyniki wyszukiwania są pokazywane po wpisaniu każdego kolejnego znaku więc szybko można się zorientować, czy nasze poszukiwania idą we właściwym kierunku. Program jest niezwykle sprawny i błyskawicznie tworzy gotową do filtrowania listę z setek czy nawet tysięcy nazw plików.

Domyślnie wpisywane kolejno znaki są wyszukiwane gdziekolwiek w przeszukiwanym tekście, mogą być oddzielone dowolną liczbą innych znaków. Małe litery są traktowane jako „case insensitive”, wielkie zaś tylko jako wielkie. Rzecz jasna zwróci to mnóstwo nietrafnych wyników.

Wyszukiwanie rozmyte często zwraca mnóstwo nietrafnych wyników (na górze lista wszystkich plików, na dole dopasowanie)

Możemy więc ów wzorzec określić nieco dokładniej:

  • apostrof na początku wzorca oznacza, że ma on być wyszukiwany w całości, a nie jako oddzielne znaki (np. ‘ala). Używamy tylko jednego apostrofu, na początku.
  • wykrzyknik na początku to negacja. Wyszukane zostanie wszystko, co nie zawiera wpisanego ciągu znaków. Tym razem cały ciąg jest wyszukiwany w całości (np. !kot)
  • podobnie jak w wyrażeniach regularnych, znaki ^ i $ odpowiadają odpowiednio początkowi i końcowi tekstu. Możemy więc wyszukać wszystkie ciągi zaczynające się od litery a (^a) albo wszystkie pliki o rozszerzeniu txt (txt$).
  • pionowa kreska odpowiada operatorowi OR – możemy znaleźć pliki, które mają rozszerzenie txt lub csv (txt$ | csv$)
Można użyć również negacji

Filtry można łączyć – nic nie stoi na przeszkodzie, by poszukać plików, których nazwa zaczyna się na literę a i mają rozszerzenie txt lub csv (^a txt$ | csv$). Warunki są rozdzielane co najmniej jedną spacją.

Podgląd

fzf ma funkcję niezwykłą jak na konsolową wyszukiwarkę – potrafi pokazać podgląd pliku, wskazywanego przez kursor na liście. Wywołując fzf trzeba wskazać program, który będzie odpowiedzialny za pokazanie podglądu. Musimy się więc zdecydować, czy będziemy oglądać pliki tekstowe, czy informacje EXIF ze zdjęć (wciąż pozostajemy w konsoli więc podgląd grafiki jest trudny, choć nie niemożliwy). Można też pokusić się o napisanie sobie skryptu, który rozpoznawał by rozszerzenie i uruchamiał odpowiednią przeglądarkę.

W swojej pracy często szukam skryptów bashowych o jakiejś konkretnej zawartości – ta funkcja fzf bardzo mi takie wyszukiwanie ułatwia. Używam do tego opisywanego wcześniej programu bat, który ładnie koloruje składnię i przyspiesza wyszukiwanie.

Polecenie:

ls *.py |fzf --preview-window=60% --preview 'bat -l python --color=always {}'

wylistuje wszystkie programy w języku Python, umożliwiając szybki podgląd z kolorowaniem składni i wybranie tego potrzebnego. Okno podglądu można przewijać, by zajrzeć w inne miejsca pliku.

Podgląd pliku bardzo ułatwia decyzję, czy odnaleźliśmy właściwy plik

Wiele bardziej i mniej skomplikowanych przykładów użycia programu można znaleźć na stronie https://github.com/junegunn/fzf/wiki/Examples, gdzie swoje pomysły umieszczają użytkownicy.

To tylko krótka prezentacja najważniejszych funkcji programu fzf. W helpie można znaleźć niemal setkę parametrów, za pomocą których daje się dopasować działanie programu i wyniki wyszukiwania. Jednak nawet te podstawowe ustawienia dają duże możliwości, a wyszukiwanie czegokolwiek w systemie robi się szybkie i przyjemne. Z pewnością warto wypróbować fzf, być może zagości w systemie na dłużej.

Poprzedni post

Nushell – powłoka z nowym pomysłem

Następny post
Inkscape 1.2

Inkscape 1.2 z wieloma nowościami

Powiązane posty