Cmd.pyを使用してカスタムインタラクティブコンソールを作成し、タブ補完にreadlineを使用しています。これは、Python2.7.1を使用してMacでテストされています。
complete_ [cmd_name]を使用して完了候補を定義し、cmd.pyがそれを使用して可能な完了のリストを取得できるようにします。完了している引数は文字列です。私の候補の補完は文字列のリストです。通常の場合、すべてが機能します。問題は、引数が「$」で始まる場合です。Readlineは明らかに先頭の「$」文字を取り除いており、候補リストを作成するときに比較を台無しにしています。
例えば:
completion_list = ['test', 'another_test', '$t_problem_case']
入力:cmd te [tab]これにより、単語「test」が正しく完了します。
入力:cmd $t_[tab]完了は行われません
入力:cmd $ te [tab]$testに対して誤って完了します
さて、最初は問題は明らかなようです。readlineは区切り文字として「$」を使用していると思います。これは、次を使用して簡単に修正できます。
readline.set_completer_delims(readline.get_completer_delims().replace("$", ""))
これだけは機能しません。同じことがまだ起こります。
完了関数は、パラメーター'text'および'line'を取ります。ここで、textは完了している引数('$'が欠落している引数)であり、lineは完全な行です。readlineをアウトスマートにしようとすると、引数の行に実際に$が含まれているかどうかを確認し、含まれている場合は、候補を正しくフィルタリングできるように、チェックしている引数にこれを追加します。これはほとんど機能します。
入力:$t[tab]文字列を正しく完成させます...ほぼ。readlineは私の'$'を無視しているので、置換時にこの文字を削除する必要はありません。結果は実際には「$$t_problem_case」です。
最後の努力として、cmd.pyのデフォルトのcomplete関数を変更して、「$」を前面から外した状態で一致を返すようにしました。このように、readlineは実際には't_problem_case'に置き換えられ、すべてが正しく表示されます。これは正しい方向へのステップですが、問題はタブ補完の提案に「$」が表示されないことです。したがって、提案では、「$t_problem_case」は「t_problem_case」として表示されます。
この問題を解決する正しい方法はありますか?