Machen wir Vervollständigung (Autocomplete) und Suche mit fzf bequemer, einer Kommandozeilen-Software mit Fuzzy-Search (Fuzzy Finder)-Funktionalität, die Funktionen wie Befehlsverlaufssuche und Dateiauswahl mit diesen Fähigkeiten bereitstellt.
Die Installation ist super einfach.
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
junegunn/fzf: A command-line fuzzy finder Examples · junegunn/fzf Wiki
- Suchsyntax
Grundsätzlich führt eine normale Suche eine Fuzzy-Suche durch. Wenn Sie also eine genaue Suche durchführen möchten, sollten Sie wieToken Match type Description sbtrkt fuzzy-match Items that match sbtrkt ‘wild exact-match (quoted) Items that include wild ^music prefix-exact-match Items that start with music .mp3$ suffix-exact-match Items that end with .mp3 !fire inverse-exact-match Items that do not include fire !^music inverse-prefix-exact-match Items that do not start with music !.mp3$ inverse-suffix-exact-match Items that do not end with .mp3
On multi-select mode (-m), TAB and Shift-TAB to mark multiple items
'something suchen.
Lassen Sie mich nun vorstellen, wie man es verwendet.
String-Suche wird bequemer
Dies kann für die Suche innerhalb von Dateien verwendet werden. Sie können es beispielsweise verwenden, wenn Sie die Ergebnisse von —help durchsuchen möchten.
cat <<EOT |fzf
hoge
fuga
foo
EOT

Befehlsverlaufssuche wird bequemer
Dies ist wahrscheinlich die bequemste und praktischste Funktion von fzf.
Sie wissen wahrscheinlich, dass Sie den Befehlsverlauf mit Strg-R anzeigen können, aber dies macht es bequemer.
Vervollständigung (Autocomplete) wird bequemer
Die Autovervollständigung von fzf wird nicht durch zweimaliges Drücken der Tabulatortaste ausgelöst, sondern durch Eingabe von ** (zwei Sternchen) und dann Tab.
cd **<TAB>
cd ~/github/fzf**<TAB>
head /docker/**<TAB>
Einige werden jedoch durch normale Autovervollständigung überschrieben. Probieren Sie jede aus.
kill -9 <TAB>
Benutzerdefinierte Autovervollständigung implementieren
fzf ermöglicht es Ihnen auch, Ihre eigenen Tab-Vervollständigungskandidaten zu erstellen.

Sie können Strings so angeben,
_fzf_complete_history() {
_fzf_complete "--multi --reverse" "$@" < <(
echo very
echo wow
echo such
echo history
)
}
[ -n "$BASH" ] && complete -F _fzf_complete_history -o default -o bashdefault history
Mit etwas Einfallsreichtum können Sie auch Befehlsausführungsergebnisse übergeben. Sehr praktisch.
_fzf_complete_sym() {
_fzf_complete "--multi --reverse" "$@" < <(command ls -1 ${HOME}/sym)
}
[ -n "$BASH" ] && complete -F _fzf_complete_sym -o default -o bashdefault sym
Code, den ich tatsächlich verwende
Hier ist etwas Code, den ich tatsächlich geschrieben habe und als Beispiele verwende.
Vervollständigt Skripte, die häufig mit man [commandName] verbunden sind.
Es wird wie man bash > ~/tmp.txt && sublime_text ~/tmp.txt, aber ich zeige Handbuchseiten mit sublime von WSL über x11-Weiterleitung aus einer Windows-Umgebung an. Es ist bequemer, Manpages mit sublime anzuzeigen, sei es zum Kopieren und Einfügen oder Suchen, oder vielmehr bin ich daran gewöhnt.
_fzf_complete_man() {
_fzf_complete "--multi --reverse" "$@" < <(
# view the man pages with sublime via x-server
echo "> ~/tmp.txt && sublime_text ~/tmp.txt "
)
}
[ -n "$BASH" ] && complete -F _fzf_complete_man -o default -o bashdefault man
sym [dirname] ermöglicht eine einfache Navigation zu Ihren Lieblingsverzeichnissen von jedem Verzeichnis aus.
In meinem Fall habe ich einige symbolische Links zum Windows-Dateisystem in meinem sym-Ordner, hauptsächlich für Videos und Musik. Wenn ich also klassische Musik im Zufallsmodus hören möchte, mache ich sym cla**->sym _Classic, um zum Verzeichnis zu wechseln, dann shufmusic, so etwas in der Art.

sym(){
: <<'HELP'
e.g. sym
e.g. sym hinabita
e.g. sym **
HELP
[ ! -z ${1} ] && cd "${HOME}/sym/${1}" || cd "${HOME}/sym"
}
_fzf_complete_sym() {
_fzf_complete "--multi --reverse" "$@" < <(command ls -1 ${HOME}/sym)
}
[ -n "$BASH" ] && complete -F _fzf_complete_sym -o default -o bashdefault sym
Interessante Beispiele
Wenn Sie aus dem Befehlsverlauf auswählen, wird der Befehl sofort ausgeführt. Ehrlich gesagt ist die Effizienz dieselbe wie die Auswahl aus ctrl-R und Drücken der Eingabetaste, daher denke ich nicht, dass es sich lohnt, es zu implementieren. Es kann jedoch in integrierten Systemen genutzt werden.
# fh - repeat history
fh() {
eval $( ([ -n "$ZSH_NAME" ] && fc -l 1 || history) | fzf +s --tac | sed 's/ *[0-9]* *//')
}