由于“.exe”扩展名,Cygwin 中的命令参数 Tab 补全失败

由于“.exe”扩展名,Cygwin 中的命令参数 Tab 补全失败

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,并将 Emacs 模式配置为 Readline 编辑,这样我就可以先按 ,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

这个特性并没有被记录下来:路径名扩展Cygwin 手册页中有关 Bash 的部分(它未包含在上游源代码中,因此未在官方手册页中记录或Bash 文档)我在阅读时偶然发现了这一点/usr/share/doc/Cygwin/bash.README(在提出这个问题后大约 4 个月):

7b. 使用 'shopt -s频带完成_strip_exe' 使完成删除.exe 后缀。

看来这个选项在 Cygwin Bash 中已经存在 5 年多了:

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

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

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

非常感谢 Dan Colascione(我刚刚给他发了一封私人电子邮件以亲自表示感谢)提供此功能,并感谢 Bash 维护者提供如此出色的 shell。

相关内容