2017-10-02 3 views
2

入力したコマンドを直接実行するか(コマンド ".x some/path/to/file"を入力した場合)、プロジェクト用のREPLツールを作成していますファイルから読み込み、実行します。私の質問は、(prompt_toolkitを使って)ユーザー入力を自動補完することに関連しています。 (コマンド用)prompt_toolkitのPathCompleterから完成品を再利用する方法

import prompt_toolkit 
from prompt_toolkit.completion import Completer, Completion 
from prompt_toolkit.document import Document 
from prompt_toolkit.contrib.completers import PathCompleter 


class CommandCompleter(Completer): 
    def __init__(self): 
     self.path_completer = PathCompleter() 
     self.commands = [".x", "command1", "command2"] 

    def get_completions(self, document, complete_event): 
     if document.text.startswith(".x "): 
      sub_doc = Document(document.text[3:]) 
      yield from (Completion(cmd.text, -document.cursor_position) 
#         ???????? ????????????????????????? 
         for cmd 
         in self.path_completer.get_completions(sub_doc, complete_event)) 
#                ??????? 
     else: 
      yield from (Completion(cmd, -document.cursor_position) 
         for cmd in self.commands 
         if cmd.startswith(document.text)) 

if __name__ == "__main__": 
    while True: 
     other_args = {} 
     input = prompt_toolkit.prompt(">>> ", completer=CommandCompleter(), **other_args) 
     # Do something with input (omitted) 

秒かの分岐が正常に動作しますが、私はきちんとPathCompleter.get_completions()メソッドを呼び出す方法を知っているとCompletionオブジェクトを再構築しないでください:

私は(実行可能な最小の例)のようなものを持っています最初のブランチでの結果(???がどこにあるか)からそのトリックは、私が入力の一部分だけを補完するものであり、様々な部分ストリング、位置計算などは、満足のいく振る舞い(すなわち、経路の提供と正しい入力行の構築)には至っていない。

私は間違いなく検索に行きますが、誰かがこれを書き換える方法を知っていれば、非常に便利です。

注:入力全体がパスだけの場合(これは正しく動作します)、yield from self.path_completer.get_completions(document, complete_event)が使用されます。

答えて

1

おそらく次はそれを修正する必要があります

sub_doc = Document(document.text[3:]) 
yield from (Completion(completion.text, completion.start_position, display=completion.display) 
      for completion 
      in self.path_completer.get_completions(sub_doc, complete_event)) 
  • completion.textが挿入されようとしているテキストが含まれています。
  • completion.start_positionには、テキストが挿入される場所がカーソル位置に対して相対的に含まれています(この特定の例では、入れ子のコンプリータから値を取得できます)。
  • completion.displayは、ポップアップメニューに表示される値です。 。。(この場合は、全体のファイル名ではなく、唯一の挿入文字列

あなたはそれ以上の質問がある場合はGitHubの問題を開くことが気軽

+0

どうもありがとう、これは私の問題を解決しています - ) –

関連する問題