2016-09-04 6 views
4

自分のファイルシステム用のbash_completionスクリプトを作成します。私はいくつかのDBにクエリを送信するクライアントプログラムを持っています。Bashのカスタムパス補完

例:

my_prog --ls db_name:/foo/bar/ 

このコマンドはdb_name:/foo/barフォルダ内のファイルの標準出力リストに書き込みます。

私はこのために自動補完を有効にしたいと思います。だから私はタブを押すと、オプションのリストが表示されます。

my_prog --ls db_name:/foo/bar/<tab> 

が、私は、タブを押して、そこにそれが現在の入力したパスを置き換える1つのオプションがあるので、私はこの取得しています。この場合:

$ my_prog --ls db_name:/foo/bar/<tab> 
$ my_prog --ls file 

をしかし、私は試合が追加されるようにしたいです入力されたパスの終わり。ここで

は私の補完機能である:

__complete_path() 
{ 
    COMPREPLY=() 

    if [[ ${1} == "" ]] 
    then 
     COMPREPLY=("/") 
     compopt -o nospace 
     return 
    fi 

    base=${1##*/} 
    dir=${1%/*} 

    options="my_prog --ls ${db}:${dir}" 
    COMPREPLY=($(compgen -W "${options}" -- ${base})) 

    compopt -o nospace 
} 
+0

「$ {db}」とは何ですか? –

答えて

1

似た何かをしようとしているときに、私はこのスレッドを発見しました。 This stackexchange postを使用すると、以下のオートコンプリート機能を組み込むのに役立ちました。完全なパスが表示されるため、「通常の」オートコンプリートとは限りませんが、それ以外の場合は便利です。

_complete_func() 
    local cur prev opts 
    COMPREPLY=() 
    cur="${COMP_WORDS[COMP_CWORD]}" 
    prev="${COMP_WORDS[COMP_CWORD-1]}" 

    if [ $COMP_CWORD -eq 1 ]; then 
    opts="some options for the program" 
     COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 
    elif [ $COMP_CWORD -ge 2 ]; then 
    local files=("${cur}"*) 
     COMPREPLY=("${files[@]}") 
fi 
} 
complete -o nospace -F complete_func command_to_autocomplete