由於“.exe”副檔名,Cygwin 中命令參數的製表符補全失敗

由於“.exe”副檔名,Cygwin 中命令參數的製表符補全失敗

Cygwin 中是否有設定選項,以便當 Bash 完成命令名稱時,檔案名稱的.exe後綴被忽略(不包括)?


問題說明

當在 Cygwin 系統上的 Bash 中使用製表符完成來完成命令名稱時,.exe擴展名將附加到命令名稱,例如,鍵入opens並按下將Tab命令完成為openssl.exe

該命令運行良好(對於 MS Windows,.exe運行命令時擴展是可選的),但問題是_openssl()bash-completion包僅配置為提供openssl– not的參數補全openssl.exe。例如:

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

嘗試完成論證時也存在同樣的問題全部可執行命令。

我目前使用 Bash 並配置了用於 Readline 編輯的 Emacs 模式,因此我可以在開始鍵入命令參數之前按Esc,然後按兩次Backspace來刪除後綴。.exe理想情況下,我希望避免每次運行命令時都必須這樣做。


我嘗試過/研究過的

我認為如果不修改 Cygwin DLL 或 Bash 命令完成 ( pcomplete.c) 的源代碼,這可能是不可能的。但是,我注意到 Bash 內建函數type會自動從可執行檔的名稱中command刪除後綴,例如,.exe

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

$ command -v openssl
/usr/bin/openssl

似乎在 Cygwin 中運行的 Bash 有一些提供裸命令名稱(不含.exe擴展名)的機制。但是,我一直不知道如何(或是否)可以使用它在完成命令時省略檔案副檔名。

答案1

原來有.exeCygwin 中的一個設定選項,用於將 Bash 設定為在完成命令名稱時不包含檔案名稱的副檔名。

啟用該completion_strip_exe選項(特定於 Bash 的 Cygwin 連接埠)可以實現我想要的功能:

shopt -s completion_strip_exe

這個功能沒有很明顯的記錄:它在路徑名擴充Bash 的 Cygwin 手冊頁部分(它不包含在上游原始碼中,因此沒有記錄在官方手冊頁中或Bash 的文檔)。我在仔細閱讀時發現了它/usr/share/doc/Cygwin/bash.README(在問這個問題大約 4 個月後):

7b.使用“shopt -scompletion_strip_exe”使完成條帶有.exe後綴。

看來這個選項在 Cygwin Bash 中已經可用了 5 年多了:

----- 版本 4.1.9-1 -- 2010-12-29 -----
新增 Dan Colascione 提供的 EXECIGNORE 和completion_strip_exe 修補程式。

進一步的研究表明,該功能的補丁是丹·科拉西奧內提交早在 2010 年 11 月,以下描述:

completion_strip_exe是一個新的 shell 選項。啟用後,bash 會嘗試使用程式的短名稱,而不是較長的「.-exe」後綴名稱。啟用此功能後,引腳將完成“ping”。

非常感謝 Dan Colascione(我剛剛給他發了一封私人電子郵件以親自感謝他)提供的此功能,以及 Bash 維護者提供的如此出色的 shell。

相關內容