Автодополнение аргументов команды нажатием клавиши Tab в Cygwin не работает из-за расширения `.exe`

Автодополнение аргументов команды нажатием клавиши Tab в Cygwin не работает из-за расширения `.exe`

Есть ли в Cygwin параметр конфигурации, позволяющий при завершении Bash имени команды .exeигнорировать суффикс имени файла (не включать его)?


Объяснение проблемы

При использовании автодополнения клавишей Tab в Bash в системе Cygwin для завершения имени команды .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

Та же проблема возникает при попытке завершить аргументы в пользувсеисполняемые команды.

В настоящее время я использую 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

Кажется, что Bash, работающий в Cygwin, имеет некий механизм для предоставления голого имени команды (без .exeрасширения). Однако я не знаю, как — и можно ли — это использовать для пропуска расширения файла при завершении команд.

решение1

Оказывается, что естьявляетсяпараметр конфигурации в Cygwin, который настраивает Bash так, чтобы он не включал расширение имени файла .exeпри завершении имени команды.

Включение этой completion_strip_exeопции (специфичной для порта Bash для Cygwin) делает то, что мне нужно:

shopt -s completion_strip_exe

Эта функция не очень явно документирована: она упоминается вскользь вРасширение имени путираздел страницы руководства Cygwin для Bash (он не включен в исходный код основной ветки разработки, поэтому не документирован на официальной странице руководства илидокументация для Bash). Я наткнулся на это, просматривая /usr/share/doc/Cygwin/bash.README(примерно через 4 месяца после того, как задал этот вопрос):

7б. использование 'shopt -s completion_strip_exe' создает суффиксы .exe для завершения полосы.

Похоже, эта опция доступна в Cygwin Bash уже более 5 лет:

----- версия 4.1.9-1 -- 2010-12-29 -----
Добавлены патчи EXECIGNORE и completion_strip_exe от Дэна Колационе.

Дальнейшие исследования показывают, что исправление для этой функции былопредставлено Дэном Колашионееще в ноябре 2010 года сследующее описание:

completion_strip_exeэто новая опция оболочки. При включении bash пытается использовать короткое имя программы вместо более длинного с суффиксом ".-exe". При включении pin завершается в "ping".

Огромное спасибо Дэну Колационе (я только что отправил ему личное письмо, чтобы поблагодарить его лично) за эту функцию и разработчикам Bash за предоставление такой замечательной оболочки.

Связанный контент