2017-01-17 6 views
1

私はGDBのPythonサポートを使っています。私の場合、Pythonはユーザに特化したインタフェースを提供します。内部的に、アプリケーションはさまざまなGDB関数を呼び出して、Cライブラリのアクションを実行します。Python経由のプログラマティックなGDBコンプリータインターフェイス

GDBシェルを使用する場合、GDBは非常に優れたタブ補完機能を提供します。しかし、私はPython APIを使いたいと思います。

ユーザ入力に応じてコマンドの補完をしたいと思います。理想的には、部分文字列でGDB関数を呼びたいと思います。 GDBは可能な補完を返します。

補完を実行するために使用できるPython APIはありますか?

答えて

2

はい、Python APIがあります。それは文書番号の下でCommand.complete (text, word)

デフォルトコンプリートはファイル名とサブコマンドの補完を行いますが、独自のカスタムcompleteメソッドを提供することで拡張できます。ここに例があります:

class MyGdbCommand(gdb.Command): 
    def __init__(self): 
     super().__init__("mycmd", gdb.COMMAND_USER) # or whatever command class you deem appropriate 

    def complete(self, arguments_string, last): 
     is_brk_char = (len(arguments_string) < len(last)) 
     args = gdb.string_to_argv(arguments_string) 
     if arguments_string == "" or arguments_string[-1:] == " ": 
      args.append("") # Add dummy argument to complete 
     argc = len(args) 

     if argc == 1: 
      if is_brk_char: 
       return gdb.COMPLETE_NONE 
      if args[0] in ['-l', '-o']: 
       return args[0] # it's complete 
      return ['-l', '-o'] # valid option flags 

     if argc == 2 and (args[0] == '-l' or args[0] == '-o'): 
      if is_brk_char: 
       return gdb.COMPLETE_FILENAME # -l and -o take file arguments 
      (head, tail) = os.path.split(curr) 
      return getMatchingFiles(head, tail) # implement appropriate heuristic; pass args[0] flag if it matters 

     if argc == 3: 
      if is_brk_char: 
       return gdb.COMPLETE_NONE 
      if args[0] == '-l': 
       return ['-o'] 
      if args[0] == '-o': 
       return ['-l'] 
      return [] 

     if argc == 4: 
      if is_brk_char: 
       return gdb.COMPLETE_FILENAME 
      (head, tail) = os.path.split(curr) 
      return getMatchingFiles(head, tail)   

     if is_brk_char: 
      return gdb.COMPLETE_NONE 
     return [] # No more valid options 

注記!コンプリータは検証の責任を負いません。これはコマンドのinvoke()メソッドが呼び出された後に実行する必要があります。

関連する問題