1

助けが必要です。私は完全に困惑しています。カスタムシェルスタイルプログラム用に独自のタブ補完モジュールを作成しようとしています(引数も補完します)。コマンドをタブ補完できますが、引数によって問題が発生します。誰かが私が見るためのサンプルタブ完成モジュールを書くことができますか?
使用可能なコマンド:['show'、'exit'、'clear'、'ship'] for command show、first arg:['ip'、'mac'、'options'] and for sub arg IP:['external、 '内部'、'ローカル']

結局、私は行けるようになりたいです:

My Prompt > sh<tab>
show ship
My Prompt > sho<tab>
My Prompt > show <tab>
ip mac options
My Prompt > show ip <tab>
external local internal
My Prompt > show ip e<tab>
My Prompt > show ip external

などなど。良い例が1つあれば、これを理解できると思います。タブ補完コードを5回完全に書き直しましたが、それでも取得できません。誰か助けてもらえますか?

4

3 に答える 3

1

結局、7回目の書き直しでわかりました。私が望むより少し厄介ですが、実行可能であり、おそらく後でこれをクリーンアップします。とにかく、ここにコードがあります:

"""defined earlier in the script:"""
COMMANDS=['show', 'exit', 'ship']
def complete(text, state, list = COMMANDS):
    for option in list:
        if option.startswith(text):
            if not state:
                return option
            else:
                state -= 1
def precomplete(text, state):
    BUFFER=readline.get_line_buffer()
    args=[None,None,None,None,None,None,None,None,None,None]
    argtemp=[]
    if BUFFER != "":
        i=-1
        while i != BUFFER.count(" "):
            if BUFFER.count(" ") >= 0:
                if BUFFER.count(" ") == 0: #1 because len() starts couting at 1
                    return complete(text, state)
                else:
                    print "Else triggered"
                    o=0
                    verb=[]
                    while complete(BUFFER.split()[0],o):
                        verb.append(complete(BUFFER.split()[0],o))
                        o=o+1
                    if len(verb) == 1:
                        verb=verb[0]
                        print verb
            if BUFFER.count(" ") >= 1:
                if  BUFFER.count(" ") == 1:
                    if verb == 'show':
                        return complete(text, state, ['mac', 'ip', 'arp'])
                else:
                    o=0
                    while complete(BUFFER[1],o,['mac', 'ip', 'arp']):
                        argtemp.append(complete(BUFFER[1],o,['mac', 'ip', 'arp']))
                        o=o+1
                    if len(argtemp) == 1:
                       argtemp==argtemp[0]
            i=i+1
    else:
        return complete(text,state)
readline.parse_and_bind("tab: complete")
readline.set_completer(precomplete)

編集:完全なコード:http://codepad.org/W3VHURUx

于 2011-08-20T02:26:09.710 に答える
0

readlinerlcompleterを見てください。

于 2011-08-19T18:27:45.693 に答える
0

一般的な方法でそれを行う既存の実装に興味があるかもしれません。

CLI ツールキットは、コマンドといくつかのパラメーターの補完を行います。ただし、これを Python からうまく実行することは、完全には不可能であることが判明しました。これは主に、その時点でユーザー入力を制御する readline ライブラリ (コンパイル済みコードで実行されている) が原因であるため、入力メソッドを呼び出す前にすべての補完を事前に把握しておく必要があります。

于 2011-08-20T02:45:21.363 に答える