由于“.exe”扩展名,Cygwin 中命令参数的选项卡完成失败

Ant*_*gan 4 cygwin bash command-line readline tab-completion

Cygwin 中是否有配置选项,以便在 Bash 完成命令名称时,.exe忽略(不包括)文件名的后缀?


问题说明

在 Cygwin 系统上的 Bash 中使用 Tab 补全来补全命令的名称时,.exe扩展名会附加到命令名称,例如,键入opens并按下Tab将命令补全到openssl.exe.

该命令运行良好(对于 MS Windows,.exe在运行命令时扩展是可选的)但问题是包_openssl()提供的完成功能bash-completion仅配置为提供openssl- 不是openssl.exe. 例如:

$ complete -p openssl openssl.exe
complete -o default -F _openssl openssl
bash: complete: openssl.exe: no completion specification
Run Code Online (Sandbox Code Playgroud)

尝试完成所有可执行命令的参数时存在相同的问题。

我目前将 Bash 与 Emacs 模式配置用于 Readline 编辑,因此我可以在开始键入命令的参数之前按下Esc后按两次Backspace以删除.exe后缀。理想情况下,我希望避免每次运行命令时都必须这样做。


我尝试过/研究过的

我认为如果不修改 Cygwin DLL 或 Bash 命令完成 ( pcomplete.c)的源代码,这可能是不可能的。然而,我注意到,在Bash内建命令,typecommand自动剥离.exe的可执行文件,例如名称后缀,

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

$ command -v openssl
/usr/bin/openssl
Run Code Online (Sandbox Code Playgroud)

似乎在 Cygwin 中运行的 Bash 有一些机制来提供裸命令名(没有.exe扩展名)。但是,我一直不知道如何 - 或者是否 - 在完成命令时可以使用它来省略文件扩展名。

Ant*_*gan 8

事实证明,有在Cygwin的是配置击不包括文件名的配置选项.exe,当它完成命令的扩展名。

启用该completion_strip_exe选项(特定于 Bash 的 Cygwin 端口)执行我想要的操作:

shopt -s completion_strip_exe
Run Code Online (Sandbox Code Playgroud)

这个特性没有很明显的记录:它在Bash 的 Cygwin 手册页的路径名扩展部分粗略地提到(它不包含在上游源代码中,因此没有记录在官方手册页或Bash 文档中)。我在细读时遇到了它/usr/share/doc/Cygwin/bash.README(问这个问题大约 4 个月后):

7b. 使用 'shopt -s completion_strip_exe' 使完成条带 .exe 后缀。

似乎这个选项在 Cygwin Bash 中已经可用超过 5 年了:

----- 版本 4.1.9-1 -- 2010-12-29 -----
添加来自 Dan Colascione 的 EXECIGNORE 和 completion_strip_exe 补丁。

进一步的研究表明,此功能的补丁是由 Dan Colascione于 2010 年 11 月提交的,其描述如下

completion_strip_exe是一个新的 shell 选项。启用后,bash 尝试使用程序的短名称而不是其较长的“.-exe”后缀。开启后,pin 完成“ping”。

非常感谢 Dan Colascione(我刚刚给他发了一封个人电子邮件来感谢他)为这个功能和 Bash 维护者提供了如此出色的 shell。