29

私のPythonプログラムは、次のようなさまざまなオプション(またはサブコマンド)で起動できます。

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

自動補完を使用して、「myProgram d」と入力すると「myProgram doSomething」が返され、「myProgram n」と入力すると「myProgram nowDoSomethingDifferent」がレンダリングされるようにします。これは、モジュールrlcompleterの平均的な使用に似ていますが、ファイルシステム (または履歴) から可能な補完オプションを選択するのではなく、文字列のカスタムセット (プログラムで使用可能なオプションに対応するもの) から選択します。

これを実装する方法について何か考えはありますか?

変数 PYTHONSTARTUP を認識しています (これは、書き込み方法がわからないファイルを指す必要があります)。

実際の例として、django-admin(djangoパッケージから)には、私が探しているのとまったく同じ機能があります

4

6 に答える 6

38

ファイル「myprog-completion.bash」を作成し、それを .bashrc ファイルに読み込みます。あなたが始めるためにこのような何か...

_myProgram()
{
  cur=${COMP_WORDS[COMP_CWORD]}
  case "${cur}" in
    d*) use="doSomething" ;;
    n*) use="nowDoSomethingElse" ;;
  esac
  COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o default -o nospace -F _myProgram  myProgram
于 2009-01-09T10:20:23.557 に答える
15

Python プログラムで bash オートコンプリートの補完を記述できるモジュールoptcompleteがあります。これは optparse と組み合わせると非常に便利です。引数を一度だけ定義し、次を .bashrc に追加します

complete -F _optcomplete <program>

すべてのオプションがオートコンプリートされます。

于 2009-01-09T12:36:32.823 に答える
9

他の回答で述べたように、bash では、これは bash-builtin で実行できますcomplete( richq の answer のように)関数を記述するよりも簡単なのは、単語のリストを指定できるcomplete's オプションを使用することです。-Wあなたの例では、これは次のようになります。

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

ワンライナーなので、このためのファイルを作成する必要はありませんが、.bashrc.

于 2014-08-01T14:01:53.737 に答える
6

私が正しく理解していれば、Pythonスクリプトが開始する前にコマンドラインで行補完が必要です。次に、Python ソリューションを検索するのではなく、シェルの機能を調べます。

bash を使用している場合は、/etc/bash_completion を確認できます。少なくとも debian/ubuntu では、プログラムの補完を指定するファイルを /etc/bash_completion.d/ に作成する必要があります。

于 2009-01-09T09:24:07.633 に答える
3

私が知っているように、 PYTHONSTARTUP は、インタープリターの起動時に実行されるコマンド用です[1]。ライブラリを使用している場合、スクリプトrlcompleterのオートコンプリート用です。このようなもの:readline

$ ./myscript.py
My Script version 3.1415.
Enter your commands:
myscript> B<TAB>egin
myscript> E<TAB>nd

あなたの例では、シェルコマンドラインで完了したいと考えています。このオートコンプリートはシェル機能です (bashまたはzsh、使用するものは何でも)。たとえば、bash オートコンプリートの紹介(パート 2も参照) を参照してください。たとえば、このガイドzshを参照してください。

于 2009-01-09T09:21:41.037 に答える
0

このオプションの省略形のみを使用した場合でも、プログラムにコマンド ライン オプションを選択させたい場合は、標準ライブラリのoptparse モジュールを調べる必要があります。

于 2009-01-09T09:28:28.310 に答える