it-swarm-ja.com

シェルでのスクリプト固有のオートコンプリート

私は毎日の生活に役立つ小さなスクリプトをたくさん作成しています。オートコンプリートを提供したいと思います。特に、人々と共有したいと思っています。

これで、ログイン時に取得されるオートコンプリート関数を作成できることがわかりましたが、優雅さと移植性のために、スクリプト自体の中にオートコンプリートを提供しようとしています。

自宅でzshを使用し、VPSでbashを使用しているので、スクリプトを移植可能(またはシェルに従って動作を切り替える)にしたいのですが、どちらの環境でも、すでに1つのソリューションに満足しています。

4
Xananax

[F]または優雅さと移植性のために、スクリプト自体の中にオートコンプリートを提供しようとしています。

シェルスクリプト内からこれを行うことはできません。

従来、スクリプトとバイナリのBashの完了は、指定されたディレクトリのエントリによって処理されていました(たとえば、Bashの場合は/etc/bash_completion.d/usr/share/bash-completion/completions)。

ただし、これらはすべて、適切なパラメータを使用して組み込みコマンドcompleteを呼び出すだけです。スクリプトを初めて呼び出すときは、これらのディレクトリの1つ(root権限が必要)または~/.bashrcのいずれかにエントリを作成できます。

次の基本的な構文:

# declare function to pass to `complete'
_myscript() 
{
    # declare variable `cur' (holds string to complete) as local
    local cur

    # initialize completion (abort on fail)
    _init_completion || return

    # if string to complete (`cur') begins with `-' (option)
    if [[ "$cur" == -* ]] ; then
        # complete to the following strings, if they start with `cur`
        COMPREPLY=( $( compgen -W '-a -b -c --foo --bar' -- "$cur" ) )
    else
        # otherwise, complete to elements in current directory that begin with `cur'
        _filedir -d
    fi

# if declaring the function was successful, use it when the command is `myscript'
} && complete -F _myscript myscript

たとえば、上記を~/.myscript_completionに保存して、追加することができます

source ~/.myscript_completion

~/.bashrcへ。

1
Dennis