Frage Befehlsabschluß der Argumente aus dem Ordner


Ist es möglich, eine Liste von Vervollständigungen für einen Befehl basierend auf einigen Ordner-Dateien zu erstellen?

Angenommen, ich möchte Sublime Text 2 in einem meiner Projekte ausführen, die als gespeichert sind ~/sublime_projects/*.sublime-project. Gewünschtes Verhalten:

 subl<tab><tab>
   foo bar project2

falls da sind foo.sublime-project, bar.sublime-project, project2.sublime-project Dateien in ~/sublime_projects.


4
2017-08-24 09:06


Ursprung




Antworten:


Sie können die folgende bash Funktion verwenden, fügen Sie sie in Ihnen hinzu .bashrc

Notieren Sie den Verzeichnispfad für die Variable PROJECTS_DIR

# bash completion for sublime projects in ~/projects
_subl()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    PROJECTS_DIR="/home/mreq/projects/"
    LOOK_FOR="*.sublime-project"
    cd ${PROJECTS_DIR}
    PROJECTS=$(ls ${LOOK_FOR})
    COMPREPLY=( $(compgen -W "${PROJECTS}" -- $cur) )
}
complete -F _subl subl

Was es macht:

  • wenn Sie tippen subl TAB TAB TAB Es listet alle Projekte im Projektverzeichnis auf

  • wenn Sie tippen subl ANY_LETTER TAB Es schließt den Projektnamen automatisch ab, wenn der ANY_LETTER_TAB passt zum ersten Zeichen des Projekts.

Zum Beispiel wenn du drinnen bist ~/projects folgende: test.sublime-project und foo.sublime-project und tippen Sie ein subl t TAB im Terminal wirst du bekommen subl test.sublime-project

AKTUALISIEREN Das folgende Skript ändert nicht die PWD Ich verlasse beide für zukünftige Referenz.

# bash completion for sublime projects in ~/projects
_subl()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    PROJECTS_DIR="/home/mreq/projects/"
    LOOK_FOR=".sublime-project"
    # cd ${PROJECTS_DIR}
    PROJECTS=$(ls ${PROJECTS_DIR} | grep "^${cur}.*${LOOK_FOR}")
    COMPREPLY=${PROJECTS_DIR}${PROJECTS}
}
complete -F _subl subl

Das zweite Skript sucht danach nach einem typisierten Zeichen subl und ersetzt sie durch den vollständigen Pfad des übereinstimmenden Dateinamens. Zum Beispiel wenn es ein test.sublime-project im ~/projects durch Eingabe von subl t wird ersetzt durch subl /home/USERNAME/projects/test.sublime-project


4
2017-08-24 11:32



Erstaunlich, genau wonach ich gesucht habe. Vielen Dank. - mreq
Eine Sache: Das ändert deine $PWD zu $PROJECTS_DIR. Gibt es einen Weg, den aktuellen zu behalten? Ich habe versucht, es zu speichern und danach wiederherzustellen COMPREPLY Zuweisung, aber das hat nicht funktioniert. - mreq
Danke für die Bearbeitung! Leider funktioniert das zweite Skript nicht mit dem Leerzeichen <tab> Fertigstellung von Projekten. Mit dem ersten - es ist komisch, das Tippen cd - nach dem $PWD Veränderung wurde getan, bringt dich nicht dahin zurück, wo du warst. - mreq
Es bringt dich nicht zurück, weil das Skript zurückkehrt. Was das zweite Skript betrifft, so können Sie zu Wildcard * und TAB übergehen, um Projekte aufzulisten, aber nicht auf eine gut aussehende Weise. Persönlich bevorzuge ich das erste Skript. - Stef K