0

このチュートリアルに従って、 figlet/のオートコンプリート機能をセットアップしましtoiletた。

# bash completion for figlet/toilet

have figlet &&
_figlet()
{
    local prev cur opts
    _get_comp_words_by_ref cur prev
    opts="-f"

    COMPREPLY=()

    case $prev in
        -f)
            local running=$(find /usr/share/figlet -name '*.flf' -printf '%P\n' | sed 's/\.flf$//')
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    COMPREPLY=( $( compgen -W "$opts" -- "$cur" ) )

    return 0
} &&
complete -F _figlet figlet

###################################################################################################

have toilet &&
_toilet()
{
    local prev cur opts
    _get_comp_words_by_ref cur prev
    opts="-f"

    COMPREPLY=()

    case $prev in
        -f)
            local running=$(find /usr/share/figlet -name '*.[tf]lf' -printf '%P\n' | sed 's/\.[tf]lf$//')
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    COMPREPLY=( $( compgen -W "$opts" -- "$cur" ) )

    return 0
} &&
complete -F _toilet toilet

_figlet/コマンドのパターンを除いて、_toiletほとんど同じです。パターンを引数として取る 関数を抽出する方法は?findsed
_figlet_toilet

4

1 に答える 1

0

から: http://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html

これらの一致が生成された後、-F および -C オプションで指定されたシェル関数またはコマンドが呼び出されます。コマンドまたは関数が呼び出されると、前述のように、COMP_LINE、COMP_POINT、COMP_KEY、および COMP_TYPE 変数に値が割り当てられます (「Bash 変数」を参照)。シェル関数が呼び出されている場合、COMP_WORDS および COMP_CWORD 変数も設定されます。関数またはコマンドが呼び出されると、最初の引数は引数が補完されるコマンドの名前、2 番目の引数は補完される単語、3 番目の引数は現在のコマンド ラインで補完される単語の前の単語です。補完される単語に対する生成された補完のフィルタリングは実行されません。関数またはコマンドには、一致を生成する完全な自由があります。


# bash completion for figlet/toilet

{
    have figlet || have toilet
} &&
_figlet_toilet()
{
    local prev cur opts pat
    _get_comp_words_by_ref cur prev
    opts="-f"

    COMPREPLY=()

    case $prev in
        -f)
            case "${1}" in
                figlet)
                    pat='flf'
                ;;
                toilet)
                    pat='[tf]lf'
                ;;
            esac
            local running=$(find /usr/share/figlet -name "*.${pat}" -printf '%P\n' | sed "s/\.${pat}\$//")
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    # if '-f' is already given, then generate random string
    for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
        if [[ ${COMP_WORDS[i]} == -f ]]; then
            # COMPREPLY=("'$(fortune -sn42)'")
            return 0
        fi
    done

    COMPREPLY=( $( compgen -W "$opts" -- "$cur" ) )

    return 0
} &&
complete -F _figlet_toilet figlet toilet
于 2012-05-07T05:58:53.850 に答える