logo

Suletuxe.de
Linux - Nutzer
helfen
Linux - Nutzern

Willkommen, Gast. Bitte Login oder Registrieren.
01. März 2024, 08:12:56
Übersicht Hilfe Suche Login Registrieren

Amateurfunk Sulingen
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe  |  allgemeine Kategorie  |  Tutorials  |  Thema: fzf - command-line fuzzy finder « zurück vorwärts »
Seiten: [1] nach unten Drucken
   Autor  Thema: fzf - command-line fuzzy finder  (Gelesen 408 mal)
Sebastian
Sr. Member
****

Offline

Einträge: 353





Profil anzeigen
fzf - command-line fuzzy finder
« am: 01. November 2023, 20:20:36 »

Hallo Suletuxe,

Einleitung tldr;

Da ihr vielleicht schon gemerkt habt, dass ich von dem Tool navi ziemlich begeistert bin und mich deshalb auch viel damit befasse, habe ich mir jetzt auch mal fzf mal etwas genauer angeschaut, da fzf eine wesentliche Rolle spielt in der Funktionsweise von navi. Aber nicht nur dort, sondern ich habe beobachtet das fzf auch in anderen Programmen auf meinen PC als Abhängigkeit eingetragen ist. Also noch ein Grund mehr für mich, mich mit diesem Tool zu befassen.

Code:

❯ pactree -r -o fzf
fzf
├─downgrade
├─navi
└─zoxide (optional)

Was ist fzf?

fzf ist ein (wie die Überschrift schon sagt) command-line fuzzy finder. Das so viel bedeutet das man stdin, den man fzf zukommen lässt, grob/genau mit Text eingaben Filtern, auswählen undauf den stdout ausgeben lassen kann.

Quasi wie ein Interaktives Grep

Installation







Falls fzf nicht schon auf dem System als Abhängigkeit darauf gekommen ist. Dafür gibt es ein gleichnamiges Paket in den Arch Repos.

Falls man es doch schon auf dem System installiert hat, wäre jetzt der perfekte Zeitpunkt (in Sinne der Systempflege) gekommen seiner ALPM Datenbank mithilfe von pacman mitzuteilen, dass man dieses Paket explizit behalten möchte. Siehe hier

Nach der Installation des Pakets müssen, um die Bash Completion und die Keybindings zu aktivieren noch zwei Dateien eingelesen (gesourct) werden. Siehe hier

Benutzung:

Danach kann man fzf entweder dadurch benutzen, indem man Text in den stdin von fzf leitet, oder man benutzt einer der Standard Tastenkombinationen:

STRG + T = Führt eine Dateisuche rekursiv durch und fügt die gefundene Datei auf dem Shell Prompt ein.
STRG + R = Ersetzt die Shell History Suche, und durchsucht diese Stattdessen mit fzf (super Hilfreich)
ALT + C = Führt ein Verzeichnis suche Rekursiv durch und wechselt gleich in das Verzeichnis

Oder für einige häufige Befehle ist auch der Platz/Suchoperator ** aktiviert der hinter einem Befehl geschrieben und anschließend mit der TAB Taste aktiviert werden kann.

Beispiel:

Code:

cat <Suchmuster>**<TAB>


Lässt man das Suchmuster weg, wird nach allem im aktuellen Verzeichnis rekursiv gesucht.

Welche Befehle um diese Funktion standardmäßig erweitert wurden, erfährt ihr mit:

Code:

complete | grep _fzf

Dabei erhalten einige Befehle auch nützliche Funktionen wie z.b. der kill Befehl der nach Auslösen von **TAB Eine Liste von laufenden Prozessen anzeigt und dessen PID in dem Prompt dann einfügt.

Eigene Befehle mit fzf erweitern:

Wenn man nun einen Befehl um solch einer Funktion erweitern möchte, sodass man dort auch den Platzhalten ** verwenden kann, so kann man dies auf mehrere Arten tun. Man kann die Hilfsfunktion _fzf_setup_completion() benutzen, oder man schreibt sich eine eigene Funktion nach diesem Beispiel oder aber man verwendet die _fzf_comprun() Funktion, die in einer Subshell den stdin noch einmal verarbeitet.

Wahrscheinlich gibt es auch noch mehr Möglichkeiten, aber ich probiere jetzt auch erst ein paar Stunden damit herum.

fd als Standard Suchprogramm verwenden:

Als Standard verwendet fzf, find um eine Auflistung von Pfaden anzuzeigen. Man kann aber auch über folgende globalen Variablen und Funktionen fzf mitteilen das schnellere fd zu verwenden. Vorrausetzung man hat fd installiert. Ihr müsst die Variablen bzw. Funktionen nur in euer Umgebung Sourcen.

Code:

# Setting fd as the default source for fzf
export FZF_DEFAULT_COMMAND='fd --strip-cwd-prefix --hidden --follow --exclude .git'

# To apply the command to CTRL-T as well
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

