Советы по пользовательскому завершению bash

Я разрабатываю пользовательскую команду завершения bash для получения идентификаторов заданий из системы планирования (LSF, PBS, SLURM). У меня есть базовая функциональность, но я хотел бы расширить ее с помощью "подсказок", которые я видел при запуске zsh.

Например, когда я нажимаю TAB в примере grep ниже, я получаю:

grep -<TAB>
     --after-context          -A           -- specify lines of trailing context
     --basic-regexp           -G           -- use basic regular expression
     --before-context         -B           -- specify lines of leading context
...

Этот третий столбец после -- — это то, что я хотел бы добавить к своему завершению bash. Каков правильный технический термин для этого? Подсказки? Предоставляет ли compgen функциональность для этого?

Я прилагаю свой текущий рабочий пример, который предоставляет только идентификаторы. В примере используется LSF.

# LSF Job ID completion
function _mycurrentjobs()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(bjobs -noheader -u $USER -o JOBID)" -- $cur))
    return 0
}
complete -F _mycurrentjobs bkill bjobs bstatus bpeek bstop bresume

Команда, которая предоставит идентификаторы и мои желаемые подсказки: bjobs -noheader -u $USER -o "JOBID JOB_NAME"


person Robert Manson-Sawko    schedule 21.08.2017    source источник
comment
вы можете начать с stackoverflow.com/questions/41480241   -  person pynexj    schedule 21.08.2017
comment
спасибо @whjm, но я нашел этот пост более применимым: stackoverflow.com/questions/7267185/   -  person Robert Manson-Sawko    schedule 22.08.2017


Ответы (1)


После просмотра аналогичного сообщения о завершении хоста автозаполнение bash: добавьте описание для возможных завершений Я получил более-менее правильное поведение. Я использую - в качестве разделителя в моей команде запроса идентификатора задания

function _mycurrentjobs()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local OLDIFS="$IFS"
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "$(bjobs -noheader -u $USER \
        -o "JOBID JOB_NAME delimiter='-'")" -- $cur))
    IFS="$OLDIFS"
    if [[ ${#COMPREPLY[*]} -eq 1 ]]; then   #Only one completion
        COMPREPLY=( ${COMPREPLY[0]%%-*} )   #Remove the separator and everything after
    fi
    return 0
}
complete -F _mycurrentjobs bkill bjobs bstatus bpeek bstop bresume
person Robert Manson-Sawko    schedule 22.08.2017