0

何が間違っているのかわかりません。私は bash_completion ファイルを次のように設定しています。

_bcd()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(back_directory.pl --complete $cur)" -- $cur) )
}
complete -o filenames -o nospace -F _bcd bcd

back_directory.pl --complete Thback_directory.plは、ツリーの上位のディレクトリ パスを返すプログラムです This\ test/

22:50:24-Josh@Joshuas-MacBook-Air:~/Desktop/bcd/This test/more    white/t$ bcd Th<TAB><TAB>
This   test/

上に示したように、空白を含むディレクトリはオートコンプリートされません (ただし、補完オプションは表示されます)。

次のようになります。bcd This\ test/

-o filenames空白をエスケープするには、バックスラッシュを追加する必要があると考えました。助けてくれてありがとう:)

4

2 に答える 2

3

への 1 回の呼び出しでcompgen1 つの単語 (埋め込まれた改行を含む) が生成されるため、可能な補完を 1 つだけ追加していCOMPREPLYます。back_directory.pl代わりに、一度に1 つのアイテムの出力を処理する必要があります。各アイテムは可能な一致としてテストされ、compgen空でない文字列が返された場合は、それを に追加しCOMPREPLYます。

_bcd() {
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=: read -a matches < <(back_directory.pl --complete "$cur")
    for match in "${matches[@]}"; do
        possible=$(IFS= compgen -W "$match" -- "$cur")
        [[ $possible ] && COMPREPLY+=( "$possible" )
    done
}

(注:次back_directory.plのような単一行の出力が生成されると想定しています

directory1:directory two:directory three:directory4

)

于 2014-11-27T14:32:03.520 に答える