23

/etc/bash_completion.d/に配置する bash 自動補完機能を実装すると、混乱することがあります。

:いくつかの機能を実現するために、変数から区切り文字のコロン () を削除し、の先頭にスラッシュ ( ) を$COMP_WORDBREAKS追加したいと考えています。/$COMP_WORDBREAKS

COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    compopt -o nospace

    # my implement here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool

ただし、COMP_WORDBREAKS値は他の補完スクリプトと共有されているため、直接リセットすることはできません。完了関数が呼び出されるまでに、変数COMP_WORDS配列は既に設定されているため、ローカルでの変更COMP_WORDBREAKSは効果がありません。

COMP_WORDBREAKS1 つの補完スクリプトを変更し、他のスクリプトに影響を与えないための解決策はありますか?

$ echo $BASH_VERSION
4.2.10(1)-release
4

1 に答える 1

25

完了スクリプトを変更$COMP_WORDBREAKSすることはお勧めしません (これはグローバル変数であり、他の完了スクリプト (ssh など) の動作に影響を与える可能性があるため)。

ただし、bash の補完には、目標を達成するために使用できるいくつかのヘルパー メソッドが用意されています。

補完単語内の単語を分割しない文字を処理するための推奨される方法は、次の 2 つのヘルパー メソッドを使用することです。

  • _get_comp_words_by_ref-n EXCLUDEオプションで
    • EXCLUDE 内の文字を単語の区切りと見なさずに単語を補完する
  • __ltrim_colon_completions

したがって、ここに、補完単語でコロン (:) を処理する方法の基本的な例を示します。

_mytool()
{
    local cur
    _get_comp_words_by_ref -n : cur

    # my implementation here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )

    __ltrim_colon_completions "$cur"
}
complete -F _mytool mytool

最後のヒントとして、ヘルパー メソッドは にあり/etc/bash_completionます。内部を見て、各メソッドの詳細な説明を読み、より多くのヘルパー メソッドを見つけてください。

于 2012-09-19T13:13:47.907 に答える