# Use fd (https://github.com/sharkdp/fd) instead of the default find
# command for listing path candidates.
# - The first argument to the function ($1) is the base path to start traversal
# - See the source code (completion.{bash,zsh}) for the details.
_fzf_compgen_path() {
  fd --hidden --follow --exclude ".git" . "$1"
}

# Use fd to generate the list for directory completion
_fzf_compgen_dir() {
  fd --type d --hidden --follow --exclude ".git" . "$1"
}

Nützliche Standard Optionen:

Es können fzf Parameter an die Globale Variabel FZF_DEFAULT_OPTS
gebunden werden damit diese im jeden fzf menü aktiv sind.

Für mich haben sich folgende Optionen bewährt:

Code:

FZF_DEFAULT_OPTS='--height 100% --cycle'

Weitere Nützliche Funktionen:

Ich wollte das Verhalten das ich in navi habe, auch außerhalb von navi Nachbilden. Das ich bei dem pacman, arch-log und pactree Befehl den ** Platzhalter verwenden kann, damit ich eine Liste installierter Pakete mit einer Paktinformation Vorschau bekomme. Dafür habe ich mir dann folgende Funktionen geschrieben die dann beim Shell Start eingelesen werden:

Code:

_fzf_complete_pacman() {
    _fzf_complete --multi \
        --preview 'pacman -Si {1}' \
        --header="Paket" -- "$@" < <(
            pacman -Slq
        )
}

_fzf_complete_yay() {
    _fzf_complete --multi \
        --preview 'yay -Si {1}' \
        --header="Paket" -- "$@" < <(
            yay -Slq
        )
}

_fzf_complete_arch-log() {
    _fzf_complete_yay "$@"
}

_fzf_complete_pactree() {
    _fzf_complete --multi \
        --preview 'pacman -Qi {1}' \
        --header="Installiertes Paket" -- "$@" < <(
            pacman -Qq
        )
}


Und zu guter Letzt müssen die Funktion in der Bash noch aktiviert werden:

Code:

# Aktivert die eigenen fzf Completion Funktionen, Befehle in das $commands Array packen
commands=(pacman yay arch-log pactree)
if [ -n "$BASH" ]; then
    for i in "${commands[@]}"; do
        complete -F "_fzf_complete_${i}" -o default -o bashdefault "${i}"
    done
fi


Damit kann ich mir jetzt bei den Befehlen eine schöne Paketübersicht mit einer Paketinformationsvorschau beim Blättern geben lassen, um dies im Prompt einzufügen.

Ich hoffe wie immer das dies für den ein oder anderen Hilfreich war. Und wie immer würde ich mich auf positives wie auch negatives Feedback freuen, damit ich die Anleitung Einführung weiter verbessern kann. 

LG
Sebastian
 fzf_pacman_800.png
« Letzte Änderung: 11. November 2023, 15:52:58 von Sebastian »
Gespeichert


Sebastian
Sr. Member
****

Offline

Einträge: 353





Profil anzeigen
fzf - Autocomplete Funktionen
« Antwort #1 am: 02. November 2023, 17:43:36 »

FZF Bash ** Autocomplete Funktionen:

Hier sammele ich mal ein paar Funktionen, um den ** Operator bei einigen Befehlen mit sinnvollen Funktionen zu belegen. 

Nachfolgende Funktionen müssen für die Bash mit folgendem Beispiel Code auch aktiviert werden, Die Funktionen müssen über diesen Code stehen. Mit anderen Worten, die Funktionen müssen vorher bekannt sein:

Code:

# Aktivert die eigenen fzf Completion Funktionen, Befehle in das $commands Array packen
commands=(pacman yay arch-log pactree)
if [ -n "$BASH" ]; then
    for i in "${commands[@]}"; do
        complete -F "_fzf_complete_${i}" -o default -o bashdefault "${i}"
    done
fi

pacman

Gibt eine durchsuchbare Liste von Pakten aus allen bekannten Repositorys mit einer Vorschau aus:

Code:

_fzf_complete_pacman() {
    _fzf_complete --multi \
        --preview 'pacman -Si {1}' \
        --header="Paket" -- "$@" < <(
            pacman -Slq
        )
}

yay

Gibt eine durchsuchbare Liste von Pakten aus allen bekannten Repositorys und dem AUR mit einer Vorschau aus:

Code:

_fzf_complete_yay() {
    _fzf_complete --multi \
        --preview 'yay -Si {1}' \
        --header="Paket" -- "$@" < <(
            yay -Slq
        )
}

arch-log

Siehe yay die _fzf_complete_yay() Funktion ist hier eine Abhängigkeit.

Code:

_fzf_complete_arch-log() {
    _fzf_complete_yay "$@"
}

pactree

Gibt eine durchsuchbare Liste aller installierten Pakete mit einer Vorschau aus.

Code:

_fzf_complete_pactree() {
    _fzf_complete --multi \
        --preview 'pacman -Qi {1}' \
        --header="Installiertes Paket" -- "$@" < <(
            pacman -Qq
        )
}

Falls jemand noch Ideen für eine Autocomplete Funktion für fzf hat nur her damit 

