2017-01-05 14 views
2

Некоторые команды имеют множество -x (x могут быть любые английские буквы), и некоторые моменты трудно запомнить все их значения. Я могу использовать bash's compgen -W '-a -b -c', чтобы показать возможные варианты, и мне интересно, можно ли также показать некоторое справочное сообщение. Например:Возможно ли отобразить некоторое справочное сообщение при показе кандидатов на автозаполнение?

bash# foo -<TAB><TAB> 
-a: This is option a -b: This is option b 
-C: This is option c 
bash# 

ответ

2

Я когда-либо делал что-то похожее, чтобы отобразить некоторые из curl в одиночных настройках (например, -x) в стиле GNU --long-option.

Вот как это работает:

[STEP 101] # cat curl 
function _compgen_curl() 
{ 
    local cmd=$1 cur=$2 pre=$3 
    local -a options=(\ 
         '' --connect-timeout \ 
         -k --insecure \ 
         -m --max-time \ 
         -o --output \ 
         -O --remote-name \ 
         -u --user \ 
         -U --proxy-user 
         -x --proxy \ 
         -y --speed-time \ 
         -Y --speed-limit \ 
        ) 
    local -a options2=() 
    local i short long 

    for ((i = 0; i < ${#options[@]}; i += 2)); do 
     short=${options[i]} 
     long=${options[i+1]} 
     if [[ -z $short || -z $long ]]; then 
      options2+=($short$long) 
     else 
      options2+=($short,$long) 
     fi 
    done 

    if [[ $cur == - ]]; then 
     COMPREPLY=($(compgen -W "${options2[*]}" -- "$cur")) 
    elif [[ $cur == --* ]]; then 
     COMPREPLY=($(compgen -W "${options[*]}" -- "$cur")) 
    fi 
} 

complete -F _compgen_curl -o bashdefault -o default curl 

 

[STEP 102] # . ./curl 
[STEP 103] # curl -<TAB><TAB> 
--connect-timeout -o,--output  -u,--user   -y,--speed-time 
-k,--insecure  -O,--remote-name -x,--proxy 
-m,--max-time  -U,--proxy-user -Y,--speed-limit 
[STEP 103] # curl - 

Не совсем то, что вы просили, но вы можете обновить его для собственных целей.

(я не уверен, если Баш может обрабатывать пробельные в результате завершения, но по крайней мере вы можете использовать _ или -. :-)

1

IMO, что было бы плохой идеей.

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

Оригинал:

complete -o nospace -F _default_completion my_command 

Новое:

_custom_completion(){ 
    local cur; 
    _get_comp_words_by_ref cur; 
    _default_completion 
    if [ ${#COMPREPLY[@]} == 1 ]; then return; fi 
    local _compreply=() 
    local reply_entry 
    local description 
    for reply_entry in ${COMPREPLY[@]}; do 
     description=$(generate_description_from_option "$reply_entry") 
     description=$(printf "%${COLUMNS}s" "$reply_entry : $description") 
     _compreply+=$description 
    done 
    COMPREPLY=(${_compreply[@]}) 
} && complete -o nospace -F _custom_completion my_command 

С этим Баш должен показать один из вариантов в каждой строке с описанием перед ним. Конечно, вам нужно будет написать generate_description_from_option самостоятельно.

+0

'COMPREPLY = $ {_ compreply [@]}' 'должны быть COMPREPLY = ($ {_ compreply [@]}) '? – pynexj

+0

Я думал, что zsh сделал что-то вроде этого. – Igor

+0

@whjm: Я исправился по местному сценарию. Забыл исправить это в ответе. Спасибо, что заметили. :-) Исправлена. – anishsane

 Смежные вопросы

  • Нет связанных вопросов^_^