Die Tab-Vervollständigung für Befehlsargumente schlägt in Cygwin aufgrund der Erweiterung „.exe“ fehl

Die Tab-Vervollständigung für Befehlsargumente schlägt in Cygwin aufgrund der Erweiterung „.exe“ fehl

.exeGibt es in Cygwin eine Konfigurationsoption, sodass das Suffix des Dateinamens ignoriert (nicht eingeschlossen) wird, wenn Bash den Befehlsnamen vervollständigt ?


Erklärung des Problems

Wenn Sie in Bash auf einem Cygwin-System die Tabulatorvervollständigung verwenden, um den Namen eines Befehls zu vervollständigen, .exewird die Erweiterung an den Befehlsnamen angehängt. Wenn Sie beispielsweise eingeben opensund drücken, Tabwird der Befehl zu vervollständigt openssl.exe.

Der Befehl läuft einwandfrei (unter MS Windows .exeist die Erweiterung bei der Ausführung eines Befehls optional), aber das Problem ist, dass die _openssl()Vervollständigungsfunktion desbash-completionDas Paket ist nur so konfiguriert, dass es Vervollständigungen von Argumenten für openssl– und nicht für – bereitstellt openssl.exe. Beispiel:

$ complete -p openssl openssl.exe
complete -o default -F _openssl openssl
bash: complete: openssl.exe: no completion specification

Das gleiche Problem besteht beim Versuch, Argumente zu vervollständigen füralleausführbare Befehle.

Ich verwende derzeit Bash mit dem für die Readline-Bearbeitung konfigurierten Emacs-Modus, sodass ich drücken Escund dann zweimal Backspacedrücken kann, um das .exeSuffix zu entfernen, bevor ich anfange, die Argumente für den Befehl einzugeben. Idealerweise möchte ich vermeiden, dies jedes Mal tun zu müssen, wenn ich einen Befehl ausführe.


Was ich versucht/recherchiert habe

Ich dachte, das ist wahrscheinlich nicht möglich, ohne den Quellcode der Cygwin-DLL oder der Befehlsvervollständigung von Bash ( pcomplete.c) zu ändern. Allerdings stelle ich fest, dass die integrierten Bash-Programme typedas Suffix commandautomatisch .exeaus den Namen ausführbarer Dateien entfernen, z. B.

$ type -a openssl
openssl is /usr/bin/openssl

$ command -v openssl
/usr/bin/openssl

Es scheint, dass Bash unter Cygwin über einen Mechanismus verfügt, der den reinen Befehlsnamen (ohne die .exeErweiterung) bereitstellt. Ich weiß jedoch nicht, wie – oder ob – dieser verwendet werden kann, um die Dateierweiterung beim Vervollständigen von Befehlen wegzulassen.

Antwort1

Es stellt sich heraus, dass esIsteine Konfigurationsoption in Cygwin, die Bash so konfiguriert, dass die Dateinamenerweiterung .exebei der Vervollständigung des Namens eines Befehls nicht einbezogen wird.

Das Aktivieren der completion_strip_exeOption (speziell für den Cygwin-Port von Bash) bewirkt, was ich möchte:

shopt -s completion_strip_exe

Dieses Feature ist nicht sehr offensichtlich dokumentiert: es wird nur flüchtig erwähnt in derPfadnamenerweiterungAbschnitt der Cygwin-Manpage für Bash (es ist nicht im Upstream-Quellcode enthalten und daher nicht in der offiziellen Manpage dokumentiert oderDokumentation für Bash). Ich bin beim Durchlesen darauf gestoßen /usr/share/doc/Cygwin/bash.README(ungefähr 4 Monate, nachdem ich diese Frage gestellt hatte):

7b. Die Verwendung von „shopt -s completion_strip_exe“ bewirkt, dass die Vervollständigung die .exe-Suffixe entfernt.

Es scheint, dass diese Option in Cygwin Bash seit über 5 Jahren verfügbar ist:

----- Version 4.1.9-1 – 29.12.2010 -----
EXECIGNORE- und completion_strip_exe-Patches von Dan Colascione hinzufügen.

Weitere Untersuchungen zeigen, dass der Patch für diese Funktioneingereicht von Dan Colascioneim November 2010 mit demfolgende Beschreibung:

completion_strip_exeist eine neue Shell-Option. Wenn diese Option aktiviert ist, versucht Bash, den Kurznamen eines Programms zu verwenden, anstatt den längeren mit der Endung „.-exe“. Wenn diese Option aktiviert ist, wird Pin zu „Ping“ vervollständigt.

Vielen Dank an Dan Colascione (ich habe ihm gerade eine persönliche E-Mail geschickt, um ihm persönlich zu danken) für diese Funktion und an die Bash-Betreuer für die Bereitstellung einer so großartigen Shell.

verwandte Informationen