Я создатель и сопровождающий приложения для командной строки на основе PHP для разработчиков. Синтаксис моей команды соответствует нормам других приложений командной строки PHP и выглядит следующим образом
pestle.phar some:command:name ...arguments and options here...
pestle.phar some:command ...arguments and options here...
То есть — в имени команды используются двоеточия. Это представляло проблемы, когда я пытался использовать стандартные функции автозаполнения bash.
Благодаря немного Другой ответы Я был в состоянии определить, что это было Bash лечения :
в качестве разделителя слов, и что проект завершения bash (brew install bash-completion
может помочь. Я смог собрать сценарий такого рода работ, но я застрял в нескольких вещах и недостаточно хорошо разбираюсь в системе, чтобы самостоятельно диагностировать. Кроме того, мои навыки написания скриптов на Bash ржавые.
Вот пример чего-то такого рода работ.
#File: /usr/local/etc/bash_completion.d/pestle-autocomplete.sh
#!/bin/bash
_commandList ()
{
echo "codecept:convert-selenium-id-for-codecept"echo "magento2:check-templates"echo "magento2:generate:acl"#.. other comand names..
return 0;
}
_pestleAutocomplete ()
{
local cur
local all
_get_comp_words_by_ref -n : cur
all=$(_commandList)
COMPREPLY=( $(compgen -W "$all" $cur) )
__ltrim_colon_completions "$cur"return 0
}
complete -F _pestleAutocomplete -o filenames pestle.phar
Если я наберу $ pestle.phar mag
а затем нажмите вкладку, в моей оболочке выводится следующее
$ pestle.phar magento2\:
То есть, magento2:
авто завершает, но :
сбежал с косой чертой. Если я ввожу имя команды, это «работает», но выглядит немного забавно. Итак, вопрос 1 — как мне избавиться от этой косой черты и откуда она взялась.
Второе — я не понимаю, что __ltrim_colon_completions
команда делает. В примерах, которые я видел, обычно используется что-то вроде
_mytool()
{
local cur
_get_comp_words_by_ref -n : cur
# my implementation here
__ltrim_colon_completions "$cur"}
complete -F _mytool mytool
Однако, на мой наивный взгляд — это, кажется, ничего не делает. Это посторонний вызов в конце скрипта с использованием локальной переменной. Я предполагаю, что это меняет некоторое состояние в системе bash-complete, но, опять же, мои знания там неполны. Я не уверен, связано ли это с моей проблемой побега.
Если у кого-то есть конкретный ответ, или он может указать мне правильное направление, я был бы признателен. OS X 10.11, El Cap, сток bash — если это имеет значение.
Можно настроить COMP_WORDBREAKS
переменная таким образом, что двоеточие ведет себя не так, как обычно;
COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
Удаление :
из этого значения достаточно, чтобы двоеточие не было особенным для завершения (что может или не может быть тем, что вы хотите). Я подозреваю, что он получает обратную косую черту \:
перед ним из-за того, как вы исключили его с _get_comp_words_by_ref -n : cur
, Вы также можете заключить двоеточие в обратный слеш, чтобы временно достичь того же результата.
Завершение имени файла (и завершение слова в целом) может отображаться как
вести себя неправильно, если в слове есть двоеточие, которое нужно дополнить.Двоеточие является особенным для кода завершения слова readline: это один из
символы, которые разбивают слова для завершителя. Readline использует
эти символы в некотором роде так же, как использует Bash$IFS:
как они
разбить или отделить слова код завершения руки до
специфичные для приложения или функции завершения слова по умолчанию.
Первоначально предполагалось облегчить редактирование списков, разделенных двоеточиями.
(такие как$PATH
в bash) в различных приложениях, использующих readline для
вход.Это осложняется тем, что некоторые версии популярных
у программируемого пакета завершения bash-complete есть проблемы с
стандартное поведение завершения при наличии двоеточий.Текущий набор символов завершения слова завершения доступен в
Баш как значениеCOMP_WORDBREAKS
переменная. Удаление `: ‘из
этого значения достаточно, чтобы двоеточие не было особенным для завершения.
__ltrim_colon_completions
Эта функция в основном просто обрезает завершение, так что возвращаемое слово является только префиксом (или что-то еще, оставшееся слева от последнего двоеточия справа). Примером может служить такая команда, как hello:world
и я начал печатать he
и нажал TAB, hello:
часть это то, что будет возвращено. Функция именно такая:
# Define preload__ltrim_colon_completions="false", if the function
# __perf__ltrim_colon_completions() is required instead.
preload__ltrim_colon_completions="true"
if [ $preload__ltrim_colon_completions = "true" ]; then
type __ltrim_colon_completions &>/dev/null ||
preload__ltrim_colon_completions="false"fi
[ $preload__ltrim_colon_completions = "true" ] ||
__perf___ltrim_colon_completions()
{
if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
# Remove colon-word prefix from COMPREPLY items
local colon_word=${1%"${1##*:}"}
local i=${#COMPREPLY[*]}
while [[ $((--i)) -ge 0 ]]; do
COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
echo $COMPREPLY[$i]
done
echo $colon_word
fi
}
Некоторые другие переменные в коде завершения могут быть установлены для обработки слов по-разному в зависимости от приложения; может быть, попробуйте метод в самом верху, и если это не то, что вы ищете, то, возможно, просмотрите код ответственность за его контроль.
Других решений пока нет …