Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Smalltalk
Antworten
Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von smutbert » 16.12.2022 00:25:58

Heute, am 16. Dezember geht es um ein kleines, nützliches Programm

fzf

Debianfzf (für fuzzy finder) ist ein Kommandozeilenprogramm, das Text von der Standardeingabe entgegennimmt und es erlaubt fehlertolerant in den Zeilen des Texts zu suchen. Der Titel „unscharf suchen“ ist die Übersetzung des gängigsten englischen Namens solcher Suchen (fuzzy search).

Wem das zu nichtssagend ist, dem empfehle ich das Programm einfach im Terminal zu starten, vorzugsweise in einem Verzeichnis mit nicht allzu vielen Dateien:

Code: Alles auswählen

$ cd ~/.config
$ fzf
Ohne übergebenen Text, sucht fzf einfach rekursiv nach Dateinamen unterhalb des aktuellen Verzeichnisses. In einem kleinen Terminalfenster kann das etwa so aussehen:

Code: Alles auswählen

                    
  evolution/sources/eb6df6122a988ba4304b9d644fb22643472.. 
  evolution/sources/293694be3258aa8c34f0266a461c08c4ab4.. 
  evolution/sources/c9538b814547517bbeb8fdde6091d7b0a43.. 
  evolution/sources/local.source                          
  evolution/sources/vfolder.source                        
  evolution/sources/system-proxy.source                   
> dconf/user                                              
  380/380 ─────────────────────────────────────────────── 
>                                                         
Hier werden, solange noch kein Suchtext eingegeben wurde, 380 von 380 Dateien aufgelistet. Die unterste Zeile ist die Eingabezeile für den Suchtext nach dem gefiltert und sortiert wird.
Suche ich zum Beispiel nach den Dateien, die ich für das 7. Türchen erstellt und bearbeitet habe, und kann mich nur noch vage an irgendwas mit „pi“ und „rir“ (pipewire und hrir) erinnern, habe ich die gewünschte Datei auf Anhieb

Code: Alles auswählen

  pipewire/test/sink-virtual-surround-7.1-hesuvi.conf.old 
  pipewire/test/sink-virtual-surround-5.1-kemar.conf      
  pipewire/pipewire.conf.test/virtual-surround.conf       
  pipewire/pipewire.conf.d/virtual-surround.conf          
  pipewire/pipewire.conf.notworking                       
  pipewire/pipewire.conf.mine                             
> pipewire/hrir.wav                                       
  17/380 ──────────────────────────────────────────────── 
> pirir                                                   
Es werden also zwar immerhin noch 17 der 380 Dateien aufgelistet, aber die beste Übereinstimmung bei der gesuchten Datei ist bereits ausgewählt. Mit <Enter> oder bei Terminals, die das unterstützen, einem Doppelklick auf eine Zeile der Liste, gibt fzf auf der Standardausgabe die ausgewählte Zeile auf der Standardausgabe aus, in dem Fall also Dateiname samt (relativem) Pfad.

Um diesem Beispiel noch ein Mindestmaß an Nutzen abzuringen, könnten wir dasselbe noch einmal mit diesem Aufruf machen, um uns den Dateityp der gesuchten Datei anzeigen zu lassen, im Falle der »hrir.wav« vom 7. Dezember

Code: Alles auswählen

$ file "$(fzf)"
pipewire/hrir.wav: RIFF (little-endian) data, WAVE audio, IEEE Float, 14 channels 48000 Hz

Es gibt noch viele weitere Optionen, für die Anzeige nur einer von mehreren Spalten, eine Vorschau des gerade gewählten Elements, u. s. w. aber da verweise ich auf die Manpage.

Jedenfalls lassen sich mit fzf einige spannende und nützliche Dinge anstellen.



Anwendungen von fzf

automatische Vervollständigung in der shell

Im Paket Debianfzf befinden sich bereits Dateien für die automatische Vervollständigung für bash, zsh, fish und vim und was es für die bash gibt, will ich kurz vorstellen.

