Завершение табуляции для командных аргументов завершается неудачно в 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 за предоставление такой замечательной оболочки.