Gibt es eine Shell, die die Fuzzy-Vervollständigung wie in Sublime Text unterstützt?

14

Ich verwende bash und ich frage mich , ob es eine Plugin in bash oder andere Schale ist , die mich , dies zu tun erlaubt cat tfnislong.txt+ [tab]abgeschlossen ist, um cat ThisFileNameIsSoLong.txtwie Tabulatorvervollständigung in Sublime Text.

Holzungen
quelle
Warum nicht einfach cat Th+ machen tab?
Daviewales
1
@daviewales Alle 269 Gründe anzeigen?
Fax

Antworten:

11

Ich kenne https://github.com/mgalgs/fuzzy_bash_completion , eine Reihe von Shell-Funktionen, die mit verwendet werden complete.

Ich denke, wir könnten es wahrscheinlich etwas besser machen, prägnanter sein. Zeit, dein .bashrc oder .profile aufzubrechen ...

Der grundlegende Haken, den wir verwenden, ist folgender:

complete -o nospace -o filenames -F fuzzypath cd ls cat

-F Option bedeutet, dass eine Shell-Funktion für die Tab-Vervollständigung verwendet wird, wobei die Optionen in der COMPREPLYVariablen festgelegt werden. Also zum Beispiel:

Funktion fuzzypath () {
    wenn [-z $ 2] 
    dann
        COMPREPLY = (`ls`)
    sonst
        DIRPATH = `echo" $ 2 "| gsed 's | [^ /] * $ ||' `
        BASENAME = `echo" $ 2 "| gsed 's |. * / ||' `
        FILTER = `echo" $ BASENAME "| gsed 's |. | \ 0. * | g'`
        COMPREPLY = (`ls $ DIRPATH | grep -i" $ FILTER "| gsed" s | ^ | $ DIRPATH | g "`)
    fi
}}

Wo DIRPATHist alles vor dem letzten / auf Ihrem Pfad, den Sie eingeben, und BASENAMEwo befindet sich derzeit Ihr Cursor?

FILTERHier kommt die Unschärfe ins Spiel. Nehmen Sie im Grunde genommen ein BASENAMEZeichen .*zwischen jedes Zeichen und fügen Sie es ein , um unseren Fuzz-Regex zu erzeugen.

Der Rest kombiniert nur den regulären Ausdruck mit ls, um zu produzieren COMPREPLY. Vielleicht finden Sie hier klügere Dinge, vielleicht mit find.

Ich fand auch http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html nützlich.

mwm
quelle
6

Sie können fzf nützlich finden. Es ist ein in Ruby geschriebener Allzweck-Fuzzy-Finder, der mit jeder Liste von Dingen verwendet werden kann: Dateien, Prozesse, Befehlsverlauf, Git-Zweige usw.

Das Installationsskript richtet die CTRL-TTastenkombination für Ihre Shell ein. Das folgende GIF zeigt, wie es funktioniert.

Junegunn Choi
quelle
FZF ist großartig! Vielen Dank für Ihren Beitrag. Das ersparte mir Wochen Arbeit. Ich fing an, Fuzzy-Vervollständigungen für Bash zu schreiben, als ich zum Glück FZF fand. Es funktioniert perfekt, ich musste nur daran denken, die Cursorposition zu speichern, bevor ich fzf.. (tput sc) aufrief und später mit tput rc..
Håkon Hægland
3

Um Ihrer anderen Antwort zu folgen, sollten Sie sich zsh ansehen. Es ist abwärtskompatibel mit Bash, sodass Sie es als Ersatz verwenden können. Es unterstützt jedoch erheblich erweiterte Funktionen und eine davon ist die stark kontextbezogene Vervollständigung von Registerkarten.

Die häufig gestellten Fragen zu zsh Completion erweitern die Anwendungsfälle, aber ich glaube, dass Sie gemäß Ihrem Beispiel am meisten an der COMPLETE_IN_WORDFunktion interessiert wären . Es ist nicht ganz das gewünschte Verhalten, aber es ist nah. Der Hauptpunkt ist, dass es viele Möglichkeiten gibt, die Basisfunktionalität auf eine möglicherweise zugänglichere Weise zu erweitern als die Verwendung von Bash.

Hier ist eine Fuzzy-Match-Erweiterung, die sich Ihren Wünschen nähert. zsh-fuzzy match

Für einige Ideen können Sie sich das beliebte oh-my-zsh- Framework ansehen , das eine Reihe von Funktionen zum Verwalten und Erweitern von zsh bietet. Es ist höchstwahrscheinlich mehr als Sie möchten, aber unter den Plugins finden Sie Skripte zur automatischen Vervollständigung für eine Vielzahl von Rollen. Um sich ein Bild von den Funktionen zu machen.

krondor
quelle