Завершение Bash на OS X с двоеточиями

Я создатель и сопровождающий приложения для командной строки на основе 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 — если это имеет значение.

2

Решение

Можно настроить 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
}

Некоторые другие переменные в коде завершения могут быть установлены для обработки слов по-разному в зависимости от приложения; может быть, попробуйте метод в самом верху, и если это не то, что вы ищете, то, возможно, просмотрите код ответственность за его контроль.

1

Другие решения

Других решений пока нет …