Wie kann ich Bash-Autovervollständigungsfunktionen und Filtermuster zusammen verwenden?

Wie kann ich Bash-Autovervollständigungsfunktionen und Filtermuster zusammen verwenden?

Meine bashautomatische Vervollständigung von Befehlen (z. B. find, git, usw.) funktioniert zwar korrekt, aber das funktioniert nicht mehr, sobald ich Filter verwende, um die Vervollständigung bestimmter Dateimuster zu verhindern, z. B.:

complete -f -X '*.@(cmi|cmo)' git

Das Obige sollte verhindern, dass die Autovervollständigung Dateinamen auswählt, die mit *.cmiund *.cmoübereinstimmen git. Dies funktioniert tatsächlich wie beabsichtigt. Leider unterbricht dies auch die Autovervollständigung von gitBefehlen und Flags. Das Ändern der Reihenfolge des Ladens der Vervollständigungsdateien und der obigen Definition scheint keine Rolle zu spielen.

Irgendwelche Ideen, wie beide Funktionen zusammenarbeiten können?

Antwort1

Sie haben Bash angewiesen, den integrierten Dateivervollständigungsmechanismus für zu verwenden git, anstatt die externe Vervollständigungsfunktion aufzurufen, die die Syntax des gitBefehls versteht. Es gibt nur einen Vervollständigungsmechanismus, keine Reihe von Filtern. Wenn Sie eine Reihe von Filtern möchten, müssen Sie diese codieren.

Glücklicherweise unterstützt das 2,7-kLoC-Git-Vervollständigungsskript das Ausschließen von Mustern auf git addnatürliche Weise: Fügen Sie diese Muster zu hinzu .gitignore.

printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore

Wenn Sie Dateien von der Vervollständigung ausschließen möchten, git addohne sie zur Ignorierliste von Git hinzuzufügen, müssen Sie sich meiner Meinung nach mit dem Git-Vervollständigungsskript befassen. _git_addruft __git_complete_index_filewhich-Aufrufe auf, __git_index_filesum die Liste der Kandidatendateien zu generieren, und es ruft wiederum __git_ls_files_helperwhich-Aufrufe git ls-filesmit den Optionen auf, die von ganz unten weitergegeben wurden _git_add. Sie könnten also in _git_addändern

    __git_complete_index_file "--others --modified --directory --no-empty-directory"

um einige Optionen hinzuzufügen, wie --exclude=*.cm[aiox](Achten Sie auf Anführungszeichen: Die Platzhalter werden letztendlich in den Befehl eingefügt und -x *.cm[aiox]würden daher nicht funktionieren, da das Muster im aktuellen Verzeichnis erweitert würde).

verwandte Informationen