Zuerst einmal müssen die Dateien in der Shell gesourct werden. Ab bookworm sollte das wohl eigentlich automatisch passieren, das tut es bei mir aber nicht und bis inklusive bullseye muss man die Dateien sowieso erst selbst laden. Das geschieht mit

Code: Alles auswählen

$ source /usr/share/doc/fzf/examples/completion.bash ## bis inklusive bullseye
$ source /usr/share/bash-completion/completions/fzf  ## ab bookworm
Debianversions-unabhängig gibt es noch eine weitere Datei, die ein paar weiteren Tasten(kombinationen) passende fzf-Funktionen zuweist, wie z.B. das Durchsuchen der History mit <Ctrl>+<r>

Code: Alles auswählen

$ source /usr/share/doc/fzf/examples/key-bindings.bash
Das Laden dieser Datei muss man auch noch bei bookworm selbst erledigen.
Wie gewohnt kann man das natürlich auch alles in der »~/.bashrc« erledigen, damit die fzf-Funktionen in der bash immer zur Verfügung stehen.

Die Vervollständigung spricht dann auf ** an. So kann man bei der Eingabe von

Code: Alles auswählen

cp **<Tab>
bequem rekursiv nach Dateien suchen, die man kopieren will.


Daneben gibt es auch noch ein anderes Projekt [1], das auch die „normale“ Vervollständigung (mit einem einfachen Tabulator ohne vorher ein ** eingegeben zu haben) für verschiedene Shells, unter anderem natürlich wieder auch der bash, zur Verfügung stellt. Entgegen der Installationsanleitung des Projekts, habe ich allerdings nur das gewünschte Skript heruntergeladen und gesourcet

Code: Alles auswählen

$ wget -O ~/.fzf_bash_completion.sh "https://github.com/lincheney/fzf-tab-completion/raw/master/bash/fzf-bash-completion.sh"
$ source ~/.fzf_bash_completion.sh
$ bind -x '"\t": fzf_bash_completion'
und schwupps braucht man für die automatische Vervollständigung mit fzf nur <Tab> zu drücken.
Um es permanent einzurichten, genügt es wieder die beiden letzten Befehle an die »~/.bashrc« anzuhängen.


als Menü

Besonders spannend finde ich die Möglichkeit fzf in einem vorzugsweise kleinen Terminalfenster als eine Art Menü zu verwenden und das natürlich besonders in Kombination mit einem schlanken Fenstermanager, weil sich da die Bedienung mit der Tastatur und wahlweise auch Maus besonders gut machen.
(unter sway verwende ich dafür das Terminal Debiankitty mit einigen eigenen Einstellungen bezüglich Aussehen und Verhalten der Fenster)

Ein recht simples Beispiel, wieder für die bash, das man recht gut als minimalistisches Startmenü nutzen kann, ist

Code: Alles auswählen

compgen -c | fzf | sh
Mit einem etwas ausgefeilterem Shellskript, kann so ein Startmenü auch noch einmal deutlich nützlicher werden und stellt schnell die ähnlichen Funktionen der meisten Desktopumgebungen in den Schatten.
Als Beispiel für ein ausgefeilteres Skript als Startmenü will ich sway-launcher-desktop [2] nennen, das sich entgegen dem Namen nicht nur unter sway nutzen lässt.


Im Netz findet man darüber hinaus noch unzählige weitere Anwendungsmöglichkeiten, zum Teil von zweifelhaftem Nutzen
https://www.reddit.com/r/archlinux/comments/bg53as/cool_uses_for_dmenurofifzf/ hat geschrieben: I have it set to open a random porno from a set directory with a keyword.
aber eine aus meiner Feder, die ich so noch nicht im Netz gefunden habe, will ich morgen im zweiten Teil vorstellen.



[1] https://github.com/lincheney/fzf-tab-completion
[2] https://github.com/Biont/sway-launcher-desktop

