質問

引数をスマートに補完するために readline を使用する、単純なシェルのようなプログラムを作成しました。スペースを含み、1 つの引数として示すために引用符で囲まれた引数をサポートするメカニズムが必要です (シェルにそのような引数を提供する場合と同様)。

shlex.split() は引用符で囲まれた引数を解析する方法を知っていますが、ユーザーが入力途中で完了したい場合は失敗します (例:'complete "Hello ' は、引用符のバランスが取れていないため、shlex に渡されるときに例外がスローされます)。

これを行うためのコードはありますか?

ありがとう!

役に立ちましたか?

解決

私は仕事のための既存のコードを知らないが、私はこれを行うにした場合、私は、例外をキャッチし、偽の末尾に引用符を追加してみてください、とshlex.splitは、このように変更された文字列でない方法を参照してくださいね。

他のヒント

GNU Readline では、変数を使用してそのようなシナリオが可能です rl_completer_quote_characters. 。残念ながら、Python は標準ライブラリのそのオプションをエクスポートしません。 readline モジュール (この記事の執筆時点では最新である 3.7.1 でも)。

私はそれを行う方法を見つけました ctypes, 、 けれど:

import ctypes

libreadline = ctypes.CDLL ("libreadline.so.6")
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
    libreadline, 
    "rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'

これは明らかに移植性がないことに注意してください(libreadlineのバージョンはハードコードされているため、おそらくLinuxディストリビューション間でさえも可能ですが、私はプレーンなバージョンを持っていませんでした) libreadline.so 私のコンピュータでは)そのため、環境に合わせて調整する必要があるかもしれません。

また、私の場合は、それが私のユースケースであったため、補完機能の特別なものとして二重引用符のみを設定しました。

参考文献

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top