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

1404
Anthony Geoghegan

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

4

1 ответ на вопрос

5
Anthony Geoghegan

Оказывается, в 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 и complete_strip_exe от Dan Colascione.

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

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

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

Похожие вопросы