Завершение табуляции для командных аргументов завершается неудачно в Cygwin из-за расширения `.exe`

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


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

При использовании дополнения табуляции в 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 суффикс, прежде чем я начну вводить аргументы для команды. В идеале я бы хотел избежать необходимости делать это каждый раз, когда запускаю команду.


Что я пробовал / исследовал

Я подумал, что это, вероятно, невозможно без изменения исходного кода DLL Cygwin или завершения команды 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 опция (специфичная для порта Cygwin Bash) делает то, что я хочу:

shopt -s completion_strip_exe

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

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

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

----- версия 4.1.9-1 - 2010-12-29 -----
Добавьте EXECIGNORE и patch_strip_exe патчи от Dan Colascione.

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

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

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

Другие вопросы по тегам