LG
Sebastian
« Letzte Änderung: 02. November 2023, 18:00:30 von Sebastian » Gespeichert

Sebastian
Sr. Member
****

Offline

Einträge: 353





Profil anzeigen
fzf - fd Standard Suchprogramm verwenden
« Antwort #2 am: 05. November 2023, 12:12:43 »

Anfangspost um folgende Passagen erweitert:

fd als Standard Suchprogramm verwenden

Als Standard verwendet fzf, find um eine Auflistung von Pfaden anzuzeigen. Man kann aber auch über folgende globalen Variablen und Funktionen fzf mitteilen das schnellere fd zu verwenden. Vorrausetzung man hat fd installiert. Ihr müsst die Variablen bzw. Funktionen nur in euer Umgebung Sourcen.

Code:

# Setting fd as the default source for fzf
export FZF_DEFAULT_COMMAND='fd --strip-cwd-prefix --hidden --follow --exclude .git'

# To apply the command to CTRL-T as well
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

# Use fd (https://github.com/sharkdp/fd) instead of the default find
# command for listing path candidates.
# - The first argument to the function ($1) is the base path to start traversal
# - See the source code (completion.{bash,zsh}) for the details.
_fzf_compgen_path() {
  fd --hidden --follow --exclude ".git" . "$1"
}

# Use fd to generate the list for directory completion
_fzf_compgen_dir() {
  fd --type d --hidden --follow --exclude ".git" . "$1"
}

Nützliche Standard Optionen:

Es können fzf Parameter an die Globale Variabel FZF_DEFAULT_OPTS
gebunden werden damit diese im jeden fzf menü aktiv sind.

Für mich haben sich folgende Optionen bewährt:

Code:

FZF_DEFAULT_OPTS='--height 100% --cycle'
Gespeichert

Sebastian
Sr. Member
****

Offline

Einträge: 353





Profil anzeigen
fzf Addon - fzf-tab-completion
« Antwort #3 am: 05. November 2023, 12:44:32 »

Einleitung:

Ihr kennt alle die magische Tastenkombination, die wir alle drücken, wenn wir mal nicht mehr genau wissen, wie ein Teil eines Befehls bzw. Dateiname etc. weiter geschrieben wird. Die Rede ist von der Tastenkombination <TAB><TAB>. Und wie auf wundersame Weiße teilt uns dann unsere Shell in den meisten Fällen mit, was wir meinen könnten bzw. füllt dieses bis zu einem gewissen Grad auch noch weiter aus.

Wie wäre es jetzt aber die Tab Completion innerhalb von fzf zu haben? Also wir drücken <TAB><TAB> und schon bekommen wir alle Auswahlmöglichkeiten in fzf präsentiert, + mit allen seien Möglichkeiten wie die Auswahl von Option/Parameter mit einer fuzzy Suche.

Klingt zu schön, um war zu sein? Ist es aber nicht, und zwar mit Auto Complete Scripts fzf-tab-complete

Paketinformation:




Einrichtung:

Nach der Installation muss das Completion Script nur noch für die jeweilige Shell geladen werden. Hier als Beispiel für die Bash:

Code:

# fzf-tab-complition
fzf_bash_completion="/usr/share/fzf-tab-completion/bash/fzf-bash-completion.sh"
if [ -f "${fzf_bash_completion}" ]; then
    source /usr/share/fzf-tab-completion/bash/fzf-bash-completion.sh
   bind -x '"\t": fzf_bash_completion'
fi

Das verhalten was genau passieren soll wenn die Tab Taste gedrückt wird, kann man noch über zwei Globale Variablen verändern:

FZF_COMPLETION_AUTO_COMMON_PREFIX
FZF_COMPLETION_AUTO_COMMON_PREFIX_PART

Welche Werte diese Annehmen können und was diese bewirken, entnimmt bitte den Informationen der Projektseite.

Schlusswort:

Damit sollte endlich auch eine Auto Complete Liste wie gpg --<TAB><TAB> mit seinen 409 Einträgen zu bewältigen sein 

Hoffe, ihr findet dieses Projekt genauso nützlich wie ich. Wie immer würde ich mich über feedback freuen ob ihr das einsetzt oder nicht.

LG
Sebastian
« Letzte Änderung: 11. November 2023, 12:42:12 von Sebastian » Gespeichert

Seiten: [1] nach oben Drucken 
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe  |  allgemeine Kategorie  |  Tutorials  |  Thema: fzf - command-line fuzzy finder « zurück vorwärts »
Gehe zu: 


Login mit Username, Passwort und Session Länge

 Es wird die Verwendung "Blink"-basierter Browser und mindestens 1024x768 Pixel Bildschirmauflösung
für die beste Darstellung empfohlen
 
freie Software für freie Menschen!
Powered by MySQL Powered by PHP Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
© 2001-2004, YaBB SE Dev Team. All Rights Reserved.
- modified by Andreas Richter (DF8OE)
Valid XHTML 1.0! Valid CSS!