私はPythonを使用して完了結果を提供するBash用のタブ補完スクリプトを作成しています。私が経験している問題を示すためにダミースクリプトを使用していますが、内容は重要ではありません。
dothat
次のコードを含むBashスクリプトがあります。
var=$1
echo "You have chosen $var"
dothat
また、次のタブ補完を生成するスクリプトもありますdothat-completion.bash
。
_comp_func()
{
COMPREPLY=()
# Gets the output of a Python file and puts it into a variable
fruits=$(python fruit.py)
COMPREPLY=($(compgen -W "${fruits[*]}" -- $cur))
}
complete -F _comp_func dothat
そして(簡単な)内容は次のとおりですfruit.py
。
print('fruit:', end='')
Pythonスクリプトは単にSTDOUTに文字列を印刷してから、Bashコンプリート機能によってキャプチャされ、タブ補完の可能な一致を生成するために使用されます。
さて、このスクリプトでやりたいことは、入力すると最後に空白なしでdothat <TAB>
完了することです。dothat fruit:
問題は、私が入力してTabを押すと、不要な末尾のスペースでdothat
完了することです。dothat fruit:
Pythonの内容を次のように変更しようとしましたが、すべての結果は同じです。
print('"fruit:"', end='')
print("'fruit:'", end='')
print('fruit:', end='')
print("fruit:", end='')
print("fruit: ", end='')
print("fruit: ", end='')
print('fruit')
でも:
foo='fruit'
print(foo)
そして私の試みはすべて同じ結果を得たので無駄だった。文字列にスペースが0、1、20個あるかどうかは関係ありません。 Pythonが文字列を出力しfruit:
てBashコンプリートスクリプトに戻すと、空白で完了することにcompgen
なります。fruit:
ここに私が逃した確かな解決策はありますか? BashやPythonの場合?
答え1
これは、正確に一致する項目が見つかったときのデフォルトの動作であり、complete
スペースを追加して行に追加の入力を許可して単語が完了したことを示します。これには単語が1つしかないので、その単語をすべて読んだCOMPREPLY
ときです。TAB
-o nospace
このデフォルトの動作をオーバーライドするには、.fromを使用できますman bashbuiltins
。
スペースなし行末で完成した単語の後にスペースを追加しないようにreadlineに指示します(デフォルト)。