A conclusão da tabulação para argumentos de comando falha no Cygwin devido à extensão '.exe'

4

Existe uma opção de configuração no Cygwin para que, quando o Bash conclua o nome do comando, o sufixo .exe do nome do arquivo seja ignorado (não incluído)?

Explicação do problema

Ao usar o preenchimento de tabulação no Bash em um sistema Cygwin para completar o nome de um comando, a extensão .exe é anexada ao nome do comando, por exemplo, digitando opens e pressionando a tecla Tab o comando para openssl.exe .

O comando é executado corretamente (com o MS Windows, a extensão .exe é opcional ao executar um comando), mas o problema é que a função _openssl() de conclusão é fornecida pelo bash-completion está configurado apenas para fornecer conclusões de argumentos para openssl - não openssl.exe . Por exemplo:

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

O mesmo problema existe ao tentar completar argumentos para comandos executáveis all .

Eu atualmente uso Bash com o modo Emacs configurado para edição Readline, então eu posso pressionar Esc seguido por duas pressionamentos de Backspace para remover o sufixo .exe antes de começar a digitar os argumentos para o comando. Idealmente, eu gostaria de evitar ter que fazer isso toda vez que eu executar um comando.

O que eu tentei / pesquisei

Eu percebi que isso provavelmente não é possível sem modificar o código-fonte da DLL do Cygwin ou a conclusão do comando do Bash ( pcomplete.c ). No entanto, percebo que os integrantes do Bash, type e command , excluem automaticamente o sufixo .exe dos nomes dos arquivos executáveis, por exemplo,

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

$ command -v openssl
/usr/bin/openssl

Parece que o Bash em execução no Cygwin possui algum mecanismo para fornecer o nome do comando simples (sem a extensão .exe ). No entanto, não sei como - ou se - isso pode ser usado para omitir a extensão do arquivo ao concluir comandos.

    
por Anthony Geoghegan 03.05.2016 / 12:33

1 resposta

5

Acontece que é uma opção de configuração no Cygwin que configura o Bash para não incluir a extensão .exe de um nome de arquivo ao concluir o nome de um comando.

Ativar a opção completion_strip_exe (específica da porta do Bash do Cygwin) faz o que eu quero:

shopt -s completion_strip_exe

Este recurso não está documentado de forma muito óbvia: ele recebe uma menção superficial na seção Expansão do nome do caminho da página do manual do Cygwin para Bash (ele não está incluído no código-fonte upstream, portanto não está documentado a man page oficial ou a documentação do Bash . Eu me deparei com isso enquanto lia /usr/share/doc/Cygwin/bash.README (uns 4 meses depois de fazer essa pergunta):

7b. using 'shopt -s completion_strip_exe' makes completion strip .exe suffixes.

Parece que esta opção está disponível no Cygwin Bash há mais de 5 anos:

----- version 4.1.9-1 -- 2010-12-29 -----
Add EXECIGNORE and completion_strip_exe patches from Dan Colascione.

Mais pesquisas mostram que o patch desse recurso foi enviado por Dan Colascione em novembro 2010 com a descrição a seguir :

completion_strip_exe is a new shell option. When enabled, bash tries to use the short name of a program instead of its longer ".-exe"-suffixed one. With this on, pin completes to "ping".

Muito obrigado a Dan Colascione (eu acabei de enviar-lhe um e-mail pessoal para agradecer pessoalmente a ele) por esse recurso e os mantenedores do Bash por fornecerem uma ótima concha.

    
por 31.08.2016 / 16:17