61

引数でも Python スクリプトでオートコンプリートを取得したいと思います。

bash_completion が (引数に対して) どのように機能するかを本当に理解したことがありませんでしたが、掘り下げた後、次のことがわかりました。

  1. 「complete」を使用して、補完関数をコマンドにバインドします
  2. すべての補完関数は基本的に引数パーサーのコピーです

特に 2 番目の点は、自動生成したいのであまり良くありません。

最良の方法は、シェルがすべてのタブで何を完了するかについて私のプログラムに尋ねることですが、これは実際には機能しないという印象があります。それは正しいですか?

2 番目のオプションは、おそらく、正しく完了する argparse パーサーからシェル関数へのコンバーターを作成することです。

4

2 に答える 2

75

恥知らずな自己宣伝: https://github.com/kislyuk/argcomplete

argcomplete は、argparse の bash 補完を提供します。

于 2012-11-25T19:50:46.833 に答える
14

Bash の「完了」は本当に素晴らしいです。そして、Python で書かれたプログラムは簡単です....

これはまさにあなたが望むものだと思います: optcomplete: Shell Completion Self-Generator for Python。たとえば、Ubuntu の「python-optcomplete」パッケージとして利用できます。

Python プログラムに数行を挿入すると、ユーザーは (1 回) bash の "complete" プログラムを実行して、引数を完了する方法を bash に伝えます。

complete -F _optcomplete <program>

そして今、ユーザーは完了しました! デフォルトでは、プログラム オプションを簡単に補完できます。特定のオプションで補完がどのように機能するかをカスタマイズする方法については、例を参照してください。それは美しく書かれており、サブコマンド、代替補完オプションなどを処理するために簡単に拡張できます!

アップデート:

zsh での補完 (optparse と argparse の両方) については、genzshcomp 0.3.1 : Python Package Indexを参照してください。

@englebip が指摘したようにargparse、Python 2.7 および 3.2 で導入された新しいモジュールにoptparseは、現在非推奨になっているため、同様のものが必要です。

その方向への移行に関する議論は次のとおりです。

それがどのように行われるかについては、この背景も参照してください: argparse (および非推奨の optparse) は、bash で Python プログラム名の後に「タブ」キーを押すとどのように応答しますか? - スタックオーバーフロー

于 2012-02-23T18:32:43.590 に答える