2017-07-20 3 views
0

私はタブでgitを発行すると、リストで自動補完することができます。私はtest.pyを書きたいと思います。 test.pyで定義されているリストを使って完成することは可能でしょうか?gitのようなtest.pyの自動補完<tab>

$ git [tab] 
add     branch    column    fetch    help    mv     reflog    revert    stash    
am     bundle    commit    filter-branch  imap-send   name-rev   relink    rm     status    
annotate   checkout   config    format-patch  init    notes    remote    send-email   submodule   
apply    cherry    credential   fsck    instaweb   p4     repack    shortlog   subtree    
archive    cherry-pick   describe   gc     log     pull    replace    show    tag     
bisect    clean    diff    get-tar-commit-id merge    push    request-pull  show-branch   whatchanged   
blame    clone    difftool   grep    mergetool   rebase    reset    stage 
+0

これをPython IDE内で実行しようとしている場合、いいえ、私は信じていません。Git Pythonライブラリを使用すると、gitコマンドを実行するのと同等のサポートされているコマンドが得られます。 – idjaw

+0

私はあなたがカスタムの 'complete'スクリプトを実行することができると確信していますが、あなたが今までに書いた中で最も痛いものです。 –

+0

私は同じことではないことを知っていますが、[cmd](https://docs.python.org/2/library/cmd.html)モジュールを見たことがありますか?同様の機能を持っています。 – Himal

答えて

1

あなたが探している方法はreadline.set_completerです。このメソッドは、bashシェルのreadlineと対話します。実装が簡単です。例:https://pymotw.com/2/readline/

+1

私はこのモジュールを知らなかった。それは強力で有用なようです。 –

+0

これは、OPが探しているものではありません。これは、Pythonスクリプトを実行したときにのみ効果がありますが、コマンドライン自体には自動補完機能はありません。 – zwer

+0

これはPython環境から最も近いことです - (bash自体をPythonで実装しないように)。あなたが言及した回避策は、正しいものの、変更されるファイルの数を考慮して少し畳み込まれています。むしろ、Pythonコンソールを起動し、 'readline'を利用してください。 – Jerry

0

gitバイナリ自体の機能ではありません、それはbash完了「ハック」だとのようなそれ自体は Pythonのとは何の関係もありませんが、あなたはそのようなものがのは、追加してみましょうとして、それをタグ付けしましたので、少しひねり。

#!/usr/bin/env python 

import sys 

# let's define some sample functions to be called on passed arguments 
def f1(): 
    print("F1 called!") 

def f2(): 
    print("F2 called!") 

def f3(): 
    print("F3 called!") 

def f_invalid(): # a simple invalid placeholder function 
    print("Invalid command!") 

def f_list(): # a function to list all valid arguments 
    print(" ".join(sorted(arguments.keys()))) 

if __name__ == "__main__": # make sure we're running this as a script 
    arguments = { # a simple argument map, use argparse or similar in a real world use 
     "arg1": f1, 
     "arg2": f2, 
     "arg3": f3, 
     "list_arguments": f_list 
    } 
    if len(sys.argv) > 1: 
     for arg in sys.argv[1:]: # loop through all arguments 
      arguments.get(arg, f_invalid)() # call the mapped or invalid function 
    else: 
     print("At least one argument required!") 

注:スクリプト(chmod +x test.py)に実行可能フラグを追加のでそのシェバングを実行する代わりに、としてそれを提供するために使用されていることを確認しtest.py - 我々はその許容可能な引数を認識してスクリプトを作成しましょうPythonインタプリタの引数。

は別に、すべての決まり文句から、重要な引数list_argumentsある - それは、このスクリプトに利用可能なすべての引数を示しますし、我々はbashどのようにオートコンプリートに指示するために、当社のbash完了スクリプトでこの出力を使用します。これを行うには、別のスクリプトを作成するには、のはそれtest-completion.bashを呼びましょう:

#!/usr/bin/env bash 

SCRIPT_NAME=test.py 
SCRIPT_PATH=/path/to/your/script 
_complete_script() 
{ 
    local cursor options 
    options=$(${SCRIPT_PATH}/${SCRIPT_NAME} list_arguments) 
    cursor="${COMP_WORDS[COMP_CWORD]}" 
    COMPREPLY=($(compgen -W "${options}" -- ${cursor})) 
    return 0 
} 
complete -F _complete_script ${SCRIPT_NAME} 

何それは本質的complete_complete_script機能に追加されていtest.pyオーバー完了が呼び出されるたびに呼び出されます。 _complete_scriptファンクション自体は、最初にのtest.pyを呼び出して受け入れ可能な引数を取得し、compgenを使用してcompleteがそれを印刷できるようにするために必要な構造を作成します。

source test-completion.bash 

そして、あなたはbashのように動作します:テストするに

、あなたが必要なのは、このスクリプトを調達することです

$ ./test.py [tab] 
arg1   arg2   arg3   list_arguments

そして、何よりだ、それはあなたのPythonスクリプトから完全に制御可能です - list_argumentsのコマンドにリストとして印刷されるものは、自動補完のヘルプとして表示されるものです。

変更を永続的にするには、.bashrcに単にsource行を追加するか、より構造化されたソリューションが必要な場合は、ご使​​用のOSのガイドラインに従うことができます。たとえば、git-flow-completionページに記載されている2つの方法があります。もちろん、これはあなたが実際にbash-autocompleteをシステムにインストールして有効にしていることを前提としていますが、そうしなければgitの自動補完は機能しません。

オートコンプリートと言えば、git-completion.bash sourceをチェックすることで、その実装方法を見ることができます。警告の言葉ですが、それはかすかなものではありません。