автозаполнение в терминале для скрипта git-validation [duplicate]

Вы должны щелкнуть правой кнопкой мыши папку «Параметры совместного доступа», «Открыть эту папку» и пометить два параметра, связанные с гостевой консолью и разрешить операции управления файлами. Затем нажмите «Создать общий доступ»

. В Windows просто перейдите к Параметры совместного доступа . Если ваш компьютер Ubuntu там не отображается, попробуйте Super Key (или Windows Key) Поделитесь этой папкой и напишите Создать Share или \\ YourComputerHostname.

103
задан 11 March 2018 в 08:34

44 ответа

Вы можете использовать Программируемое завершение. Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 18 July 2018 в 07:01

Вы можете использовать Программируемое завершение. Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 24 July 2018 в 18:43

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 31 July 2018 в 21:47

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 2 August 2018 в 15:03

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 3 August 2018 в 19:09

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 5 August 2018 в 03:59

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

32
ответ дан 6 August 2018 в 20:57

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

33
ответ дан 9 August 2018 в 01:27

Вы можете использовать Программируемое завершение . Посмотрите на /etc/bash_completion и /etc/bash_completion.d/* для некоторых примеров.

33
ответ дан 14 August 2018 в 19:36
  • 1
    Как насчет включения простого примера, непосредственно связанного с вопросом? – MountainX 24 June 2013 в 02:14
  • 2
    Уже предоставленная ссылка уже имеет это. : D – peter 2 May 2017 в 11:03
  • 3
    Фактические сценарии для Ubuntu 16 расположены в /usr/share/bash-completion/completions/<program> – peter 27 September 2017 в 00:26
  • 4
    Имо, примеры должны быть включены в ответ, а не в ссылку. – billynoah 30 March 2018 в 21:24
  • 5
    Я считаю, что эта платформа должна стать более практичной альтернативой полной документации, которая может быть найдена с помощью простого поиска Google. Сбрасывание ссылки на документацию не помогает. Конечно, ссылка, содержащая якорь, не имеет большого значения. – timuçin 24 June 2018 в 11:59

Я опоздал на шесть месяцев, но я искал то же самое и нашел это:

Вам нужно будет создать новый файл:

/etc/bash_completion.d/foo

Для static autocompletion (--help / --verbose) добавьте это:

_foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help --verbose --version" if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _foo foo COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD - это индекс слова, содержащего текущую позицию курсора. COMPREPLY - это переменная массива, из которой Bash считывает возможные доработки.

И команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Источник: http://www.debian-administration.org/articles/316

157
ответ дан 18 July 2018 в 07:01

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакое завершение подкоманды или что-то еще), команда complete имеет опцию -W, которая делает правильные вещи.

Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter:

# gleaned from `jupyter --help` _jupyter_options='console qtconsole notebook' # shortened for this answer complete -W "${_jupyter_options}" 'jupyter'

Теперь jupyter <TAB> <TAB> автозаполняет для меня.

jupyter [ ! d2] на gnu.org.

Кажется, что он полагается на правильную настройку переменной IFS, но это не вызвало у меня никаких проблем.

Чтобы добавить завершение файла и выполнить по умолчанию BASH, используйте параметр -o:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc: [ ! d8] # make zsh emulate bash if necessary if [[ -n "$ZSH_VERSION" ]]; then autoload bashcompinit bashcompinit fi

7
ответ дан 18 July 2018 в 07:01

Вот полный учебник.

Давайте посмотрим пример скрипта под названием admin.sh, к которому вы хотели бы иметь работу автозаполнения.

#!/bin/bash while [ $# -gt 0 ]; do arg=$1 case $arg in option_1) # do_option_1 ;; option_2) # do_option_1 ;; shortlist) echo option_1 option_2 shortlist ;; *) echo Wrong option ;; esac shift done

Примечание.

И здесь у вас есть сценарий автозаполнения:

_script() { _script_commands=$(/path/to/your/script.sh shortlist) local cur COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) ) return 0 } complete -o nospace -F _script ./admin.sh

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

source /path/to/your/autocomplete.sh

или скопировать его в /etc/bash.completion.d

28
ответ дан 18 July 2018 в 07:01

Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:

# bash completion for rsync have rsync && _rsync() { # TODO: _split_longopt local cur prev shell i userhost path COMPREPLY=() cur=`_get_cword` prev=${COMP_WORDS[COMP_CWORD-1]} _expand || return 0 case "$prev" in --@(config|password-file|include-from|exclude-from)) _filedir return 0 ;; -@(T|-temp-dir|-compare-dest)) _filedir -d return 0 ;; -@(e|-rsh)) COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) ) return 0 ;; esac case "$cur" in -*) COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \ -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \ -z -h -4 -6 --verbose --quiet --checksum \ --archive --recursive --relative --backup \ --backup-dir --suffix= --update --links \ --copy-links --copy-unsafe-links --safe-links \ --hard-links --perms --owner --group --devices\ --times --sparse --dry-run --whole-file \ --no-whole-file --one-file-system \ --block-size= --rsh= --rsync-path= \ --cvs-exclude --existing --ignore-existing \ --delete --delete-excluded --delete-after \ --ignore-errors --max-delete= --partial \ --force --numeric-ids --timeout= \ --ignore-times --size-only --modify-window= \ --temp-dir= --compare-dest= --compress \ --exclude= --exclude-from= --include= \ --include-from= --version --daemon --no-detach\ --address= --config= --port= --blocking-io \ --no-blocking-io --stats --progress \ --log-format= --password-file= --bwlimit= \ --write-batch= --read-batch= --help' -- "$cur" )) ;; *:*) # find which remote shell is used shell=ssh for (( i=1; i < COMP_CWORD; i++ )); do if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then shell=${COMP_WORDS[i+1]} break fi done if [[ "$shell" == ssh ]]; then # remove backslash escape from : cur=${cur/\\:/:} userhost=${cur%%?(\\):*} path=${cur#*:} # unescape spaces path=${path//\\\\\\\\ / } if [ -z "$path" ]; then # default to home dir of specified # user on remote host path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null) fi # escape spaces; remove executables, aliases, pipes # and sockets; add space at end of file names COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \ command ls -aF1d "$path*" 2>/dev/null | \ sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \ -e 's/[^\/]$/& /g' ) ) fi ;; *) _known_hosts_real -c -a "$cur" _filedir ;; esac return 0 } && complete -F _rsync $nospace $filenames rsync # Local variables: # mode: shell-script # sh-basic-offset: 4 # sh-indent-comment: t # indent-tabs-mode: nil # End: # ex: ts=4 sw=4 et filetype=sh

Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.

33
ответ дан 18 July 2018 в 07:01

Я опоздал на шесть месяцев, но я искал то же самое и нашел это:

Вам нужно будет создать новый файл:

/etc/bash_completion.d/foo

Для static autocompletion (--help / --verbose) добавьте это:

_foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help --verbose --version" if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _foo foo COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке. COMP_CWORD - это индекс слова, содержащего текущую позицию курсора. COMPREPLY - это переменная массива, из которой Bash считывает возможные доработки.

И команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Источник: http://www.debian-administration.org/articles/316

157
ответ дан 24 July 2018 в 18:43
  • 1
    Это должен быть принятый ответ! Это полный пример. – Victor Schröder 14 August 2015 в 14:21
  • 2
    Совет. Если кто-то хочет предложения для слов, не начинающиеся с -, и покажите их без необходимости вводить целевое слово, просто удалите строки if [...] then и fi. – Cedric Reichenbach 16 September 2015 в 12:23
  • 3
    Это точный ответ, который я искал часами, и, оказывается, он просто утонул в какой-то сложной документации, которая просто не упоминает, что файл должен быть помещен в /etc/bash_completion.d/. Я только приехал сюда, потому что хотел где-то отправить ответ, но, оказывается, кто-то был на все три года вперед. Ясный, лаконичный и полный пример, спасибо! – Time Sheep 14 December 2016 в 13:43
  • 4

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакое завершение подкоманды или что-то еще), команда complete имеет опцию -W, которая делает правильные вещи.

Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter:

# gleaned from `jupyter --help` _jupyter_options='console qtconsole notebook' # shortened for this answer complete -W "${_jupyter_options}" 'jupyter'

Теперь jupyter <TAB> <TAB> автозаполняет для меня.

jupyter [ ! d2] на gnu.org.

Кажется, что он полагается на правильную настройку переменной IFS, но это не вызвало у меня никаких проблем.

Чтобы добавить завершение файла и выполнить по умолчанию BASH, используйте параметр -o:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc: [ ! d8] # make zsh emulate bash if necessary if [[ -n "$ZSH_VERSION" ]]; then autoload bashcompinit bashcompinit fi

7
ответ дан 24 July 2018 в 18:43

Вот полный учебник.

Давайте посмотрим пример скрипта под названием admin.sh, к которому вы хотели бы иметь работу автозаполнения.

#!/bin/bash while [ $# -gt 0 ]; do arg=$1 case $arg in option_1) # do_option_1 ;; option_2) # do_option_1 ;; shortlist) echo option_1 option_2 shortlist ;; *) echo Wrong option ;; esac shift done

Примечание.

И здесь у вас есть сценарий автозаполнения:

_script() { _script_commands=$(/path/to/your/script.sh shortlist) local cur COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) ) return 0 } complete -o nospace -F _script ./admin.sh

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

source /path/to/your/autocomplete.sh

или скопировать его в /etc/bash.completion.d

28
ответ дан 24 July 2018 в 18:43

Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:

# bash completion for rsync have rsync && _rsync() { # TODO: _split_longopt local cur prev shell i userhost path COMPREPLY=() cur=`_get_cword` prev=${COMP_WORDS[COMP_CWORD-1]} _expand || return 0 case "$prev" in --@(config|password-file|include-from|exclude-from)) _filedir return 0 ;; -@(T|-temp-dir|-compare-dest)) _filedir -d return 0 ;; -@(e|-rsh)) COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) ) return 0 ;; esac case "$cur" in -*) COMPREPLY=( $( compgen -W '-v -q -c -a -r -R -b -u -l -L -H \ -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \ -z -h -4 -6 --verbose --quiet --checksum \ --archive --recursive --relative --backup \ --backup-dir --suffix= --update --links \ --copy-links --copy-unsafe-links --safe-links \ --hard-links --perms --owner --group --devices\ --times --sparse --dry-run --whole-file \ --no-whole-file --one-file-system \ --block-size= --rsh= --rsync-path= \ --cvs-exclude --existing --ignore-existing \ --delete --delete-excluded --delete-after \ --ignore-errors --max-delete= --partial \ --force --numeric-ids --timeout= \ --ignore-times --size-only --modify-window= \ --temp-dir= --compare-dest= --compress \ --exclude= --exclude-from= --include= \ --include-from= --version --daemon --no-detach\ --address= --config= --port= --blocking-io \ --no-blocking-io --stats --progress \ --log-format= --password-file= --bwlimit= \ --write-batch= --read-batch= --help' -- "$cur" )) ;; *:*) # find which remote shell is used shell=ssh for (( i=1; i < COMP_CWORD; i++ )); do if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then shell=${COMP_WORDS[i+1]} break fi done if [[ "$shell" == ssh ]]; then # remove backslash escape from : cur=${cur/\\:/:} userhost=${cur%%?(\\):*} path=${cur#*:} # unescape spaces path=${path//\\\\\\\\ / } if [ -z "$path" ]; then # default to home dir of specified # user on remote host path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null) fi # escape spaces; remove executables, aliases, pipes # and sockets; add space at end of file names COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \ command ls -aF1d "$path*" 2>/dev/null | \ sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \ -e 's/[^\/]$/& /g' ) ) fi ;; *) _known_hosts_real -c -a "$cur" _filedir ;; esac return 0 } && complete -F _rsync $nospace $filenames rsync # Local variables: # mode: shell-script # sh-basic-offset: 4 # sh-indent-comment: t # indent-tabs-mode: nil # End: # ex: ts=4 sw=4 et filetype=sh

Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.

33
ответ дан 24 July 2018 в 18:43
  • 1
    Можем ли мы настроить доработки для загрузки из других мест? IE. ~ / .local – Chris 31 July 2014 в 21:14
  • 2
    Да, вы можете поместить файл так, как хотите, а затем поместите source ~/.local/mycrazycompletion в свой ~/.bashrc – Stefano Palazzo♦ 22 March 2016 в 09:40

Я опоздал на шесть месяцев, но я искал то же самое и нашел это:

Вам нужно будет создать новый файл:

/etc/bash_completion.d/foo

(--help / --verbose) добавьте это:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке.
  • COMP_CWORD - это индекс слова, содержащего текущую позицию курсора.
  • COMPREPLY - это переменная массива, из которой Bash считывает возможные пополнения.

Команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Источник: http: // www.debian-administration.org/articles/316

157
ответ дан 31 July 2018 в 21:47

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete имеет опцию -W, которая просто делает правильную вещь.

Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter :

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

Теперь jupyter <TAB> <TAB> автозаполняет для меня.

docs на gnu.org полезны.

Кажется, что он полагается на правильную настройку IFS, но это не вызвало у меня никаких проблем.

Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi
7
ответ дан 31 July 2018 в 21:47

Вот полный учебник.

Давайте посмотрим пример скрипта с именем admin.sh, к которому вы хотели бы иметь работу автозаполнения.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Примечание. Вызов скрипта с этим параметром выведет все возможные варианты для этого скрипта.

И здесь у вас есть сценарий автозаполнения:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

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

source /path/to/your/autocomplete.sh

или скопировать его в /etc/bash.completion.d

28
ответ дан 31 July 2018 в 21:47

Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:

# bash completion for rsync

have rsync &&
_rsync()
{
    # TODO: _split_longopt

    local cur prev shell i userhost path   

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    _expand || return 0

    case "$prev" in
    --@(config|password-file|include-from|exclude-from))
        _filedir
        return 0
        ;;
    -@(T|-temp-dir|-compare-dest))
        _filedir -d
        return 0
        ;;
    -@(e|-rsh))
        COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
        return 0
        ;;
    esac

    case "$cur" in
    -*)
        COMPREPLY=( $( compgen -W '-v -q  -c -a -r -R -b -u -l -L -H \
            -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
            -z -h -4 -6 --verbose --quiet --checksum \
            --archive --recursive --relative --backup \
            --backup-dir --suffix= --update --links \
            --copy-links --copy-unsafe-links --safe-links \
            --hard-links --perms --owner --group --devices\
            --times --sparse --dry-run --whole-file \
            --no-whole-file --one-file-system \
            --block-size= --rsh= --rsync-path= \
            --cvs-exclude --existing --ignore-existing \
            --delete --delete-excluded --delete-after \
            --ignore-errors --max-delete= --partial \
            --force --numeric-ids --timeout= \
            --ignore-times --size-only --modify-window= \
            --temp-dir= --compare-dest= --compress \
            --exclude= --exclude-from= --include= \
            --include-from= --version --daemon --no-detach\
            --address= --config= --port= --blocking-io \
            --no-blocking-io --stats --progress \
            --log-format= --password-file= --bwlimit= \
            --write-batch= --read-batch= --help' -- "$cur" ))
        ;;
    *:*)
        # find which remote shell is used
        shell=ssh
        for (( i=1; i < COMP_CWORD; i++ )); do
            if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
                shell=${COMP_WORDS[i+1]}
                break
            fi
        done
        if [[ "$shell" == ssh ]]; then
            # remove backslash escape from :
            cur=${cur/\\:/:}
            userhost=${cur%%?(\\):*}
            path=${cur#*:}
            # unescape spaces
            path=${path//\\\\\\\\ / }
            if [ -z "$path" ]; then
                # default to home dir of specified
                # user on remote host
                path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
            fi
            # escape spaces; remove executables, aliases, pipes
            # and sockets; add space at end of file names
            COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
                command ls -aF1d "$path*" 2>/dev/null | \
                sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
                -e 's/[^\/]$/& /g' ) )
        fi
        ;;
    *)  
        _known_hosts_real -c -a "$cur"
        _filedir
        ;;
    esac

    return 0
} &&
complete -F _rsync $nospace $filenames rsync

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh

Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.

33
ответ дан 31 July 2018 в 21:47

Я опоздал на шесть месяцев, но я искал то же самое и нашел это:

Вам нужно будет создать новый файл:

/etc/bash_completion.d/foo

(--help / --verbose) добавьте это:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке.
  • COMP_CWORD - это индекс слова, содержащего текущую позицию курсора.
  • COMPREPLY - это переменная массива, из которой Bash считывает возможные пополнения.

Команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Источник: http: // www.debian-administration.org/articles/316

157
ответ дан 2 August 2018 в 15:03

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete имеет опцию -W, которая просто делает правильную вещь.

Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter :

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

Теперь jupyter <TAB> <TAB> автозаполняет для меня.

docs на gnu.org полезны.

Кажется, что он полагается на правильную настройку IFS, но это не вызвало у меня никаких проблем.

Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi
7
ответ дан 2 August 2018 в 15:03

Вот полный учебник.

Давайте посмотрим пример скрипта с именем admin.sh, к которому вы хотели бы иметь работу автозаполнения.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Примечание. Вызов скрипта с этим параметром выведет все возможные варианты для этого скрипта.

И здесь у вас есть сценарий автозаполнения:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

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

source /path/to/your/autocomplete.sh

или скопировать его в /etc/bash.completion.d

28
ответ дан 2 August 2018 в 15:03

Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:

# bash completion for rsync

have rsync &&
_rsync()
{
    # TODO: _split_longopt

    local cur prev shell i userhost path   

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    _expand || return 0

    case "$prev" in
    --@(config|password-file|include-from|exclude-from))
        _filedir
        return 0
        ;;
    -@(T|-temp-dir|-compare-dest))
        _filedir -d
        return 0
        ;;
    -@(e|-rsh))
        COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
        return 0
        ;;
    esac

    case "$cur" in
    -*)
        COMPREPLY=( $( compgen -W '-v -q  -c -a -r -R -b -u -l -L -H \
            -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
            -z -h -4 -6 --verbose --quiet --checksum \
            --archive --recursive --relative --backup \
            --backup-dir --suffix= --update --links \
            --copy-links --copy-unsafe-links --safe-links \
            --hard-links --perms --owner --group --devices\
            --times --sparse --dry-run --whole-file \
            --no-whole-file --one-file-system \
            --block-size= --rsh= --rsync-path= \
            --cvs-exclude --existing --ignore-existing \
            --delete --delete-excluded --delete-after \
            --ignore-errors --max-delete= --partial \
            --force --numeric-ids --timeout= \
            --ignore-times --size-only --modify-window= \
            --temp-dir= --compare-dest= --compress \
            --exclude= --exclude-from= --include= \
            --include-from= --version --daemon --no-detach\
            --address= --config= --port= --blocking-io \
            --no-blocking-io --stats --progress \
            --log-format= --password-file= --bwlimit= \
            --write-batch= --read-batch= --help' -- "$cur" ))
        ;;
    *:*)
        # find which remote shell is used
        shell=ssh
        for (( i=1; i < COMP_CWORD; i++ )); do
            if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
                shell=${COMP_WORDS[i+1]}
                break
            fi
        done
        if [[ "$shell" == ssh ]]; then
            # remove backslash escape from :
            cur=${cur/\\:/:}
            userhost=${cur%%?(\\):*}
            path=${cur#*:}
            # unescape spaces
            path=${path//\\\\\\\\ / }
            if [ -z "$path" ]; then
                # default to home dir of specified
                # user on remote host
                path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
            fi
            # escape spaces; remove executables, aliases, pipes
            # and sockets; add space at end of file names
            COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
                command ls -aF1d "$path*" 2>/dev/null | \
                sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
                -e 's/[^\/]$/& /g' ) )
        fi
        ;;
    *)  
        _known_hosts_real -c -a "$cur"
        _filedir
        ;;
    esac

    return 0
} &&
complete -F _rsync $nospace $filenames rsync

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh

Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.

33
ответ дан 2 August 2018 в 15:03

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete имеет опцию -W, которая просто делает правильную вещь.

Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter :

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

Теперь jupyter <TAB> <TAB> автозаполняет для меня.

docs на gnu.org полезны.

Кажется, что он полагается на правильную настройку IFS, но это не вызвало у меня никаких проблем.

Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi
7
ответ дан 3 August 2018 в 19:09

Вот полный учебник.

Давайте посмотрим пример скрипта с именем admin.sh, к которому вы хотели бы иметь работу автозаполнения.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Примечание. Вызов скрипта с этим параметром выведет все возможные варианты для этого скрипта.

И здесь у вас есть сценарий автозаполнения:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

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

source /path/to/your/autocomplete.sh

или скопировать его в /etc/bash.completion.d

28
ответ дан 3 August 2018 в 19:09

Все пополнения bash хранятся в /etc/bash_completion.d/. Поэтому, если вы создаете программное обеспечение с помощью bash_completion, было бы целесообразно, чтобы файл deb / make install удалял файл с именем программного обеспечения в этом каталоге. Вот пример сценария завершения bash для Rsync:

# bash completion for rsync

have rsync &&
_rsync()
{
    # TODO: _split_longopt

    local cur prev shell i userhost path   

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    _expand || return 0

    case "$prev" in
    --@(config|password-file|include-from|exclude-from))
        _filedir
        return 0
        ;;
    -@(T|-temp-dir|-compare-dest))
        _filedir -d
        return 0
        ;;
    -@(e|-rsh))
        COMPREPLY=( $( compgen -W 'rsh ssh' -- "$cur" ) )
        return 0
        ;;
    esac

    case "$cur" in
    -*)
        COMPREPLY=( $( compgen -W '-v -q  -c -a -r -R -b -u -l -L -H \
            -p -o -g -D -t -S -n -W -x -B -e -C -I -T -P \
            -z -h -4 -6 --verbose --quiet --checksum \
            --archive --recursive --relative --backup \
            --backup-dir --suffix= --update --links \
            --copy-links --copy-unsafe-links --safe-links \
            --hard-links --perms --owner --group --devices\
            --times --sparse --dry-run --whole-file \
            --no-whole-file --one-file-system \
            --block-size= --rsh= --rsync-path= \
            --cvs-exclude --existing --ignore-existing \
            --delete --delete-excluded --delete-after \
            --ignore-errors --max-delete= --partial \
            --force --numeric-ids --timeout= \
            --ignore-times --size-only --modify-window= \
            --temp-dir= --compare-dest= --compress \
            --exclude= --exclude-from= --include= \
            --include-from= --version --daemon --no-detach\
            --address= --config= --port= --blocking-io \
            --no-blocking-io --stats --progress \
            --log-format= --password-file= --bwlimit= \
            --write-batch= --read-batch= --help' -- "$cur" ))
        ;;
    *:*)
        # find which remote shell is used
        shell=ssh
        for (( i=1; i < COMP_CWORD; i++ )); do
            if [[ "${COMP_WORDS[i]}" == -@(e|-rsh) ]]; then
                shell=${COMP_WORDS[i+1]}
                break
            fi
        done
        if [[ "$shell" == ssh ]]; then
            # remove backslash escape from :
            cur=${cur/\\:/:}
            userhost=${cur%%?(\\):*}
            path=${cur#*:}
            # unescape spaces
            path=${path//\\\\\\\\ / }
            if [ -z "$path" ]; then
                # default to home dir of specified
                # user on remote host
                path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
            fi
            # escape spaces; remove executables, aliases, pipes
            # and sockets; add space at end of file names
            COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
                command ls -aF1d "$path*" 2>/dev/null | \
                sed -e 's/ /\\\\\\\ /g' -e 's/[*@|=]$//g' \
                -e 's/[^\/]$/& /g' ) )
        fi
        ;;
    *)  
        _known_hosts_real -c -a "$cur"
        _filedir
        ;;
    esac

    return 0
} &&
complete -F _rsync $nospace $filenames rsync

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh

Вероятно, стоит рассмотреть один из файлов завершения bash, который наиболее точно соответствует вашей программе. Одним из простейших примеров является файл rrdtool.

33
ответ дан 3 August 2018 в 19:09

Я опоздал на шесть месяцев, но я искал то же самое и нашел это:

Вам нужно будет создать новый файл:

/etc/bash_completion.d/foo

(--help / --verbose) добавьте это:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS - это массив, содержащий все отдельные слова в текущей командной строке.
  • COMP_CWORD - это индекс слова, содержащего текущую позицию курсора.
  • COMPREPLY - это переменная массива, из которой Bash считывает возможные пополнения.

Команда compgen возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}":

compgen -W "--help --verbose --version" -- "<userinput>"

Источник: http: // www.debian-administration.org/articles/316

157
ответ дан 5 August 2018 в 03:59

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакого завершения подкоманды или чего-либо еще), команда complete имеет опцию -W, которая просто делает правильную вещь.

Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter :

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

Теперь jupyter <TAB> <TAB> автозаполняет для меня.

docs на gnu.org полезны.

Кажется, что он полагается на правильную настройку IFS, но это не вызвало у меня никаких проблем.

Чтобы добавить завершение имени файла и по умолчанию BASH, используйте параметр -o:

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc:

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi
7
ответ дан 5 August 2018 в 03:59

Другие вопросы по тегам:

Похожие вопросы: