
Meine bash
automatische 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 *.cmi
und *.cmo
übereinstimmen git
. Dies funktioniert tatsächlich wie beabsichtigt. Leider unterbricht dies auch die Autovervollständigung von git
Befehlen 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 git
Befehls 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 add
natü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 add
ohne sie zur Ignorierliste von Git hinzuzufügen, müssen Sie sich meiner Meinung nach mit dem Git-Vervollständigungsskript befassen. _git_add
ruft __git_complete_index_file
which-Aufrufe auf, __git_index_files
um die Liste der Kandidatendateien zu generieren, und es ruft wiederum __git_ls_files_helper
which-Aufrufe git ls-files
mit 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).