1c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl"""Word completion for GNU readline. 22781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 3c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg BrandlThe completer completes keywords, built-ins and globals in a selectable 4c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandlnamespace (which defaults to __main__); when completing NAME.NAME..., it 5c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandlevaluates (!) the expression up to the last dot and completes its attributes. 62781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 7c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg BrandlIt's very cool to do "import sys" type "sys.", hit the completion key (twice), 8c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandland see the list of names defined by the sys module! 92781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 102781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van RossumTip: to use the tab key as the completion key, call 112781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 122781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum readline.parse_and_bind("tab: complete") 132781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 142781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van RossumNotes: 152781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 16c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl- Exceptions raised by the completer function are *ignored* (and generally cause 17c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl the completion to fail). This is a feature -- since readline sets the tty 18c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl device in raw (or cbreak) mode, printing a traceback wouldn't work well 19c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl without some complicated hoopla to save, reset and restore the tty state. 202781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 21c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl- The evaluation of the NAME.NAME... form may cause arbitrary application 22c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl defined code to be executed if an object with a __getattr__ hook is found. 23c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl Since it is the responsibility of the application (or the user) to enable this 24c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl feature, I consider this an acceptable risk. More complicated expressions 25c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl (e.g. function calls or indexing operations) are *not* evaluated. 262781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 272781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum- GNU readline is also used by the built-in functions input() and 282781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumraw_input(), and thus these also benefit/suffer from the completer 292781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumfeatures. Clearly an interactive application can benefit by 302781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumspecifying its own completer function and using raw_input() for all 312781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumits input. 322781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 332781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum- When the original stdin is not a tty device, GNU readline is never 34c56e667b6e3e1c7db809ebbafefc62a54589dea3Georg Brandl used, and this module (and the readline module) are silently inactive. 352781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 362781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum""" 372781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 382781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumimport __builtin__ 392781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumimport __main__ 402781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 410de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro__all__ = ["Completer"] 420de65807e6bdc5254f5a7e99b2f39adeea6b883bSkip Montanaro 432781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossumclass Completer: 44dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer def __init__(self, namespace = None): 45dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer """Create a new completer for the command line. 46dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer 47dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer Completer([namespace]) -> completer instance. 48dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer 49dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer If unspecified, the default namespace where completions are performed 50dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer is __main__ (technically, __main__.__dict__). Namespaces should be 51dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer given as dictionaries. 52dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer 53dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer Completer instances should be used as the completion mechanism of 54dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer readline via the set_completer() call: 55dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer 56dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer readline.set_completer(Completer(my_namespace).complete) 57dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer """ 58863ac44b74cd66f7d289748816d65c65808c149bTim Peters 59dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer if namespace and not isinstance(namespace, dict): 60dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer raise TypeError,'namespace must be a dictionary' 61dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer 62dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer # Don't bind to namespace quite yet, but flag whether the user wants a 63dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer # specific namespace or to use __main__.__dict__. This will allow us 64dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer # to bind to __main__.__dict__ at completion time, not now. 65dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer if namespace is None: 66dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer self.use_main_ns = 1 67dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer else: 68dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer self.use_main_ns = 0 69dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer self.namespace = namespace 702781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 712781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum def complete(self, text, state): 7245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum """Return the next possible completion for 'text'. 732781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 7445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum This is called successively with state == 0, 1, 2, ... until it 7545e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum returns None. The completion should begin with 'text'. 762781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 7745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum """ 78dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer if self.use_main_ns: 79dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer self.namespace = __main__.__dict__ 80863ac44b74cd66f7d289748816d65c65808c149bTim Peters 8145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum if state == 0: 8245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum if "." in text: 8345e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum self.matches = self.attr_matches(text) 8445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum else: 8545e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum self.matches = self.global_matches(text) 86d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum try: 87d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum return self.matches[state] 88d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum except IndexError: 89d458faadc303cef6fd07b9e22bfa9e08456426cfGuido van Rossum return None 902781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 9166c527755d0f751e4239328558082bf22f52d361Facundo Batista def _callable_postfix(self, val, word): 9252597be2a15130ced487240159392a076d1c7ccaBrett Cannon if hasattr(val, '__call__'): 9366c527755d0f751e4239328558082bf22f52d361Facundo Batista word = word + "(" 9466c527755d0f751e4239328558082bf22f52d361Facundo Batista return word 9566c527755d0f751e4239328558082bf22f52d361Facundo Batista 962781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum def global_matches(self, text): 9745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum """Compute matches when text is a simple name. 9845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 99dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer Return a list of all keywords, built-in functions and names currently 100dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer defined in self.namespace that match. 10145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 10245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum """ 10345e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum import keyword 10445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum matches = [] 10596bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter seen = {"__builtins__"} 10645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum n = len(text) 10766c527755d0f751e4239328558082bf22f52d361Facundo Batista for word in keyword.kwlist: 10866c527755d0f751e4239328558082bf22f52d361Facundo Batista if word[:n] == text: 10996bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter seen.add(word) 11066c527755d0f751e4239328558082bf22f52d361Facundo Batista matches.append(word) 11196bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter for nspace in [self.namespace, __builtin__.__dict__]: 11266c527755d0f751e4239328558082bf22f52d361Facundo Batista for word, val in nspace.items(): 11396bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter if word[:n] == text and word not in seen: 11496bc1757ce5eb25cb536c03aabb06fcbc42b6d27Martin Panter seen.add(word) 11566c527755d0f751e4239328558082bf22f52d361Facundo Batista matches.append(self._callable_postfix(val, word)) 11645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum return matches 1172781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 1182781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum def attr_matches(self, text): 11945e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum """Compute matches when text contains a dot. 12045e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 12145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum Assuming the text is of the form NAME.NAME....[NAME], and is 122f5469cff1f90381819291bcddcc70f5aaf2da141Ezio Melotti evaluable in self.namespace, it will be evaluated and its attributes 123dbab3e3178d8819a839ad08571f995376edcba00Neil Schemenauer (as revealed by dir()) are used as possible completions. (For class 124f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter Dörwald instances, class members are also considered.) 12545e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 12645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum WARNING: this can still invoke arbitrary C code, if an object 12745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum with a __getattr__ hook is evaluated. 12845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 12945e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum """ 13045e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum import re 13145e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) 13245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum if not m: 1334286138e7b06e5dd2cb1e8ebf12f768d018be3c2Georg Brandl return [] 13445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum expr, attr = m.group(1, 3) 135627a666db05a0a70ac54fe6456719ee0530b5df7Georg Brandl try: 136f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista thisobject = eval(expr, self.namespace) 137627a666db05a0a70ac54fe6456719ee0530b5df7Georg Brandl except Exception: 138627a666db05a0a70ac54fe6456719ee0530b5df7Georg Brandl return [] 139f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista 140f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista # get the content of the object, except __builtins__ 141ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter words = set(dir(thisobject)) 142ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter words.discard("__builtins__") 143f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista 144f3f67599fe2c1935c33eadceceea85286086e294Facundo Batista if hasattr(thisobject, '__class__'): 145ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter words.add('__class__') 146ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter words.update(get_class_members(thisobject.__class__)) 14745e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum matches = [] 14845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum n = len(attr) 14945e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum for word in words: 150ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter if word[:n] == attr: 151ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter try: 152ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter val = getattr(thisobject, word) 153ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter except Exception: 154ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter continue # Exclude properties that are not set 15566c527755d0f751e4239328558082bf22f52d361Facundo Batista word = self._callable_postfix(val, "%s.%s" % (expr, word)) 15666c527755d0f751e4239328558082bf22f52d361Facundo Batista matches.append(word) 157ef2b2f437e7160ea68d8087df43c069fa6534fb0Martin Panter matches.sort() 15845e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum return matches 1592781fbe46c7f8d8e391c3f3f3e8692b451e6142fGuido van Rossum 1604e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossumdef get_class_members(klass): 1614e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum ret = dir(klass) 1624e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum if hasattr(klass,'__bases__'): 1634e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum for base in klass.__bases__: 1644e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum ret = ret + get_class_members(base) 1654e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum return ret 1664e20de59dd5a9058c0d99c10d773b9d0bcbbe07dGuido van Rossum 1673583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandltry: 1683583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandl import readline 1693583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandlexcept ImportError: 1703583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandl pass 1713583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandlelse: 1723583cff5a9d55b9c1bc17b5d82670e5e6b0fc10dGeorg Brandl readline.set_completer(Completer().complete) 173