source: trunk/essentials/dev-lang/python/Lib/rlcompleter.py@ 3226

Last change on this file since 3226 was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 5.2 KB
Line 
1"""Word completion for GNU readline 2.0.
2
3This requires the latest extension to the readline module. The completer
4completes keywords, built-ins and globals in a selectable namespace (which
5defaults to __main__); when completing NAME.NAME..., it evaluates (!) the
6expression up to the last dot and completes its attributes.
7
8It's very cool to do "import sys" type "sys.", hit the
9completion key (twice), and see the list of names defined by the
10sys module!
11
12Tip: to use the tab key as the completion key, call
13
14 readline.parse_and_bind("tab: complete")
15
16Notes:
17
18- Exceptions raised by the completer function are *ignored* (and
19generally cause the completion to fail). This is a feature -- since
20readline sets the tty device in raw (or cbreak) mode, printing a
21traceback wouldn't work well without some complicated hoopla to save,
22reset and restore the tty state.
23
24- The evaluation of the NAME.NAME... form may cause arbitrary
25application defined code to be executed if an object with a
26__getattr__ hook is found. Since it is the responsibility of the
27application (or the user) to enable this feature, I consider this an
28acceptable risk. More complicated expressions (e.g. function calls or
29indexing operations) are *not* evaluated.
30
31- GNU readline is also used by the built-in functions input() and
32raw_input(), and thus these also benefit/suffer from the completer
33features. Clearly an interactive application can benefit by
34specifying its own completer function and using raw_input() for all
35its input.
36
37- When the original stdin is not a tty device, GNU readline is never
38used, and this module (and the readline module) are silently inactive.
39
40"""
41
42import __builtin__
43import __main__
44
45__all__ = ["Completer"]
46
47class Completer:
48 def __init__(self, namespace = None):
49 """Create a new completer for the command line.
50
51 Completer([namespace]) -> completer instance.
52
53 If unspecified, the default namespace where completions are performed
54 is __main__ (technically, __main__.__dict__). Namespaces should be
55 given as dictionaries.
56
57 Completer instances should be used as the completion mechanism of
58 readline via the set_completer() call:
59
60 readline.set_completer(Completer(my_namespace).complete)
61 """
62
63 if namespace and not isinstance(namespace, dict):
64 raise TypeError,'namespace must be a dictionary'
65
66 # Don't bind to namespace quite yet, but flag whether the user wants a
67 # specific namespace or to use __main__.__dict__. This will allow us
68 # to bind to __main__.__dict__ at completion time, not now.
69 if namespace is None:
70 self.use_main_ns = 1
71 else:
72 self.use_main_ns = 0
73 self.namespace = namespace
74
75 def complete(self, text, state):
76 """Return the next possible completion for 'text'.
77
78 This is called successively with state == 0, 1, 2, ... until it
79 returns None. The completion should begin with 'text'.
80
81 """
82 if self.use_main_ns:
83 self.namespace = __main__.__dict__
84
85 if state == 0:
86 if "." in text:
87 self.matches = self.attr_matches(text)
88 else:
89 self.matches = self.global_matches(text)
90 try:
91 return self.matches[state]
92 except IndexError:
93 return None
94
95 def global_matches(self, text):
96 """Compute matches when text is a simple name.
97
98 Return a list of all keywords, built-in functions and names currently
99 defined in self.namespace that match.
100
101 """
102 import keyword
103 matches = []
104 n = len(text)
105 for list in [keyword.kwlist,
106 __builtin__.__dict__,
107 self.namespace]:
108 for word in list:
109 if word[:n] == text and word != "__builtins__":
110 matches.append(word)
111 return matches
112
113 def attr_matches(self, text):
114 """Compute matches when text contains a dot.
115
116 Assuming the text is of the form NAME.NAME....[NAME], and is
117 evaluatable in self.namespace, it will be evaluated and its attributes