##// END OF EJS Templates
Fix emacs tab-completion with simpler implementation....
andy wilson -
Show More
@@ -1,880 +1,869 b''
1 """Word completion for IPython.
1 """Word completion for IPython.
2
2
3 This module is a fork of the rlcompleter module in the Python standard
3 This module is a fork of the rlcompleter module in the Python standard
4 library. The original enhancements made to rlcompleter have been sent
4 library. The original enhancements made to rlcompleter have been sent
5 upstream and were accepted as of Python 2.3, but we need a lot more
5 upstream and were accepted as of Python 2.3, but we need a lot more
6 functionality specific to IPython, so this module will continue to live as an
6 functionality specific to IPython, so this module will continue to live as an
7 IPython-specific utility.
7 IPython-specific utility.
8
8
9 Original rlcompleter documentation:
9 Original rlcompleter documentation:
10
10
11 This requires the latest extension to the readline module (the
11 This requires the latest extension to the readline module (the
12 completes keywords, built-ins and globals in __main__; when completing
12 completes keywords, built-ins and globals in __main__; when completing
13 NAME.NAME..., it evaluates (!) the expression up to the last dot and
13 NAME.NAME..., it evaluates (!) the expression up to the last dot and
14 completes its attributes.
14 completes its attributes.
15
15
16 It's very cool to do "import string" type "string.", hit the
16 It's very cool to do "import string" type "string.", hit the
17 completion key (twice), and see the list of names defined by the
17 completion key (twice), and see the list of names defined by the
18 string module!
18 string module!
19
19
20 Tip: to use the tab key as the completion key, call
20 Tip: to use the tab key as the completion key, call
21
21
22 readline.parse_and_bind("tab: complete")
22 readline.parse_and_bind("tab: complete")
23
23
24 Notes:
24 Notes:
25
25
26 - Exceptions raised by the completer function are *ignored* (and
26 - Exceptions raised by the completer function are *ignored* (and
27 generally cause the completion to fail). This is a feature -- since
27 generally cause the completion to fail). This is a feature -- since
28 readline sets the tty device in raw (or cbreak) mode, printing a
28 readline sets the tty device in raw (or cbreak) mode, printing a
29 traceback wouldn't work well without some complicated hoopla to save,
29 traceback wouldn't work well without some complicated hoopla to save,
30 reset and restore the tty state.
30 reset and restore the tty state.
31
31
32 - The evaluation of the NAME.NAME... form may cause arbitrary
32 - The evaluation of the NAME.NAME... form may cause arbitrary
33 application defined code to be executed if an object with a
33 application defined code to be executed if an object with a
34 __getattr__ hook is found. Since it is the responsibility of the
34 __getattr__ hook is found. Since it is the responsibility of the
35 application (or the user) to enable this feature, I consider this an
35 application (or the user) to enable this feature, I consider this an
36 acceptable risk. More complicated expressions (e.g. function calls or
36 acceptable risk. More complicated expressions (e.g. function calls or
37 indexing operations) are *not* evaluated.
37 indexing operations) are *not* evaluated.
38
38
39 - GNU readline is also used by the built-in functions input() and
39 - GNU readline is also used by the built-in functions input() and
40 raw_input(), and thus these also benefit/suffer from the completer
40 raw_input(), and thus these also benefit/suffer from the completer
41 features. Clearly an interactive application can benefit by
41 features. Clearly an interactive application can benefit by
42 specifying its own completer function and using raw_input() for all
42 specifying its own completer function and using raw_input() for all
43 its input.
43 its input.
44
44
45 - When the original stdin is not a tty device, GNU readline is never
45 - When the original stdin is not a tty device, GNU readline is never
46 used, and this module (and the readline module) are silently inactive.
46 used, and this module (and the readline module) are silently inactive.
47 """
47 """
48
48
49 #*****************************************************************************
49 #*****************************************************************************
50 #
50 #
51 # Since this file is essentially a minimally modified copy of the rlcompleter
51 # Since this file is essentially a minimally modified copy of the rlcompleter
52 # module which is part of the standard Python distribution, I assume that the
52 # module which is part of the standard Python distribution, I assume that the
53 # proper procedure is to maintain its copyright as belonging to the Python
53 # proper procedure is to maintain its copyright as belonging to the Python
54 # Software Foundation (in addition to my own, for all new code).
54 # Software Foundation (in addition to my own, for all new code).
55 #
55 #
56 # Copyright (C) 2008-2010 IPython Development Team
56 # Copyright (C) 2008-2010 IPython Development Team
57 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
57 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
58 # Copyright (C) 2001 Python Software Foundation, www.python.org
58 # Copyright (C) 2001 Python Software Foundation, www.python.org
59 #
59 #
60 # Distributed under the terms of the BSD License. The full license is in
60 # Distributed under the terms of the BSD License. The full license is in
61 # the file COPYING, distributed as part of this software.
61 # the file COPYING, distributed as part of this software.
62 #
62 #
63 #*****************************************************************************
63 #*****************************************************************************
64 from __future__ import print_function
64 from __future__ import print_function
65
65
66 #-----------------------------------------------------------------------------
66 #-----------------------------------------------------------------------------
67 # Imports
67 # Imports
68 #-----------------------------------------------------------------------------
68 #-----------------------------------------------------------------------------
69
69
70 import __builtin__
70 import __builtin__
71 import __main__
71 import __main__
72 import glob
72 import glob
73 import inspect
73 import inspect
74 import itertools
74 import itertools
75 import keyword
75 import keyword
76 import os
76 import os
77 import re
77 import re
78 import shlex
78 import shlex
79 import sys
79 import sys
80
80
81 from IPython.core.error import TryNext
81 from IPython.core.error import TryNext
82 from IPython.core.prefilter import ESC_MAGIC
82 from IPython.core.prefilter import ESC_MAGIC
83 from IPython.utils import generics
83 from IPython.utils import generics
84 from IPython.utils import io
84 from IPython.utils import io
85 from IPython.utils.dir2 import dir2
85 from IPython.utils.dir2 import dir2
86 from IPython.utils.process import arg_split
86 from IPython.utils.process import arg_split
87
87
88 #-----------------------------------------------------------------------------
88 #-----------------------------------------------------------------------------
89 # Globals
89 # Globals
90 #-----------------------------------------------------------------------------
90 #-----------------------------------------------------------------------------
91
91
92 # Public API
92 # Public API
93 __all__ = ['Completer','IPCompleter']
93 __all__ = ['Completer','IPCompleter']
94
94
95 if sys.platform == 'win32':
95 if sys.platform == 'win32':
96 PROTECTABLES = ' '
96 PROTECTABLES = ' '
97 else:
97 else:
98 PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&'
98 PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&'
99
99
100 #-----------------------------------------------------------------------------
100 #-----------------------------------------------------------------------------
101 # Main functions and classes
101 # Main functions and classes
102 #-----------------------------------------------------------------------------
102 #-----------------------------------------------------------------------------
103
103
104 def has_open_quotes(s):
104 def has_open_quotes(s):
105 """Return whether a string has open quotes.
105 """Return whether a string has open quotes.
106
106
107 This simply counts whether the number of quote characters of either type in
107 This simply counts whether the number of quote characters of either type in
108 the string is odd.
108 the string is odd.
109
109
110 Returns
110 Returns
111 -------
111 -------
112 If there is an open quote, the quote character is returned. Else, return
112 If there is an open quote, the quote character is returned. Else, return
113 False.
113 False.
114 """
114 """
115 # We check " first, then ', so complex cases with nested quotes will get
115 # We check " first, then ', so complex cases with nested quotes will get
116 # the " to take precedence.
116 # the " to take precedence.
117 if s.count('"') % 2:
117 if s.count('"') % 2:
118 return '"'
118 return '"'
119 elif s.count("'") % 2:
119 elif s.count("'") % 2:
120 return "'"
120 return "'"
121 else:
121 else:
122 return False
122 return False
123
123
124
124
125 def protect_filename(s):
125 def protect_filename(s):
126 """Escape a string to protect certain characters."""
126 """Escape a string to protect certain characters."""
127
127
128 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
128 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
129 for ch in s])
129 for ch in s])
130
130
131
131
132 def mark_dirs(matches):
132 def mark_dirs(matches):
133 """Mark directories in input list by appending '/' to their names."""
133 """Mark directories in input list by appending '/' to their names."""
134 out = []
134 out = []
135 isdir = os.path.isdir
135 isdir = os.path.isdir
136 for x in matches:
136 for x in matches:
137 if isdir(x):
137 if isdir(x):
138 out.append(x+'/')
138 out.append(x+'/')
139 else:
139 else:
140 out.append(x)
140 out.append(x)
141 return out
141 return out
142
142
143
143
144 def expand_user(path):
144 def expand_user(path):
145 """Expand '~'-style usernames in strings.
145 """Expand '~'-style usernames in strings.
146
146
147 This is similar to :func:`os.path.expanduser`, but it computes and returns
147 This is similar to :func:`os.path.expanduser`, but it computes and returns
148 extra information that will be useful if the input was being used in
148 extra information that will be useful if the input was being used in
149 computing completions, and you wish to return the completions with the
149 computing completions, and you wish to return the completions with the
150 original '~' instead of its expanded value.
150 original '~' instead of its expanded value.
151
151
152 Parameters
152 Parameters
153 ----------
153 ----------
154 path : str
154 path : str
155 String to be expanded. If no ~ is present, the output is the same as the
155 String to be expanded. If no ~ is present, the output is the same as the
156 input.
156 input.
157
157
158 Returns
158 Returns
159 -------
159 -------
160 newpath : str
160 newpath : str
161 Result of ~ expansion in the input path.
161 Result of ~ expansion in the input path.
162 tilde_expand : bool
162 tilde_expand : bool
163 Whether any expansion was performed or not.
163 Whether any expansion was performed or not.
164 tilde_val : str
164 tilde_val : str
165 The value that ~ was replaced with.
165 The value that ~ was replaced with.
166 """
166 """
167 # Default values
167 # Default values
168 tilde_expand = False
168 tilde_expand = False
169 tilde_val = ''
169 tilde_val = ''
170 newpath = path
170 newpath = path
171
171
172 if path.startswith('~'):
172 if path.startswith('~'):
173 tilde_expand = True
173 tilde_expand = True
174 rest = path[1:]
174 rest = path[1:]
175 newpath = os.path.expanduser(path)
175 newpath = os.path.expanduser(path)
176 tilde_val = newpath.replace(rest, '')
176 tilde_val = newpath.replace(rest, '')
177
177
178 return newpath, tilde_expand, tilde_val
178 return newpath, tilde_expand, tilde_val
179
179
180
180
181 def compress_user(path, tilde_expand, tilde_val):
181 def compress_user(path, tilde_expand, tilde_val):
182 """Does the opposite of expand_user, with its outputs.
182 """Does the opposite of expand_user, with its outputs.
183 """
183 """
184 if tilde_expand:
184 if tilde_expand:
185 return path.replace(tilde_val, '~')
185 return path.replace(tilde_val, '~')
186 else:
186 else:
187 return path
187 return path
188
188
189
189
190 def single_dir_expand(matches):
190 def single_dir_expand(matches):
191 "Recursively expand match lists containing a single dir."
191 "Recursively expand match lists containing a single dir."
192
192
193 if len(matches) == 1 and os.path.isdir(matches[0]):
193 if len(matches) == 1 and os.path.isdir(matches[0]):
194 # Takes care of links to directories also. Use '/'
194 # Takes care of links to directories also. Use '/'
195 # explicitly, even under Windows, so that name completions
195 # explicitly, even under Windows, so that name completions
196 # don't end up escaped.
196 # don't end up escaped.
197 d = matches[0]
197 d = matches[0]
198 if d[-1] in ['/','\\']:
198 if d[-1] in ['/','\\']:
199 d = d[:-1]
199 d = d[:-1]
200
200
201 subdirs = os.listdir(d)
201 subdirs = os.listdir(d)
202 if subdirs:
202 if subdirs:
203 matches = [ (d + '/' + p) for p in subdirs]
203 matches = [ (d + '/' + p) for p in subdirs]
204 return single_dir_expand(matches)
204 return single_dir_expand(matches)
205 else:
205 else:
206 return matches
206 return matches
207 else:
207 else:
208 return matches
208 return matches
209
209
210
210
211 class Bunch(object): pass
211 class Bunch(object): pass
212
212
213
213
214 class CompletionSplitter(object):
214 class CompletionSplitter(object):
215 """An object to split an input line in a manner similar to readline.
215 """An object to split an input line in a manner similar to readline.
216
216
217 By having our own implementation, we can expose readline-like completion in
217 By having our own implementation, we can expose readline-like completion in
218 a uniform manner to all frontends. This object only needs to be given the
218 a uniform manner to all frontends. This object only needs to be given the
219 line of text to be split and the cursor position on said line, and it
219 line of text to be split and the cursor position on said line, and it
220 returns the 'word' to be completed on at the cursor after splitting the
220 returns the 'word' to be completed on at the cursor after splitting the
221 entire line.
221 entire line.
222
222
223 What characters are used as splitting delimiters can be controlled by
223 What characters are used as splitting delimiters can be controlled by
224 setting the `delims` attribute (this is a property that internally
224 setting the `delims` attribute (this is a property that internally
225 automatically builds the necessary """
225 automatically builds the necessary """
226
226
227 # Private interface
227 # Private interface
228
228
229 # A string of delimiter characters. The default value makes sense for
229 # A string of delimiter characters. The default value makes sense for
230 # IPython's most typical usage patterns.
230 # IPython's most typical usage patterns.
231 _delims = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?'
231 _delims = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?'
232
232
233 # The expression (a normal string) to be compiled into a regular expression
233 # The expression (a normal string) to be compiled into a regular expression
234 # for actual splitting. We store it as an attribute mostly for ease of
234 # for actual splitting. We store it as an attribute mostly for ease of
235 # debugging, since this type of code can be so tricky to debug.
235 # debugging, since this type of code can be so tricky to debug.
236 _delim_expr = None
236 _delim_expr = None
237
237
238 # The regular expression that does the actual splitting
238 # The regular expression that does the actual splitting
239 _delim_re = None
239 _delim_re = None
240
240
241 def __init__(self, delims=None):
241 def __init__(self, delims=None):
242 delims = CompletionSplitter._delims if delims is None else delims
242 delims = CompletionSplitter._delims if delims is None else delims
243 self.set_delims(delims)
243 self.set_delims(delims)
244
244
245 def set_delims(self, delims):
245 def set_delims(self, delims):
246 """Set the delimiters for line splitting."""
246 """Set the delimiters for line splitting."""
247 expr = '[' + ''.join('\\'+ c for c in delims) + ']'
247 expr = '[' + ''.join('\\'+ c for c in delims) + ']'
248 self._delim_re = re.compile(expr)
248 self._delim_re = re.compile(expr)
249 self._delims = delims
249 self._delims = delims
250 self._delim_expr = expr
250 self._delim_expr = expr
251
251
252 def get_delims(self):
252 def get_delims(self):
253 """Return the string of delimiter characters."""
253 """Return the string of delimiter characters."""
254 return self._delims
254 return self._delims
255
255
256 def split_line(self, line, cursor_pos=None):
256 def split_line(self, line, cursor_pos=None):
257 """Split a line of text with a cursor at the given position.
257 """Split a line of text with a cursor at the given position.
258 """
258 """
259 l = line if cursor_pos is None else line[:cursor_pos]
259 l = line if cursor_pos is None else line[:cursor_pos]
260 return self._delim_re.split(l)[-1]
260 return self._delim_re.split(l)[-1]
261
261
262
262
263 class Completer(object):
263 class Completer(object):
264 def __init__(self, namespace=None, global_namespace=None):
264 def __init__(self, namespace=None, global_namespace=None):
265 """Create a new completer for the command line.
265 """Create a new completer for the command line.
266
266
267 Completer([namespace,global_namespace]) -> completer instance.
267 Completer([namespace,global_namespace]) -> completer instance.
268
268
269 If unspecified, the default namespace where completions are performed
269 If unspecified, the default namespace where completions are performed
270 is __main__ (technically, __main__.__dict__). Namespaces should be
270 is __main__ (technically, __main__.__dict__). Namespaces should be
271 given as dictionaries.
271 given as dictionaries.
272
272
273 An optional second namespace can be given. This allows the completer
273 An optional second namespace can be given. This allows the completer
274 to handle cases where both the local and global scopes need to be
274 to handle cases where both the local and global scopes need to be
275 distinguished.
275 distinguished.
276
276
277 Completer instances should be used as the completion mechanism of
277 Completer instances should be used as the completion mechanism of
278 readline via the set_completer() call:
278 readline via the set_completer() call:
279
279
280 readline.set_completer(Completer(my_namespace).complete)
280 readline.set_completer(Completer(my_namespace).complete)
281 """
281 """
282
282
283 # Don't bind to namespace quite yet, but flag whether the user wants a
283 # Don't bind to namespace quite yet, but flag whether the user wants a
284 # specific namespace or to use __main__.__dict__. This will allow us
284 # specific namespace or to use __main__.__dict__. This will allow us
285 # to bind to __main__.__dict__ at completion time, not now.
285 # to bind to __main__.__dict__ at completion time, not now.
286 if namespace is None:
286 if namespace is None:
287 self.use_main_ns = 1
287 self.use_main_ns = 1
288 else:
288 else:
289 self.use_main_ns = 0
289 self.use_main_ns = 0
290 self.namespace = namespace
290 self.namespace = namespace
291
291
292 # The global namespace, if given, can be bound directly
292 # The global namespace, if given, can be bound directly
293 if global_namespace is None:
293 if global_namespace is None:
294 self.global_namespace = {}
294 self.global_namespace = {}
295 else:
295 else:
296 self.global_namespace = global_namespace
296 self.global_namespace = global_namespace
297
297
298 def complete(self, text, state):
298 def complete(self, text, state):
299 """Return the next possible completion for 'text'.
299 """Return the next possible completion for 'text'.
300
300
301 This is called successively with state == 0, 1, 2, ... until it
301 This is called successively with state == 0, 1, 2, ... until it
302 returns None. The completion should begin with 'text'.
302 returns None. The completion should begin with 'text'.
303
303
304 """
304 """
305 if self.use_main_ns:
305 if self.use_main_ns:
306 self.namespace = __main__.__dict__
306 self.namespace = __main__.__dict__
307
307
308 if state == 0:
308 if state == 0:
309 if "." in text:
309 if "." in text:
310 self.matches = self.attr_matches(text)
310 self.matches = self.attr_matches(text)
311 else:
311 else:
312 self.matches = self.global_matches(text)
312 self.matches = self.global_matches(text)
313 try:
313 try:
314 return self.matches[state]
314 return self.matches[state]
315 except IndexError:
315 except IndexError:
316 return None
316 return None
317
317
318 def global_matches(self, text):
318 def global_matches(self, text):
319 """Compute matches when text is a simple name.
319 """Compute matches when text is a simple name.
320
320
321 Return a list of all keywords, built-in functions and names currently
321 Return a list of all keywords, built-in functions and names currently
322 defined in self.namespace or self.global_namespace that match.
322 defined in self.namespace or self.global_namespace that match.
323
323
324 """
324 """
325 #print 'Completer->global_matches, txt=%r' % text # dbg
325 #print 'Completer->global_matches, txt=%r' % text # dbg
326 matches = []
326 matches = []
327 match_append = matches.append
327 match_append = matches.append
328 n = len(text)
328 n = len(text)
329 for lst in [keyword.kwlist,
329 for lst in [keyword.kwlist,
330 __builtin__.__dict__.keys(),
330 __builtin__.__dict__.keys(),
331 self.namespace.keys(),
331 self.namespace.keys(),
332 self.global_namespace.keys()]:
332 self.global_namespace.keys()]:
333 for word in lst:
333 for word in lst:
334 if word[:n] == text and word != "__builtins__":
334 if word[:n] == text and word != "__builtins__":
335 match_append(word)
335 match_append(word)
336 return matches
336 return matches
337
337
338 def attr_matches(self, text):
338 def attr_matches(self, text):
339 """Compute matches when text contains a dot.
339 """Compute matches when text contains a dot.
340
340
341 Assuming the text is of the form NAME.NAME....[NAME], and is
341 Assuming the text is of the form NAME.NAME....[NAME], and is
342 evaluatable in self.namespace or self.global_namespace, it will be
342 evaluatable in self.namespace or self.global_namespace, it will be
343 evaluated and its attributes (as revealed by dir()) are used as
343 evaluated and its attributes (as revealed by dir()) are used as
344 possible completions. (For class instances, class members are are
344 possible completions. (For class instances, class members are are
345 also considered.)
345 also considered.)
346
346
347 WARNING: this can still invoke arbitrary C code, if an object
347 WARNING: this can still invoke arbitrary C code, if an object
348 with a __getattr__ hook is evaluated.
348 with a __getattr__ hook is evaluated.
349
349
350 """
350 """
351
351
352 #print 'Completer->attr_matches, txt=%r' % text # dbg
352 #print 'Completer->attr_matches, txt=%r' % text # dbg
353 # Another option, seems to work great. Catches things like ''.<tab>
353 # Another option, seems to work great. Catches things like ''.<tab>
354 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
354 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
355
355
356 if not m:
356 if not m:
357 return []
357 return []
358
358
359 expr, attr = m.group(1, 3)
359 expr, attr = m.group(1, 3)
360 try:
360 try:
361 obj = eval(expr, self.namespace)
361 obj = eval(expr, self.namespace)
362 except:
362 except:
363 try:
363 try:
364 obj = eval(expr, self.global_namespace)
364 obj = eval(expr, self.global_namespace)
365 except:
365 except:
366 return []
366 return []
367
367
368 words = dir2(obj)
368 words = dir2(obj)
369
369
370 try:
370 try:
371 words = generics.complete_object(obj, words)
371 words = generics.complete_object(obj, words)
372 except TryNext:
372 except TryNext:
373 pass
373 pass
374 # Build match list to return
374 # Build match list to return
375 n = len(attr)
375 n = len(attr)
376 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
376 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
377 return res
377 return res
378
378
379
379
380 class IPCompleter(Completer):
380 class IPCompleter(Completer):
381 """Extension of the completer class with IPython-specific features"""
381 """Extension of the completer class with IPython-specific features"""
382
382
383 def __init__(self, shell, namespace=None, global_namespace=None,
383 def __init__(self, shell, namespace=None, global_namespace=None,
384 omit__names=True, alias_table=None, use_readline=True):
384 omit__names=True, alias_table=None, use_readline=True):
385 """IPCompleter() -> completer
385 """IPCompleter() -> completer
386
386
387 Return a completer object suitable for use by the readline library
387 Return a completer object suitable for use by the readline library
388 via readline.set_completer().
388 via readline.set_completer().
389
389
390 Inputs:
390 Inputs:
391
391
392 - shell: a pointer to the ipython shell itself. This is needed
392 - shell: a pointer to the ipython shell itself. This is needed
393 because this completer knows about magic functions, and those can
393 because this completer knows about magic functions, and those can
394 only be accessed via the ipython instance.
394 only be accessed via the ipython instance.
395
395
396 - namespace: an optional dict where completions are performed.
396 - namespace: an optional dict where completions are performed.
397
397
398 - global_namespace: secondary optional dict for completions, to
398 - global_namespace: secondary optional dict for completions, to
399 handle cases (such as IPython embedded inside functions) where
399 handle cases (such as IPython embedded inside functions) where
400 both Python scopes are visible.
400 both Python scopes are visible.
401
401
402 - The optional omit__names parameter sets the completer to omit the
402 - The optional omit__names parameter sets the completer to omit the
403 'magic' names (__magicname__) for python objects unless the text
403 'magic' names (__magicname__) for python objects unless the text
404 to be completed explicitly starts with one or more underscores.
404 to be completed explicitly starts with one or more underscores.
405
405
406 - If alias_table is supplied, it should be a dictionary of aliases
406 - If alias_table is supplied, it should be a dictionary of aliases
407 to complete.
407 to complete.
408
408
409 use_readline : bool, optional
409 use_readline : bool, optional
410 If true, use the readline library. This completer can still function
410 If true, use the readline library. This completer can still function
411 without readline, though in that case callers must provide some extra
411 without readline, though in that case callers must provide some extra
412 information on each call about the current line."""
412 information on each call about the current line."""
413
413
414 Completer.__init__(self, namespace, global_namespace)
414 Completer.__init__(self, namespace, global_namespace)
415
415
416 self.magic_escape = ESC_MAGIC
416 self.magic_escape = ESC_MAGIC
417 self.splitter = CompletionSplitter()
417 self.splitter = CompletionSplitter()
418
418
419 # Readline configuration, only used by the rlcompleter method.
419 # Readline configuration, only used by the rlcompleter method.
420 if use_readline:
420 if use_readline:
421 # We store the right version of readline so that later code
421 # We store the right version of readline so that later code
422 import IPython.utils.rlineimpl as readline
422 import IPython.utils.rlineimpl as readline
423 self.readline = readline
423 self.readline = readline
424 else:
424 else:
425 self.readline = None
425 self.readline = None
426
426
427 # List where completion matches will be stored
427 # List where completion matches will be stored
428 self.matches = []
428 self.matches = []
429 self.omit__names = omit__names
429 self.omit__names = omit__names
430 self.merge_completions = shell.readline_merge_completions
430 self.merge_completions = shell.readline_merge_completions
431 self.shell = shell.shell
431 self.shell = shell.shell
432 if alias_table is None:
432 if alias_table is None:
433 alias_table = {}
433 alias_table = {}
434 self.alias_table = alias_table
434 self.alias_table = alias_table
435 # Regexp to split filenames with spaces in them
435 # Regexp to split filenames with spaces in them
436 self.space_name_re = re.compile(r'([^\\] )')
436 self.space_name_re = re.compile(r'([^\\] )')
437 # Hold a local ref. to glob.glob for speed
437 # Hold a local ref. to glob.glob for speed
438 self.glob = glob.glob
438 self.glob = glob.glob
439
439
440 # Determine if we are running on 'dumb' terminals, like (X)Emacs
440 # Determine if we are running on 'dumb' terminals, like (X)Emacs
441 # buffers, to avoid completion problems.
441 # buffers, to avoid completion problems.
442 term = os.environ.get('TERM','xterm')
442 term = os.environ.get('TERM','xterm')
443 self.dumb_terminal = term in ['dumb','emacs']
443 self.dumb_terminal = term in ['dumb','emacs']
444
444
445 # Special handling of backslashes needed in win32 platforms
445 # Special handling of backslashes needed in win32 platforms
446 if sys.platform == "win32":
446 if sys.platform == "win32":
447 self.clean_glob = self._clean_glob_win32
447 self.clean_glob = self._clean_glob_win32
448 else:
448 else:
449 self.clean_glob = self._clean_glob
449 self.clean_glob = self._clean_glob
450
450
451 # All active matcher routines for completion
451 # All active matcher routines for completion
452 self.matchers = [self.python_matches,
452 self.matchers = [self.python_matches,
453 self.file_matches,
453 self.file_matches,
454 self.magic_matches,
454 self.magic_matches,
455 self.alias_matches,
455 self.alias_matches,
456 self.python_func_kw_matches,
456 self.python_func_kw_matches,
457 ]
457 ]
458
458
459 # Code contributed by Alex Schmolck, for ipython/emacs integration
460 def all_completions(self, text):
459 def all_completions(self, text):
461 """Return all possible completions for the benefit of emacs."""
460 """
462
461 Wrapper around the complete method for the benefit of emacs
463 completions = []
462 and pydb.
464 comp_append = completions.append
463 """
465 try:
464 return self.complete(text)[1]
466 for i in xrange(sys.maxint):
467 res = self.complete(text, i, text)
468 if not res:
469 break
470 comp_append(res)
471 #XXX workaround for ``notDefined.<tab>``
472 except NameError:
473 pass
474 return completions
475 # /end Alex Schmolck code.
476
465
477 def _clean_glob(self,text):
466 def _clean_glob(self,text):
478 return self.glob("%s*" % text)
467 return self.glob("%s*" % text)
479
468
480 def _clean_glob_win32(self,text):
469 def _clean_glob_win32(self,text):
481 return [f.replace("\\","/")
470 return [f.replace("\\","/")
482 for f in self.glob("%s*" % text)]
471 for f in self.glob("%s*" % text)]
483
472
484 def file_matches(self, text):
473 def file_matches(self, text):
485 """Match filenames, expanding ~USER type strings.
474 """Match filenames, expanding ~USER type strings.
486
475
487 Most of the seemingly convoluted logic in this completer is an
476 Most of the seemingly convoluted logic in this completer is an
488 attempt to handle filenames with spaces in them. And yet it's not
477 attempt to handle filenames with spaces in them. And yet it's not
489 quite perfect, because Python's readline doesn't expose all of the
478 quite perfect, because Python's readline doesn't expose all of the
490 GNU readline details needed for this to be done correctly.
479 GNU readline details needed for this to be done correctly.
491
480
492 For a filename with a space in it, the printed completions will be
481 For a filename with a space in it, the printed completions will be
493 only the parts after what's already been typed (instead of the
482 only the parts after what's already been typed (instead of the
494 full completions, as is normally done). I don't think with the
483 full completions, as is normally done). I don't think with the
495 current (as of Python 2.3) Python readline it's possible to do
484 current (as of Python 2.3) Python readline it's possible to do
496 better."""
485 better."""
497
486
498 #io.rprint('Completer->file_matches: <%r>' % text) # dbg
487 #io.rprint('Completer->file_matches: <%r>' % text) # dbg
499
488
500 # chars that require escaping with backslash - i.e. chars
489 # chars that require escaping with backslash - i.e. chars
501 # that readline treats incorrectly as delimiters, but we
490 # that readline treats incorrectly as delimiters, but we
502 # don't want to treat as delimiters in filename matching
491 # don't want to treat as delimiters in filename matching
503 # when escaped with backslash
492 # when escaped with backslash
504 if text.startswith('!'):
493 if text.startswith('!'):
505 text = text[1:]
494 text = text[1:]
506 text_prefix = '!'
495 text_prefix = '!'
507 else:
496 else:
508 text_prefix = ''
497 text_prefix = ''
509
498
510 text_until_cursor = self.text_until_cursor
499 text_until_cursor = self.text_until_cursor
511 # track strings with open quotes
500 # track strings with open quotes
512 open_quotes = has_open_quotes(text_until_cursor)
501 open_quotes = has_open_quotes(text_until_cursor)
513
502
514 if '(' in text_until_cursor or '[' in text_until_cursor:
503 if '(' in text_until_cursor or '[' in text_until_cursor:
515 lsplit = text
504 lsplit = text
516 else:
505 else:
517 try:
506 try:
518 # arg_split ~ shlex.split, but with unicode bugs fixed by us
507 # arg_split ~ shlex.split, but with unicode bugs fixed by us
519 lsplit = arg_split(text_until_cursor)[-1]
508 lsplit = arg_split(text_until_cursor)[-1]
520 except ValueError:
509 except ValueError:
521 # typically an unmatched ", or backslash without escaped char.
510 # typically an unmatched ", or backslash without escaped char.
522 if open_quotes:
511 if open_quotes:
523 lsplit = text_until_cursor.split(open_quotes)[-1]
512 lsplit = text_until_cursor.split(open_quotes)[-1]
524 else:
513 else:
525 return []
514 return []
526 except IndexError:
515 except IndexError:
527 # tab pressed on empty line
516 # tab pressed on empty line
528 lsplit = ""
517 lsplit = ""
529
518
530 if not open_quotes and lsplit != protect_filename(lsplit):
519 if not open_quotes and lsplit != protect_filename(lsplit):
531 # if protectables are found, do matching on the whole escaped name
520 # if protectables are found, do matching on the whole escaped name
532 has_protectables = True
521 has_protectables = True
533 text0,text = text,lsplit
522 text0,text = text,lsplit
534 else:
523 else:
535 has_protectables = False
524 has_protectables = False
536 text = os.path.expanduser(text)
525 text = os.path.expanduser(text)
537
526
538 if text == "":
527 if text == "":
539 return [text_prefix + protect_filename(f) for f in self.glob("*")]
528 return [text_prefix + protect_filename(f) for f in self.glob("*")]
540
529
541 # Compute the matches from the filesystem
530 # Compute the matches from the filesystem
542 m0 = self.clean_glob(text.replace('\\',''))
531 m0 = self.clean_glob(text.replace('\\',''))
543
532
544 if has_protectables:
533 if has_protectables:
545 # If we had protectables, we need to revert our changes to the
534 # If we had protectables, we need to revert our changes to the
546 # beginning of filename so that we don't double-write the part
535 # beginning of filename so that we don't double-write the part
547 # of the filename we have so far
536 # of the filename we have so far
548 len_lsplit = len(lsplit)
537 len_lsplit = len(lsplit)
549 matches = [text_prefix + text0 +
538 matches = [text_prefix + text0 +
550 protect_filename(f[len_lsplit:]) for f in m0]
539 protect_filename(f[len_lsplit:]) for f in m0]
551 else:
540 else:
552 if open_quotes:
541 if open_quotes:
553 # if we have a string with an open quote, we don't need to
542 # if we have a string with an open quote, we don't need to
554 # protect the names at all (and we _shouldn't_, as it
543 # protect the names at all (and we _shouldn't_, as it
555 # would cause bugs when the filesystem call is made).
544 # would cause bugs when the filesystem call is made).
556 matches = m0
545 matches = m0
557 else:
546 else:
558 matches = [text_prefix +
547 matches = [text_prefix +
559 protect_filename(f) for f in m0]
548 protect_filename(f) for f in m0]
560
549
561 #io.rprint('mm', matches) # dbg
550 #io.rprint('mm', matches) # dbg
562 return mark_dirs(matches)
551 return mark_dirs(matches)
563
552
564 def magic_matches(self, text):
553 def magic_matches(self, text):
565 """Match magics"""
554 """Match magics"""
566 #print 'Completer->magic_matches:',text,'lb',self.text_until_cursor # dbg
555 #print 'Completer->magic_matches:',text,'lb',self.text_until_cursor # dbg
567 # Get all shell magics now rather than statically, so magics loaded at
556 # Get all shell magics now rather than statically, so magics loaded at
568 # runtime show up too
557 # runtime show up too
569 magics = self.shell.lsmagic()
558 magics = self.shell.lsmagic()
570 pre = self.magic_escape
559 pre = self.magic_escape
571 baretext = text.lstrip(pre)
560 baretext = text.lstrip(pre)
572 return [ pre+m for m in magics if m.startswith(baretext)]
561 return [ pre+m for m in magics if m.startswith(baretext)]
573
562
574 def alias_matches(self, text):
563 def alias_matches(self, text):
575 """Match internal system aliases"""
564 """Match internal system aliases"""
576 #print 'Completer->alias_matches:',text,'lb',self.text_until_cursor # dbg
565 #print 'Completer->alias_matches:',text,'lb',self.text_until_cursor # dbg
577
566
578 # if we are not in the first 'item', alias matching
567 # if we are not in the first 'item', alias matching
579 # doesn't make sense - unless we are starting with 'sudo' command.
568 # doesn't make sense - unless we are starting with 'sudo' command.
580 main_text = self.text_until_cursor.lstrip()
569 main_text = self.text_until_cursor.lstrip()
581 if ' ' in main_text and not main_text.startswith('sudo'):
570 if ' ' in main_text and not main_text.startswith('sudo'):
582 return []
571 return []
583 text = os.path.expanduser(text)
572 text = os.path.expanduser(text)
584 aliases = self.alias_table.keys()
573 aliases = self.alias_table.keys()
585 if text == '':
574 if text == '':
586 return aliases
575 return aliases
587 else:
576 else:
588 return [a for a in aliases if a.startswith(text)]
577 return [a for a in aliases if a.startswith(text)]
589
578
590 def python_matches(self,text):
579 def python_matches(self,text):
591 """Match attributes or global python names"""
580 """Match attributes or global python names"""
592
581
593 #print 'Completer->python_matches, txt=%r' % text # dbg
582 #print 'Completer->python_matches, txt=%r' % text # dbg
594 if "." in text:
583 if "." in text:
595 try:
584 try:
596 matches = self.attr_matches(text)
585 matches = self.attr_matches(text)
597 if text.endswith('.') and self.omit__names:
586 if text.endswith('.') and self.omit__names:
598 if self.omit__names == 1:
587 if self.omit__names == 1:
599 # true if txt is _not_ a __ name, false otherwise:
588 # true if txt is _not_ a __ name, false otherwise:
600 no__name = (lambda txt:
589 no__name = (lambda txt:
601 re.match(r'.*\.__.*?__',txt) is None)
590 re.match(r'.*\.__.*?__',txt) is None)
602 else:
591 else:
603 # true if txt is _not_ a _ name, false otherwise:
592 # true if txt is _not_ a _ name, false otherwise:
604 no__name = (lambda txt:
593 no__name = (lambda txt:
605 re.match(r'.*\._.*?',txt) is None)
594 re.match(r'.*\._.*?',txt) is None)
606 matches = filter(no__name, matches)
595 matches = filter(no__name, matches)
607 except NameError:
596 except NameError:
608 # catches <undefined attributes>.<tab>
597 # catches <undefined attributes>.<tab>
609 matches = []
598 matches = []
610 else:
599 else:
611 matches = self.global_matches(text)
600 matches = self.global_matches(text)
612
601
613 return matches
602 return matches
614
603
615 def _default_arguments(self, obj):
604 def _default_arguments(self, obj):
616 """Return the list of default arguments of obj if it is callable,
605 """Return the list of default arguments of obj if it is callable,
617 or empty list otherwise."""
606 or empty list otherwise."""
618
607
619 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
608 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
620 # for classes, check for __init__,__new__
609 # for classes, check for __init__,__new__
621 if inspect.isclass(obj):
610 if inspect.isclass(obj):
622 obj = (getattr(obj,'__init__',None) or
611 obj = (getattr(obj,'__init__',None) or
623 getattr(obj,'__new__',None))
612 getattr(obj,'__new__',None))
624 # for all others, check if they are __call__able
613 # for all others, check if they are __call__able
625 elif hasattr(obj, '__call__'):
614 elif hasattr(obj, '__call__'):
626 obj = obj.__call__
615 obj = obj.__call__
627 # XXX: is there a way to handle the builtins ?
616 # XXX: is there a way to handle the builtins ?
628 try:
617 try:
629 args,_,_1,defaults = inspect.getargspec(obj)
618 args,_,_1,defaults = inspect.getargspec(obj)
630 if defaults:
619 if defaults:
631 return args[-len(defaults):]
620 return args[-len(defaults):]
632 except TypeError: pass
621 except TypeError: pass
633 return []
622 return []
634
623
635 def python_func_kw_matches(self,text):
624 def python_func_kw_matches(self,text):
636 """Match named parameters (kwargs) of the last open function"""
625 """Match named parameters (kwargs) of the last open function"""
637
626
638 if "." in text: # a parameter cannot be dotted
627 if "." in text: # a parameter cannot be dotted
639 return []
628 return []
640 try: regexp = self.__funcParamsRegex
629 try: regexp = self.__funcParamsRegex
641 except AttributeError:
630 except AttributeError:
642 regexp = self.__funcParamsRegex = re.compile(r'''
631 regexp = self.__funcParamsRegex = re.compile(r'''
643 '.*?' | # single quoted strings or
632 '.*?' | # single quoted strings or
644 ".*?" | # double quoted strings or
633 ".*?" | # double quoted strings or
645 \w+ | # identifier
634 \w+ | # identifier
646 \S # other characters
635 \S # other characters
647 ''', re.VERBOSE | re.DOTALL)
636 ''', re.VERBOSE | re.DOTALL)
648 # 1. find the nearest identifier that comes before an unclosed
637 # 1. find the nearest identifier that comes before an unclosed
649 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
638 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
650 tokens = regexp.findall(self.line_buffer)
639 tokens = regexp.findall(self.line_buffer)
651 tokens.reverse()
640 tokens.reverse()
652 iterTokens = iter(tokens); openPar = 0
641 iterTokens = iter(tokens); openPar = 0
653 for token in iterTokens:
642 for token in iterTokens:
654 if token == ')':
643 if token == ')':
655 openPar -= 1
644 openPar -= 1
656 elif token == '(':
645 elif token == '(':
657 openPar += 1
646 openPar += 1
658 if openPar > 0:
647 if openPar > 0:
659 # found the last unclosed parenthesis
648 # found the last unclosed parenthesis
660 break
649 break
661 else:
650 else:
662 return []
651 return []
663 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
652 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
664 ids = []
653 ids = []
665 isId = re.compile(r'\w+$').match
654 isId = re.compile(r'\w+$').match
666 while True:
655 while True:
667 try:
656 try:
668 ids.append(iterTokens.next())
657 ids.append(iterTokens.next())
669 if not isId(ids[-1]):
658 if not isId(ids[-1]):
670 ids.pop(); break
659 ids.pop(); break
671 if not iterTokens.next() == '.':
660 if not iterTokens.next() == '.':
672 break
661 break
673 except StopIteration:
662 except StopIteration:
674 break
663 break
675 # lookup the candidate callable matches either using global_matches
664 # lookup the candidate callable matches either using global_matches
676 # or attr_matches for dotted names
665 # or attr_matches for dotted names
677 if len(ids) == 1:
666 if len(ids) == 1:
678 callableMatches = self.global_matches(ids[0])
667 callableMatches = self.global_matches(ids[0])
679 else:
668 else:
680 callableMatches = self.attr_matches('.'.join(ids[::-1]))
669 callableMatches = self.attr_matches('.'.join(ids[::-1]))
681 argMatches = []
670 argMatches = []
682 for callableMatch in callableMatches:
671 for callableMatch in callableMatches:
683 try:
672 try:
684 namedArgs = self._default_arguments(eval(callableMatch,
673 namedArgs = self._default_arguments(eval(callableMatch,
685 self.namespace))
674 self.namespace))
686 except:
675 except:
687 continue
676 continue
688 for namedArg in namedArgs:
677 for namedArg in namedArgs:
689 if namedArg.startswith(text):
678 if namedArg.startswith(text):
690 argMatches.append("%s=" %namedArg)
679 argMatches.append("%s=" %namedArg)
691 return argMatches
680 return argMatches
692
681
693 def dispatch_custom_completer(self, text):
682 def dispatch_custom_completer(self, text):
694 #print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
683 #print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
695 line = self.line_buffer
684 line = self.line_buffer
696 if not line.strip():
685 if not line.strip():
697 return None
686 return None
698
687
699 # Create a little structure to pass all the relevant information about
688 # Create a little structure to pass all the relevant information about
700 # the current completion to any custom completer.
689 # the current completion to any custom completer.
701 event = Bunch()
690 event = Bunch()
702 event.line = line
691 event.line = line
703 event.symbol = text
692 event.symbol = text
704 cmd = line.split(None,1)[0]
693 cmd = line.split(None,1)[0]
705 event.command = cmd
694 event.command = cmd
706 event.text_until_cursor = self.text_until_cursor
695 event.text_until_cursor = self.text_until_cursor
707
696
708 #print "\ncustom:{%s]\n" % event # dbg
697 #print "\ncustom:{%s]\n" % event # dbg
709
698
710 # for foo etc, try also to find completer for %foo
699 # for foo etc, try also to find completer for %foo
711 if not cmd.startswith(self.magic_escape):
700 if not cmd.startswith(self.magic_escape):
712 try_magic = self.custom_completers.s_matches(
701 try_magic = self.custom_completers.s_matches(
713 self.magic_escape + cmd)
702 self.magic_escape + cmd)
714 else:
703 else:
715 try_magic = []
704 try_magic = []
716
705
717 for c in itertools.chain(self.custom_completers.s_matches(cmd),
706 for c in itertools.chain(self.custom_completers.s_matches(cmd),
718 try_magic,
707 try_magic,
719 self.custom_completers.flat_matches(self.text_until_cursor)):
708 self.custom_completers.flat_matches(self.text_until_cursor)):
720 #print "try",c # dbg
709 #print "try",c # dbg
721 try:
710 try:
722 res = c(event)
711 res = c(event)
723 if res:
712 if res:
724 # first, try case sensitive match
713 # first, try case sensitive match
725 withcase = [r for r in res if r.startswith(text)]
714 withcase = [r for r in res if r.startswith(text)]
726 if withcase:
715 if withcase:
727 return withcase
716 return withcase
728 # if none, then case insensitive ones are ok too
717 # if none, then case insensitive ones are ok too
729 text_low = text.lower()
718 text_low = text.lower()
730 return [r for r in res if r.lower().startswith(text_low)]
719 return [r for r in res if r.lower().startswith(text_low)]
731 except TryNext:
720 except TryNext:
732 pass
721 pass
733
722
734 return None
723 return None
735
724
736 def complete(self, text=None, line_buffer=None, cursor_pos=None):
725 def complete(self, text=None, line_buffer=None, cursor_pos=None):
737 """Find completions for the given text and line context.
726 """Find completions for the given text and line context.
738
727
739 This is called successively with state == 0, 1, 2, ... until it
728 This is called successively with state == 0, 1, 2, ... until it
740 returns None. The completion should begin with 'text'.
729 returns None. The completion should begin with 'text'.
741
730
742 Note that both the text and the line_buffer are optional, but at least
731 Note that both the text and the line_buffer are optional, but at least
743 one of them must be given.
732 one of them must be given.
744
733
745 Parameters
734 Parameters
746 ----------
735 ----------
747 text : string, optional
736 text : string, optional
748 Text to perform the completion on. If not given, the line buffer
737 Text to perform the completion on. If not given, the line buffer
749 is split using the instance's CompletionSplitter object.
738 is split using the instance's CompletionSplitter object.
750
739
751 line_buffer : string, optional
740 line_buffer : string, optional
752 If not given, the completer attempts to obtain the current line
741 If not given, the completer attempts to obtain the current line
753 buffer via readline. This keyword allows clients which are
742 buffer via readline. This keyword allows clients which are
754 requesting for text completions in non-readline contexts to inform
743 requesting for text completions in non-readline contexts to inform
755 the completer of the entire text.
744 the completer of the entire text.
756
745
757 cursor_pos : int, optional
746 cursor_pos : int, optional
758 Index of the cursor in the full line buffer. Should be provided by
747 Index of the cursor in the full line buffer. Should be provided by
759 remote frontends where kernel has no access to frontend state.
748 remote frontends where kernel has no access to frontend state.
760
749
761 Returns
750 Returns
762 -------
751 -------
763 text : str
752 text : str
764 Text that was actually used in the completion.
753 Text that was actually used in the completion.
765
754
766 matches : list
755 matches : list
767 A list of completion matches.
756 A list of completion matches.
768 """
757 """
769 #io.rprint('\nCOMP1 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
758 #io.rprint('\nCOMP1 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
770
759
771 # if the cursor position isn't given, the only sane assumption we can
760 # if the cursor position isn't given, the only sane assumption we can
772 # make is that it's at the end of the line (the common case)
761 # make is that it's at the end of the line (the common case)
773 if cursor_pos is None:
762 if cursor_pos is None:
774 cursor_pos = len(line_buffer) if text is None else len(text)
763 cursor_pos = len(line_buffer) if text is None else len(text)
775
764
776 # if text is either None or an empty string, rely on the line buffer
765 # if text is either None or an empty string, rely on the line buffer
777 if not text:
766 if not text:
778 text = self.splitter.split_line(line_buffer, cursor_pos)
767 text = self.splitter.split_line(line_buffer, cursor_pos)
779
768
780 # If no line buffer is given, assume the input text is all there was
769 # If no line buffer is given, assume the input text is all there was
781 if line_buffer is None:
770 if line_buffer is None:
782 line_buffer = text
771 line_buffer = text
783
772
784 self.line_buffer = line_buffer
773 self.line_buffer = line_buffer
785 self.text_until_cursor = self.line_buffer[:cursor_pos]
774 self.text_until_cursor = self.line_buffer[:cursor_pos]
786 #io.rprint('\nCOMP2 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
775 #io.rprint('\nCOMP2 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
787
776
788 # Start with a clean slate of completions
777 # Start with a clean slate of completions
789 self.matches[:] = []
778 self.matches[:] = []
790 custom_res = self.dispatch_custom_completer(text)
779 custom_res = self.dispatch_custom_completer(text)
791 if custom_res is not None:
780 if custom_res is not None:
792 # did custom completers produce something?
781 # did custom completers produce something?
793 self.matches = custom_res
782 self.matches = custom_res
794 else:
783 else:
795 # Extend the list of completions with the results of each
784 # Extend the list of completions with the results of each
796 # matcher, so we return results to the user from all
785 # matcher, so we return results to the user from all
797 # namespaces.
786 # namespaces.
798 if self.merge_completions:
787 if self.merge_completions:
799 self.matches = []
788 self.matches = []
800 for matcher in self.matchers:
789 for matcher in self.matchers:
801 try:
790 try:
802 self.matches.extend(matcher(text))
791 self.matches.extend(matcher(text))
803 except:
792 except:
804 # Show the ugly traceback if the matcher causes an
793 # Show the ugly traceback if the matcher causes an
805 # exception, but do NOT crash the kernel!
794 # exception, but do NOT crash the kernel!
806 sys.excepthook(*sys.exc_info())
795 sys.excepthook(*sys.exc_info())
807 else:
796 else:
808 for matcher in self.matchers:
797 for matcher in self.matchers:
809 self.matches = matcher(text)
798 self.matches = matcher(text)
810 if self.matches:
799 if self.matches:
811 break
800 break
812 # FIXME: we should extend our api to return a dict with completions for
801 # FIXME: we should extend our api to return a dict with completions for
813 # different types of objects. The rlcomplete() method could then
802 # different types of objects. The rlcomplete() method could then
814 # simply collapse the dict into a list for readline, but we'd have
803 # simply collapse the dict into a list for readline, but we'd have
815 # richer completion semantics in other evironments.
804 # richer completion semantics in other evironments.
816 self.matches = sorted(set(self.matches))
805 self.matches = sorted(set(self.matches))
817 #io.rprint('COMP TEXT, MATCHES: %r, %r' % (text, self.matches)) # dbg
806 #io.rprint('COMP TEXT, MATCHES: %r, %r' % (text, self.matches)) # dbg
818 return text, self.matches
807 return text, self.matches
819
808
820 def rlcomplete(self, text, state):
809 def rlcomplete(self, text, state):
821 """Return the state-th possible completion for 'text'.
810 """Return the state-th possible completion for 'text'.
822
811
823 This is called successively with state == 0, 1, 2, ... until it
812 This is called successively with state == 0, 1, 2, ... until it
824 returns None. The completion should begin with 'text'.
813 returns None. The completion should begin with 'text'.
825
814
826 Parameters
815 Parameters
827 ----------
816 ----------
828 text : string
817 text : string
829 Text to perform the completion on.
818 Text to perform the completion on.
830
819
831 state : int
820 state : int
832 Counter used by readline.
821 Counter used by readline.
833 """
822 """
834 if state==0:
823 if state==0:
835
824
836 self.line_buffer = line_buffer = self.readline.get_line_buffer()
825 self.line_buffer = line_buffer = self.readline.get_line_buffer()
837 cursor_pos = self.readline.get_endidx()
826 cursor_pos = self.readline.get_endidx()
838
827
839 #io.rprint("\nRLCOMPLETE: %r %r %r" %
828 #io.rprint("\nRLCOMPLETE: %r %r %r" %
840 # (text, line_buffer, cursor_pos) ) # dbg
829 # (text, line_buffer, cursor_pos) ) # dbg
841
830
842 # if there is only a tab on a line with only whitespace, instead of
831 # if there is only a tab on a line with only whitespace, instead of
843 # the mostly useless 'do you want to see all million completions'
832 # the mostly useless 'do you want to see all million completions'
844 # message, just do the right thing and give the user his tab!
833 # message, just do the right thing and give the user his tab!
845 # Incidentally, this enables pasting of tabbed text from an editor
834 # Incidentally, this enables pasting of tabbed text from an editor
846 # (as long as autoindent is off).
835 # (as long as autoindent is off).
847
836
848 # It should be noted that at least pyreadline still shows file
837 # It should be noted that at least pyreadline still shows file
849 # completions - is there a way around it?
838 # completions - is there a way around it?
850
839
851 # don't apply this on 'dumb' terminals, such as emacs buffers, so
840 # don't apply this on 'dumb' terminals, such as emacs buffers, so
852 # we don't interfere with their own tab-completion mechanism.
841 # we don't interfere with their own tab-completion mechanism.
853 if not (self.dumb_terminal or line_buffer.strip()):
842 if not (self.dumb_terminal or line_buffer.strip()):
854 self.readline.insert_text('\t')
843 self.readline.insert_text('\t')
855 sys.stdout.flush()
844 sys.stdout.flush()
856 return None
845 return None
857
846
858 # Note: debugging exceptions that may occur in completion is very
847 # Note: debugging exceptions that may occur in completion is very
859 # tricky, because readline unconditionally silences them. So if
848 # tricky, because readline unconditionally silences them. So if
860 # during development you suspect a bug in the completion code, turn
849 # during development you suspect a bug in the completion code, turn
861 # this flag on temporarily by uncommenting the second form (don't
850 # this flag on temporarily by uncommenting the second form (don't
862 # flip the value in the first line, as the '# dbg' marker can be
851 # flip the value in the first line, as the '# dbg' marker can be
863 # automatically detected and is used elsewhere).
852 # automatically detected and is used elsewhere).
864 DEBUG = False
853 DEBUG = False
865 #DEBUG = True # dbg
854 #DEBUG = True # dbg
866 if DEBUG:
855 if DEBUG:
867 try:
856 try:
868 self.complete(text, line_buffer, cursor_pos)
857 self.complete(text, line_buffer, cursor_pos)
869 except:
858 except:
870 import traceback; traceback.print_exc()
859 import traceback; traceback.print_exc()
871 else:
860 else:
872 # The normal production version is here
861 # The normal production version is here
873
862
874 # This method computes the self.matches array
863 # This method computes the self.matches array
875 self.complete(text, line_buffer, cursor_pos)
864 self.complete(text, line_buffer, cursor_pos)
876
865
877 try:
866 try:
878 return self.matches[state]
867 return self.matches[state]
879 except IndexError:
868 except IndexError:
880 return None
869 return None
General Comments 0
You need to be logged in to leave comments. Login now