
Existe uma opção de configuração no Cygwin para que quando o Bash completar o nome do comando, o .exe
sufixo 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 .exe
extensão é anexada ao nome do comando, por exemplo, digitar opens
e pressionar Tabcompleta o comando para openssl.exe
.
O comando funciona bem (no MS Windows a .exe
extensão é opcional ao executar um comando), mas o problema é que a _openssl()
função de conclusão fornecida pelobash-completion
package é configurado apenas para fornecer conclusões de argumentos para openssl
– not 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 paratodoscomandos executáveis.
Atualmente uso o Bash com o modo Emacs configurado para edição Readline para que eu possa pressionar Escseguido de dois Backspacepressionamentos para remover o .exe
sufixo antes de começar a digitar os argumentos do comando. Idealmente, gostaria de evitar ter que fazer isso toda vez que executar um comando.
O que eu tentei/pesquisei
Achei que isso provavelmente não seria possível sem modificar o código-fonte da DLL Cygwin ou da conclusão do comando do Bash ( pcomplete.c
). No entanto, noto que os recursos internos do Bash type
removem command
automaticamente o .exe
sufixo 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 .exe
extensão). No entanto, não sei como - ou se - isso pode ser usado para omitir a extensão do arquivo ao concluir comandos.
Responder1
Acontece que háéuma opção de configuração no Cygwin que configura o Bash para não incluir uma extensão de nome de arquivo .exe
ao completar o nome de um comando.
Habilitar a completion_strip_exe
opção (específica para a porta Cygwin do Bash) faz o que eu quero:
shopt -s completion_strip_exe
Este recurso não está documentado de forma muito óbvia: ele é mencionado superficialmente noExpansão do nome do caminhoseção da página de manual do Cygwin para Bash (ela não está incluída no código-fonte upstream, portanto não está documentada na página de manual oficial oudocumentação para Bash). Me deparei com isso durante a leitura /usr/share/doc/Cygwin/bash.README
(cerca de 4 meses depois de fazer esta pergunta):
7b. usar 'shopt -s complete_strip_exe' cria sufixos .exe da faixa de conclusão.
Parece que esta opção está disponível no Cygwin Bash há mais de 5 anos:
----- versão 4.1.9-1 -- 2010-12-29 -----
Adicione os patches EXECIGNORE e complete_strip_exe de Dan Colascione.
Outras pesquisas mostram que o patch para esse recurso foienviado por Dan Colascioneem novembro de 2010 com oseguinte descrição:
completion_strip_exe
é uma nova opção de shell. Quando ativado, o bash tenta usar o nome abreviado de um programa em vez do nome mais longo com o sufixo ".-exe". Com isso ativado, o pin é concluído para "ping".
Muito obrigado a Dan Colascione (acabei de enviar a ele um e-mail pessoal para agradecê-lo pessoalmente) por esse recurso e aos mantenedores do Bash por fornecerem um shell tão excelente.