La finalización de tabulación para los argumentos del comando falla en Cygwin debido a la extensión `.exe`

La finalización de tabulación para los argumentos del comando falla en Cygwin debido a la extensión `.exe`

¿Existe una opción de configuración en Cygwin para que cuando Bash complete el nombre del comando, el .exesufijo del nombre del archivo se ignore (no se incluya)?


Explicación del problema.

Cuando se utiliza la función de tabulación en Bash en un sistema Cygwin para completar el nombre de un comando, la .exeextensión se agrega al nombre del comando, por ejemplo, al escribir opensy presionar Tabse completa el comando openssl.exe.

El comando funciona bien (con MS Windows la .exeextensión es opcional cuando se ejecuta un comando) pero el problema es que la _openssl()función de finalización proporcionada por elbash-completionEl paquete solo está configurado para proporcionar argumentos completos para openssl– not openssl.exe. Por ejemplo:

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

El mismo problema existe cuando se intenta completar argumentos a favortodocomandos ejecutables.

Actualmente uso Bash con el modo Emacs configurado para la edición Readline, por lo que puedo presionar Escseguido de dos Backspacepresiones para eliminar el .exesufijo antes de comenzar a escribir los argumentos para el comando. Idealmente, me gustaría evitar tener que hacer esto cada vez que ejecuto un comando.


Lo que he probado/investigado

Pensé que probablemente eso no sea posible sin modificar el código fuente de la DLL Cygwin o la finalización del comando de Bash ( pcomplete.c). Sin embargo, noto que las funciones integradas de Bash typeeliminan commandautomáticamente el .exesufijo de los nombres de los archivos ejecutables, por ejemplo,

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

$ command -v openssl
/usr/bin/openssl

Parece que Bash que se ejecuta en Cygwin tiene algún mecanismo para proporcionar el nombre del comando simple (sin la .exeextensión). Sin embargo, no sé cómo (o si) se puede usar esto para omitir la extensión del archivo al completar comandos.

Respuesta1

Resulta que hayesuna opción de configuración en Cygwin que configura Bash para que no incluya .exela extensión de un nombre de archivo cuando completa el nombre de un comando.

Habilitar la completion_strip_exeopción (específica del puerto Cygwin de Bash) hace lo que quiero:

shopt -s completion_strip_exe

Esta característica no está documentada de manera muy obvia: recibe una mención superficial en elExpansión de nombre de rutasección de la página de manual de Cygwin para Bash (no está incluida en el código fuente anterior, por lo que no está documentada en la página de manual oficial nidocumentación para bash). Lo encontré mientras leía detenidamente /usr/share/doc/Cygwin/bash.README(unos 4 meses después de hacer esta pregunta):

7b. el uso de 'shopt -s complete_strip_exe' crea sufijos .exe en la tira de finalización.

Parece que esta opción ha estado disponible en Cygwin Bash desde hace más de 5 años:

----- versión 4.1.9-1 -- 2010-12-29 -----
Agregue los parches EXECIGNORE y complete_strip_exe de Dan Colascione.

Investigaciones adicionales muestran que el parche para esta característica fuepresentado por Dan Colascioneen noviembre de 2010 con elsiguiente descripción:

completion_strip_exees una nueva opción de shell. Cuando está habilitado, bash intenta usar el nombre corto de un programa en lugar del más largo con el sufijo ".-exe". Con esto activado, el pin se completa para hacer "ping".

Muchas gracias a Dan Colascione (le acabo de enviar un correo electrónico personal para agradecerle personalmente) por esta característica y a los mantenedores de Bash por proporcionar un shell tan excelente.

información relacionada