dasebastian
Beiträge: 1884
Registriert: 12.07.2020 11:21:17

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von dasebastian » 16.12.2022 09:02:14

Coole Sache! :THX: Ich nutze fzf ja auch, bisher habe ich allerdings einen Bogen um die Autocompletion gemacht, diese Sterne haben mich genervt... danke für den Link!

Was ich an fzf auch sehr toll finde, ist, dass manche Programme ihn schon integrieren, konkret nutze ich bei mir ein fzf-Plugin für Debianmicro und für Debianlf (ein "weiterer" Ncurses-Dateimanager, den ich jedem ans Herz lege, der sich seine Tools genau für sich selber zusammenbauen will, das heisst nur mit rudimentären Funktionen anfangen will, hat bei mir den heiss geliebten Debianmc ersetzt, 'tschuldigung!)
smutbert hat geschrieben: ↑ zum Beitrag ↑
16.12.2022 00:25:58

Code: Alles auswählen

$ wget -O ~/.fzf_bash_completion.sh "https://github.com/lincheney/fzf-tab-completion/raw/master/bash/fzf-bash-completion.sh"
$ source ~/.fzf_bash_completion.sh
$ bind -x '"\t": fzf_bash_completion'
Werde ich auch probieren, danke! :THX:
https://www.reddit.com/r/archlinux/comments/bg53as/cool_uses_for_dmenurofifzf/ hat geschrieben: I have it set to open a random porno from a set directory with a keyword.
Prruuust, darüber bin ich auch schon gestolpert, ist schon witzig, die Idee!

Abgesehen vom Setzen von meinen persönlichen LS_OPTIONS in der .bashrc, habe ich bei mir noch die 3 Kommandos verändert und dort "find" aus den Debianfindutils durch "fdfind" aus Debianfd-find ersetzt:

Code: Alles auswählen

export FZF_DEFAULT_COMMAND="fdfind -H -t f -c never"
export FZF_ALT_C_COMMAND="fdfind -H -t d -c never"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
Das liefert bei mir einfach optisch schönere Ergebnisse und die Syntax ist für mich einfacher bzw. schlüssiger.

Am meisten nutze fzf aber wahrscheinlich in der History.

Freue mich auf morgen!

rodney
Beiträge: 334
Registriert: 09.12.2016 04:15:59

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von rodney » 16.12.2022 18:39:22

fzf ist bei mir schon seit Jahren (mind. seit 2016) im Einsatz:

- Shell-History (<CTRL>-r)
- Verzeichniswechsel (<Alt>-c)
- Dateiauswahl (**<tab>)
- kill (**<tab>)
- Programm-Starter (aehnlich dmenu, halt mit Terminal)
- Lesezeichen (unabhaengig vom Browser)
- und paar andere Kleinigkeiten

Finde es etwas schade dass dein tolles Tuerchen (meiner Meinung nach) zu wenig Zuspruch findet.

Von mir gibt es aber einen dicken :THX:

Edit: Und auf den Teil 2 bin ich natuerlich auch gespannt

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von Meillo » 16.12.2022 19:32:30

rodney hat geschrieben: ↑ zum Beitrag ↑
16.12.2022 18:39:22
Finde es etwas schade dass dein tolles Tuerchen (meiner Meinung nach) zu wenig Zuspruch findet.
Hmm ... ich frage mich, warum ich damit nichts anfangen kann: Es liegt wohl daran, dass ich mein System eher wenig konfigurieren will. Ich mag also keine Shell-Extensions (oder Vim-Plugins, etc.). Auch kann ich mit unscharfer Suche insgesamt wenig anfangen. Im Gegenteil, ich schaetze die Exaktheit von Computern. Es faellt mir halt auch leicht, exakt zu arbeiten. Das sind wohl Gruende, warum ich das Tuerchen zwar gelesen und auch gut ausgearbeite gefunden habe, aber das Thema keine Bedeutung fuer mich hat.

Allerdings haette ich schon auch erwartet, dass es hier mehr User gibt, die damit etwas anfangen koennen oder aehnliche Programme bei sich im Einsatz haben. ... Es koennte natuerlich sein, dass manche von ihnen noch warten, bevor sie ihre Erfahrungen beitragen, um den morgigen zweiten Teil nicht unabsichtlich vorwegzunehmen.
Use ed once in a while!

Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von mn77de » 16.12.2022 22:01:12

Richtig cool! Danke für den Beitrag! :THX:
Fuzzy-Search hab' ich schon in einigen Projekten verwendet. "fzf" war mir allerdings noch nicht bekannt. :D
OpenSource! :THX:

dasebastian
Beiträge: 1884
Registriert: 12.07.2020 11:21:17

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von dasebastian » 16.12.2022 23:04:14

Meillo hat geschrieben: ↑ zum Beitrag ↑
16.12.2022 19:32:30
... warum ich damit nichts anfangen kann: Es liegt wohl daran, dass ich mein System eher wenig konfigurieren will. Ich mag also keine Shell-Extensions (oder Vim-Plugins, etc.)
Naja, so viel ist da bei fzf jetzt nicht zu konfigurieren, aber ich glaube zu verstehen, was du meinst.
... kann ich mit unscharfer Suche insgesamt wenig anfangen. Im Gegenteil, ich schaetze die Exaktheit von Computern. Es faellt mir halt auch leicht, exakt zu arbeiten.
Das sehe ich anders bzw. es ist aus meiner Sicht ein anderer Zugang. Fzf (als Beispiel, gibt ja auch anderes, mir fiele dazu auch Debianrofi und dmenu ein) gibt dir exakte Ergebnisse, das ist ja gerade das Tolle daran.

Ich würde mich selber jetzt überhaupt nicht als chaotisch in meiner Arbeit bezeichnen, aber ich schätze es sehr, dass mir fzf die Möglichkeit gibt auf sehr schnellem Weg genau da hin zu kommen, wo ich hin will - und das auf (ich kann's im Moment nicht besser ausdrücken) vielleicht eher "unterbewusste" Art. Damit meine ich, ich weiss immer genau, was ich suche oder wo ich hin will, muss mich aber um die genaue Ausformulierung der Schritte dorthin nicht so sehr kümmern. Es ist für mich einfach ein sehr tolles Werkzeug, das mich nicht ablenkt oder mir im Weg steht. Klingt jetzt wahrscheinlich blöd, ist für mich aber so.

Ich muss aber auch dazusagen, dass ich jetzt auch kein prinzipieller Fanboy davon bin. Weiß ich zB. die Pfade genau auswendig, öffne, kopiere... ich meist immer "per Hand" und bilde mir ein, zumindest genauso schnell zu sein. :lol:

Aber ich mag diese intuitiven Sachen (ich weiß, dass der Ausdruck hier von vielen nicht geschätzt wird) schon sehr.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von smutbert » 17.12.2022 01:05:10

Danke für die netten Worte.

Mit der Option -e arbeitet fzf übrigens nur mit exakten Treffern :wink:
Beim Schreiben dieses mittlerweile gestrigen und des heutigen Beitrages habe ich auch gemerkt, dass ich das „fuzzy“ von fzf kaum nutze.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von Meillo » 17.12.2022 08:26:18

dasebastian hat geschrieben: ↑ zum Beitrag ↑
16.12.2022 23:04:14
[...9 ich schätze es sehr, dass mir fzf die Möglichkeit gibt auf sehr schnellem Weg genau da hin zu kommen, wo ich hin will - und das auf (ich kann's im Moment nicht besser ausdrücken) vielleicht eher "unterbewusste" Art. Damit meine ich, ich weiss immer genau, was ich suche oder wo ich hin will, muss mich aber um die genaue Ausformulierung der Schritte dorthin nicht so sehr kümmern. Es ist für mich einfach ein sehr tolles Werkzeug, das mich nicht ablenkt oder mir im Weg steht.
Ich finde, dass du damit den Punkt gut triffst. Dir hilft es, nur zu sagen wo du hinwillst, ohne dich damit zu befassen, wie der genaue Pfad lautet. Mir ist es wichtig, alle Pfade hinzuschreiben, um das Gefuehl zu haben, sicher zu wissen, wo ich bin. Beide Herangehensweisen finde ich vollkommen legitim. Menschen sind unterschiedlich. Da gibt es kein besser oder schlechter. Gerade das finde ich das Tolle an Linux: jede Person kann es so einrichten, wie es fuer sie am besten passt. Und das finde ich auch das Tolle an diesem Adventskalender: er bietet ein so breites Spektrum an Themen, dass ich immer wieder mit etwas in Kontakt komme, das ausserhalb meiner Alltagswelt liegt. Dabei lerne ich kennen, wie andere arbeiten und was ihnen hilft. Auch wenn ich das eine oder andere Programm nicht brauche, so verstehe ich dadurch die Arbeitsweisen und Beduerfnisse von anderen besser, und das ist wertvoll.

Wenn ich mir vorstelle, dass ich Legasteniker waere, dann wuerde ich eine Fuzzy-Suche und z.B. die Autokorrektur von Verzeichnisnamen in der zsh super finden, weil sie mir das Leben erleichtern. Auch die Idee, sich nicht mit Pfaden, sondern mehr mit den Zielen zu befassen, leuchtet mir ein. Wenn jemand in der Weise denkt und so organisiert ist, dann scheint mir ein Programm wie fzf ein geniales Werkzeug zu sein. :THX:
Use ed once in a while!

dasebastian
Beiträge: 1884
Registriert: 12.07.2020 11:21:17

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von dasebastian » 17.12.2022 09:06:22

Meillo hat geschrieben: ↑ zum Beitrag ↑
17.12.2022 08:26:18
... das Tolle an Linux: jede Person kann es so einrichten, wie es fuer sie am besten passt. Und das finde ich auch das Tolle an diesem Adventskalender: er bietet ein so breites Spektrum an Themen, dass ich immer wieder mit etwas in Kontakt komme, das ausserhalb meiner Alltagswelt liegt. Dabei lerne ich kennen, wie andere arbeiten und was ihnen hilft. Auch wenn ich das eine oder andere Programm nicht brauche, so verstehe ich dadurch die Arbeitsweisen und Beduerfnisse von anderen besser, und das ist wertvoll.
+100% :THX:
Wenn ich mir vorstelle, dass ich Legasteniker waere, dann wuerde ich eine Fuzzy-Suche ...
DAS ist ja eine Idee! Gehirnt, vielleicht kann ich's mal wem empfehlen aus diesem Grund empfehlen.

leolein
Beiträge: 89
Registriert: 03.06.2009 23:15:08
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Re: Adventskalender 16. Dezember 2022 - Ein Tool zur unscharfen Suche I

Beitrag von leolein » 17.12.2022 21:57:58

Auch mich hat dieses Thema sehr gefreut! Ich nutze es auch, eingerichtet hab ich es allerdings nicht selbst/alleine. Ich verstehe davon auch noch viel zu wenig um mich hier ausführlich dazu äussern zu können.

Was ich aber sagen kann und mag, ist: Es ist sehr angenehm wie es mir vieles erleichtert. Vorranging nutze ich es mit der shell-history, ja.
Als ich zum ersten Mal davon hörte, dachte ich erst "ungenaue/unscharfe Suche...? Wie soll das denn bitte mir helfen zu finden was ich suche?" Mich hat es dann in der Praxis überzeugt, eine Vorstellung davon bekam ich erst beim Nutzen. Es findet eben wirklich genau das wovon ich nur noch ungenau weiss wie es heisst.

Die Vorfreude war nicht vergebens, denn die Vermutung was hinter dem Titel steckt hat sich bewahrheitet.

Danke für das/die Türchen! :)

Antworten