##// END OF EJS Templates
Oops, need to exit custom completer on empty lbuf, not empty symbol
vivainio -
Show More
@@ -1,614 +1,616 b''
1 1 """Word completion for IPython.
2 2
3 3 This module is a fork of the rlcompleter module in the Python standard
4 4 library. The original enhancements made to rlcompleter have been sent
5 5 upstream and were accepted as of Python 2.3, but we need a lot more
6 6 functionality specific to IPython, so this module will continue to live as an
7 7 IPython-specific utility.
8 8
9 9 ---------------------------------------------------------------------------
10 10 Original rlcompleter documentation:
11 11
12 12 This requires the latest extension to the readline module (the
13 13 completes keywords, built-ins and globals in __main__; when completing
14 14 NAME.NAME..., it evaluates (!) the expression up to the last dot and
15 15 completes its attributes.
16 16
17 17 It's very cool to do "import string" type "string.", hit the
18 18 completion key (twice), and see the list of names defined by the
19 19 string module!
20 20
21 21 Tip: to use the tab key as the completion key, call
22 22
23 23 readline.parse_and_bind("tab: complete")
24 24
25 25 Notes:
26 26
27 27 - Exceptions raised by the completer function are *ignored* (and
28 28 generally cause the completion to fail). This is a feature -- since
29 29 readline sets the tty device in raw (or cbreak) mode, printing a
30 30 traceback wouldn't work well without some complicated hoopla to save,
31 31 reset and restore the tty state.
32 32
33 33 - The evaluation of the NAME.NAME... form may cause arbitrary
34 34 application defined code to be executed if an object with a
35 35 __getattr__ hook is found. Since it is the responsibility of the
36 36 application (or the user) to enable this feature, I consider this an
37 37 acceptable risk. More complicated expressions (e.g. function calls or
38 38 indexing operations) are *not* evaluated.
39 39
40 40 - GNU readline is also used by the built-in functions input() and
41 41 raw_input(), and thus these also benefit/suffer from the completer
42 42 features. Clearly an interactive application can benefit by
43 43 specifying its own completer function and using raw_input() for all
44 44 its input.
45 45
46 46 - When the original stdin is not a tty device, GNU readline is never
47 47 used, and this module (and the readline module) are silently inactive.
48 48
49 49 """
50 50
51 51 #*****************************************************************************
52 52 #
53 53 # Since this file is essentially a minimally modified copy of the rlcompleter
54 54 # module which is part of the standard Python distribution, I assume that the
55 55 # proper procedure is to maintain its copyright as belonging to the Python
56 56 # Software Foundation (in addition to my own, for all new code).
57 57 #
58 58 # Copyright (C) 2001 Python Software Foundation, www.python.org
59 59 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
60 60 #
61 61 # Distributed under the terms of the BSD License. The full license is in
62 62 # the file COPYING, distributed as part of this software.
63 63 #
64 64 #*****************************************************************************
65 65
66 66 import __builtin__
67 67 import __main__
68 68 import glob
69 69 import keyword
70 70 import os
71 71 import re
72 72 import shlex
73 73 import sys
74 74 import IPython.rlineimpl as readline
75 75 import itertools
76 76 from IPython.ipstruct import Struct
77 77 from IPython import ipapi
78 78
79 79 import types
80 80
81 81 # Python 2.4 offers sets as a builtin
82 82 try:
83 83 set([1,2])
84 84 except NameError:
85 85 from sets import Set as set
86 86
87 87 from IPython.genutils import debugx
88 88
89 89 __all__ = ['Completer','IPCompleter']
90 90
91 91 def get_class_members(cls):
92 92 ret = dir(cls)
93 93 if hasattr(cls,'__bases__'):
94 94 for base in cls.__bases__:
95 95 ret.extend(get_class_members(base))
96 96 return ret
97 97
98 98 class Completer:
99 99 def __init__(self,namespace=None,global_namespace=None):
100 100 """Create a new completer for the command line.
101 101
102 102 Completer([namespace,global_namespace]) -> completer instance.
103 103
104 104 If unspecified, the default namespace where completions are performed
105 105 is __main__ (technically, __main__.__dict__). Namespaces should be
106 106 given as dictionaries.
107 107
108 108 An optional second namespace can be given. This allows the completer
109 109 to handle cases where both the local and global scopes need to be
110 110 distinguished.
111 111
112 112 Completer instances should be used as the completion mechanism of
113 113 readline via the set_completer() call:
114 114
115 115 readline.set_completer(Completer(my_namespace).complete)
116 116 """
117 117
118 118 # some minimal strict typechecks. For some core data structures, I
119 119 # want actual basic python types, not just anything that looks like
120 120 # one. This is especially true for namespaces.
121 121 for ns in (namespace,global_namespace):
122 122 if ns is not None and type(ns) != types.DictType:
123 123 raise TypeError,'namespace must be a dictionary'
124 124
125 125 # Don't bind to namespace quite yet, but flag whether the user wants a
126 126 # specific namespace or to use __main__.__dict__. This will allow us
127 127 # to bind to __main__.__dict__ at completion time, not now.
128 128 if namespace is None:
129 129 self.use_main_ns = 1
130 130 else:
131 131 self.use_main_ns = 0
132 132 self.namespace = namespace
133 133
134 134 # The global namespace, if given, can be bound directly
135 135 if global_namespace is None:
136 136 self.global_namespace = {}
137 137 else:
138 138 self.global_namespace = global_namespace
139 139
140 140 def complete(self, text, state):
141 141 """Return the next possible completion for 'text'.
142 142
143 143 This is called successively with state == 0, 1, 2, ... until it
144 144 returns None. The completion should begin with 'text'.
145 145
146 146 """
147 147 if self.use_main_ns:
148 148 self.namespace = __main__.__dict__
149 149
150 150 if state == 0:
151 151 if "." in text:
152 152 self.matches = self.attr_matches(text)
153 153 else:
154 154 self.matches = self.global_matches(text)
155 155 try:
156 156 return self.matches[state]
157 157 except IndexError:
158 158 return None
159 159
160 160 def global_matches(self, text):
161 161 """Compute matches when text is a simple name.
162 162
163 163 Return a list of all keywords, built-in functions and names currently
164 164 defined in self.namespace or self.global_namespace that match.
165 165
166 166 """
167 167 matches = []
168 168 match_append = matches.append
169 169 n = len(text)
170 170 for lst in [keyword.kwlist,
171 171 __builtin__.__dict__.keys(),
172 172 self.namespace.keys(),
173 173 self.global_namespace.keys()]:
174 174 for word in lst:
175 175 if word[:n] == text and word != "__builtins__":
176 176 match_append(word)
177 177 return matches
178 178
179 179 def attr_matches(self, text):
180 180 """Compute matches when text contains a dot.
181 181
182 182 Assuming the text is of the form NAME.NAME....[NAME], and is
183 183 evaluatable in self.namespace or self.global_namespace, it will be
184 184 evaluated and its attributes (as revealed by dir()) are used as
185 185 possible completions. (For class instances, class members are are
186 186 also considered.)
187 187
188 188 WARNING: this can still invoke arbitrary C code, if an object
189 189 with a __getattr__ hook is evaluated.
190 190
191 191 """
192 192 import re
193 193
194 194 # Another option, seems to work great. Catches things like ''.<tab>
195 195 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
196 196
197 197 if not m:
198 198 return []
199 199
200 200 expr, attr = m.group(1, 3)
201 201 try:
202 202 object = eval(expr, self.namespace)
203 203 except:
204 204 object = eval(expr, self.global_namespace)
205 205
206 206 # Start building the attribute list via dir(), and then complete it
207 207 # with a few extra special-purpose calls.
208 208 words = dir(object)
209 209
210 210 if hasattr(object,'__class__'):
211 211 words.append('__class__')
212 212 words.extend(get_class_members(object.__class__))
213 213
214 214 # this is the 'dir' function for objects with Enthought's traits
215 215 if hasattr(object, 'trait_names'):
216 216 try:
217 217 words.extend(object.trait_names())
218 218 # eliminate possible duplicates, as some traits may also
219 219 # appear as normal attributes in the dir() call.
220 220 words = set(words)
221 221 except TypeError:
222 222 # This will happen if `object` is a class and not an instance.
223 223 pass
224 224
225 225 # Support for PyCrust-style _getAttributeNames magic method.
226 226 if hasattr(object, '_getAttributeNames'):
227 227 try:
228 228 words.extend(object._getAttributeNames())
229 229 # Eliminate duplicates.
230 230 words = set(words)
231 231 except TypeError:
232 232 # `object` is a class and not an instance. Ignore
233 233 # this error.
234 234 pass
235 235
236 236 # filter out non-string attributes which may be stuffed by dir() calls
237 237 # and poor coding in third-party modules
238 238 words = [w for w in words
239 239 if isinstance(w, basestring) and w != "__builtins__"]
240 240 # Build match list to return
241 241 n = len(attr)
242 242 return ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
243 243
244 244 class IPCompleter(Completer):
245 245 """Extension of the completer class with IPython-specific features"""
246 246
247 247 def __init__(self,shell,namespace=None,global_namespace=None,
248 248 omit__names=0,alias_table=None):
249 249 """IPCompleter() -> completer
250 250
251 251 Return a completer object suitable for use by the readline library
252 252 via readline.set_completer().
253 253
254 254 Inputs:
255 255
256 256 - shell: a pointer to the ipython shell itself. This is needed
257 257 because this completer knows about magic functions, and those can
258 258 only be accessed via the ipython instance.
259 259
260 260 - namespace: an optional dict where completions are performed.
261 261
262 262 - global_namespace: secondary optional dict for completions, to
263 263 handle cases (such as IPython embedded inside functions) where
264 264 both Python scopes are visible.
265 265
266 266 - The optional omit__names parameter sets the completer to omit the
267 267 'magic' names (__magicname__) for python objects unless the text
268 268 to be completed explicitly starts with one or more underscores.
269 269
270 270 - If alias_table is supplied, it should be a dictionary of aliases
271 271 to complete. """
272 272
273 273 Completer.__init__(self,namespace,global_namespace)
274 274 self.magic_prefix = shell.name+'.magic_'
275 275 self.magic_escape = shell.ESC_MAGIC
276 276 self.readline = readline
277 277 delims = self.readline.get_completer_delims()
278 278 delims = delims.replace(self.magic_escape,'')
279 279 self.readline.set_completer_delims(delims)
280 280 self.get_line_buffer = self.readline.get_line_buffer
281 281 self.omit__names = omit__names
282 282 self.merge_completions = shell.rc.readline_merge_completions
283 283
284 284 if alias_table is None:
285 285 alias_table = {}
286 286 self.alias_table = alias_table
287 287 # Regexp to split filenames with spaces in them
288 288 self.space_name_re = re.compile(r'([^\\] )')
289 289 # Hold a local ref. to glob.glob for speed
290 290 self.glob = glob.glob
291 291
292 292 # Determine if we are running on 'dumb' terminals, like (X)Emacs
293 293 # buffers, to avoid completion problems.
294 294 term = os.environ.get('TERM','xterm')
295 295 self.dumb_terminal = term in ['dumb','emacs']
296 296
297 297 # Special handling of backslashes needed in win32 platforms
298 298 if sys.platform == "win32":
299 299 self.clean_glob = self._clean_glob_win32
300 300 else:
301 301 self.clean_glob = self._clean_glob
302 302 self.matchers = [self.python_matches,
303 303 self.file_matches,
304 304 self.alias_matches,
305 305 self.python_func_kw_matches]
306 306
307 307 # Code contributed by Alex Schmolck, for ipython/emacs integration
308 308 def all_completions(self, text):
309 309 """Return all possible completions for the benefit of emacs."""
310 310
311 311 completions = []
312 312 comp_append = completions.append
313 313 try:
314 314 for i in xrange(sys.maxint):
315 315 res = self.complete(text, i)
316 316
317 317 if not res: break
318 318
319 319 comp_append(res)
320 320 #XXX workaround for ``notDefined.<tab>``
321 321 except NameError:
322 322 pass
323 323 return completions
324 324 # /end Alex Schmolck code.
325 325
326 326 def _clean_glob(self,text):
327 327 return self.glob("%s*" % text)
328 328
329 329 def _clean_glob_win32(self,text):
330 330 return [f.replace("\\","/")
331 331 for f in self.glob("%s*" % text)]
332 332
333 333 def file_matches(self, text):
334 334 """Match filneames, expanding ~USER type strings.
335 335
336 336 Most of the seemingly convoluted logic in this completer is an
337 337 attempt to handle filenames with spaces in them. And yet it's not
338 338 quite perfect, because Python's readline doesn't expose all of the
339 339 GNU readline details needed for this to be done correctly.
340 340
341 341 For a filename with a space in it, the printed completions will be
342 342 only the parts after what's already been typed (instead of the
343 343 full completions, as is normally done). I don't think with the
344 344 current (as of Python 2.3) Python readline it's possible to do
345 345 better."""
346 346
347 347 # print 'Completer->file_matches: <%s>' % text # dbg
348 348
349 349 # chars that require escaping with backslash - i.e. chars
350 350 # that readline treats incorrectly as delimiters, but we
351 351 # don't want to treat as delimiters in filename matching
352 352 # when escaped with backslash
353 353
354 354 protectables = ' ()[]{}'
355 355
356 356 def protect_filename(s):
357 357 return "".join([(ch in protectables and '\\' + ch or ch)
358 358 for ch in s])
359 359
360 360 lbuf = self.lbuf
361 361 open_quotes = 0 # track strings with open quotes
362 362 try:
363 363 lsplit = shlex.split(lbuf)[-1]
364 364 except ValueError:
365 365 # typically an unmatched ", or backslash without escaped char.
366 366 if lbuf.count('"')==1:
367 367 open_quotes = 1
368 368 lsplit = lbuf.split('"')[-1]
369 369 elif lbuf.count("'")==1:
370 370 open_quotes = 1
371 371 lsplit = lbuf.split("'")[-1]
372 372 else:
373 373 return None
374 374 except IndexError:
375 375 # tab pressed on empty line
376 376 lsplit = ""
377 377
378 378 if lsplit != protect_filename(lsplit):
379 379 # if protectables are found, do matching on the whole escaped
380 380 # name
381 381 has_protectables = 1
382 382 text0,text = text,lsplit
383 383 else:
384 384 has_protectables = 0
385 385 text = os.path.expanduser(text)
386 386
387 387 if text == "":
388 388 return [protect_filename(f) for f in self.glob("*")]
389 389
390 390 m0 = self.clean_glob(text.replace('\\',''))
391 391 if has_protectables:
392 392 # If we had protectables, we need to revert our changes to the
393 393 # beginning of filename so that we don't double-write the part
394 394 # of the filename we have so far
395 395 len_lsplit = len(lsplit)
396 396 matches = [text0 + protect_filename(f[len_lsplit:]) for f in m0]
397 397 else:
398 398 if open_quotes:
399 399 # if we have a string with an open quote, we don't need to
400 400 # protect the names at all (and we _shouldn't_, as it
401 401 # would cause bugs when the filesystem call is made).
402 402 matches = m0
403 403 else:
404 404 matches = [protect_filename(f) for f in m0]
405 405 if len(matches) == 1 and os.path.isdir(matches[0]):
406 406 # Takes care of links to directories also. Use '/'
407 407 # explicitly, even under Windows, so that name completions
408 408 # don't end up escaped.
409 409 matches[0] += '/'
410 410 return matches
411 411
412 412 def alias_matches(self, text):
413 413 """Match internal system aliases"""
414 414 #print 'Completer->alias_matches:',text,'lb',self.lbuf # dbg
415 415
416 416 # if we are not in the first 'item', alias matching
417 417 # doesn't make sense
418 418 if ' ' in self.lbuf:
419 419 return []
420 420 text = os.path.expanduser(text)
421 421 aliases = self.alias_table.keys()
422 422 if text == "":
423 423 return aliases
424 424 else:
425 425 return [alias for alias in aliases if alias.startswith(text)]
426 426
427 427 def python_matches(self,text):
428 428 """Match attributes or global python names"""
429 429
430 430 #print 'Completer->python_matches, txt=<%s>' % text # dbg
431 431 if "." in text:
432 432 try:
433 433 matches = self.attr_matches(text)
434 434 if text.endswith('.') and self.omit__names:
435 435 if self.omit__names == 1:
436 436 # true if txt is _not_ a __ name, false otherwise:
437 437 no__name = (lambda txt:
438 438 re.match(r'.*\.__.*?__',txt) is None)
439 439 else:
440 440 # true if txt is _not_ a _ name, false otherwise:
441 441 no__name = (lambda txt:
442 442 re.match(r'.*\._.*?',txt) is None)
443 443 matches = filter(no__name, matches)
444 444 except NameError:
445 445 # catches <undefined attributes>.<tab>
446 446 matches = []
447 447 else:
448 448 matches = self.global_matches(text)
449 449 # this is so completion finds magics when automagic is on:
450 450 if (matches == [] and
451 451 not text.startswith(os.sep) and
452 452 not ' ' in self.lbuf):
453 453 matches = self.attr_matches(self.magic_prefix+text)
454 454 return matches
455 455
456 456 def _default_arguments(self, obj):
457 457 """Return the list of default arguments of obj if it is callable,
458 458 or empty list otherwise."""
459 459
460 460 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
461 461 # for classes, check for __init__,__new__
462 462 if inspect.isclass(obj):
463 463 obj = (getattr(obj,'__init__',None) or
464 464 getattr(obj,'__new__',None))
465 465 # for all others, check if they are __call__able
466 466 elif hasattr(obj, '__call__'):
467 467 obj = obj.__call__
468 468 # XXX: is there a way to handle the builtins ?
469 469 try:
470 470 args,_,_1,defaults = inspect.getargspec(obj)
471 471 if defaults:
472 472 return args[-len(defaults):]
473 473 except TypeError: pass
474 474 return []
475 475
476 476 def python_func_kw_matches(self,text):
477 477 """Match named parameters (kwargs) of the last open function"""
478 478
479 479 if "." in text: # a parameter cannot be dotted
480 480 return []
481 481 try: regexp = self.__funcParamsRegex
482 482 except AttributeError:
483 483 regexp = self.__funcParamsRegex = re.compile(r'''
484 484 '.*?' | # single quoted strings or
485 485 ".*?" | # double quoted strings or
486 486 \w+ | # identifier
487 487 \S # other characters
488 488 ''', re.VERBOSE | re.DOTALL)
489 489 # 1. find the nearest identifier that comes before an unclosed
490 490 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
491 491 tokens = regexp.findall(self.get_line_buffer())
492 492 tokens.reverse()
493 493 iterTokens = iter(tokens); openPar = 0
494 494 for token in iterTokens:
495 495 if token == ')':
496 496 openPar -= 1
497 497 elif token == '(':
498 498 openPar += 1
499 499 if openPar > 0:
500 500 # found the last unclosed parenthesis
501 501 break
502 502 else:
503 503 return []
504 504 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
505 505 ids = []
506 506 isId = re.compile(r'\w+$').match
507 507 while True:
508 508 try:
509 509 ids.append(iterTokens.next())
510 510 if not isId(ids[-1]):
511 511 ids.pop(); break
512 512 if not iterTokens.next() == '.':
513 513 break
514 514 except StopIteration:
515 515 break
516 516 # lookup the candidate callable matches either using global_matches
517 517 # or attr_matches for dotted names
518 518 if len(ids) == 1:
519 519 callableMatches = self.global_matches(ids[0])
520 520 else:
521 521 callableMatches = self.attr_matches('.'.join(ids[::-1]))
522 522 argMatches = []
523 523 for callableMatch in callableMatches:
524 524 try: namedArgs = self._default_arguments(eval(callableMatch,
525 525 self.namespace))
526 526 except: continue
527 527 for namedArg in namedArgs:
528 528 if namedArg.startswith(text):
529 529 argMatches.append("%s=" %namedArg)
530 530 return argMatches
531 531
532 532 def dispatch_custom_completer(self,text):
533 533 # print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
534 if not text.strip():
534 line = self.full_lbuf
535 if not line.strip():
535 536 return None
536 line = self.lbuf
537
537 538 event = Struct()
538 539 event.line = line
539 540 event.symbol = text
540 541 cmd = line.split(None,1)[0]
541 542 event.command = cmd
542 543 for c in itertools.chain(
543 544 self.custom_completers.s_matches(cmd),
544 545 self.custom_completers.flat_matches(self.lbuf)):
545 546 # print "try",c # dbg
546 547 try:
547 548 res = c(event)
548 549 return [r for r in res if r.startswith(text)]
549 550 except ipapi.TryNext:
550 551 pass
551 552
552 553 return None
553 554
554 555
555 556
556 557 def complete(self, text, state):
557 558 """Return the next possible completion for 'text'.
558 559
559 560 This is called successively with state == 0, 1, 2, ... until it
560 561 returns None. The completion should begin with 'text'. """
561 562
562 563 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
563 564
564 565 # if there is only a tab on a line with only whitespace, instead
565 566 # of the mostly useless 'do you want to see all million
566 567 # completions' message, just do the right thing and give the user
567 568 # his tab! Incidentally, this enables pasting of tabbed text from
568 569 # an editor (as long as autoindent is off).
569 570
570 571 # don't apply this on 'dumb' terminals, such as emacs buffers, so we
571 572 # don't interfere with their own tab-completion mechanism.
572 self.lbuf = self.get_line_buffer()[:self.readline.get_endidx()]
573 self.full_lbuf = self.get_line_buffer()
574 self.lbuf = self.full_lbuf[:self.readline.get_endidx()]
573 575 if not (self.dumb_terminal or self.get_line_buffer().strip()):
574 576 self.readline.insert_text('\t')
575 577 return None
576 578
577 579
578 580 magic_escape = self.magic_escape
579 581 magic_prefix = self.magic_prefix
580 582
581 583 try:
582 584 if text.startswith(magic_escape):
583 585 text = text.replace(magic_escape,magic_prefix)
584 586 elif text.startswith('~'):
585 587 text = os.path.expanduser(text)
586 588 if state == 0:
587 589 custom_res = self.dispatch_custom_completer(text)
588 590 if custom_res is not None:
589 591 # did custom completers produce something?
590 592 self.matches = custom_res
591 593 else:
592 594 # Extend the list of completions with the results of each
593 595 # matcher, so we return results to the user from all
594 596 # namespaces.
595 597 if self.merge_completions:
596 598 self.matches = []
597 599 for matcher in self.matchers:
598 600 self.matches.extend(matcher(text))
599 601 else:
600 602 for matcher in self.matchers:
601 603 self.matches = matcher(text)
602 604 if self.matches:
603 605 break
604 606
605 607 try:
606 608 return self.matches[state].replace(magic_prefix,magic_escape)
607 609 except IndexError:
608 610 return None
609 611 except:
610 612 from IPython.ultraTB import AutoFormattedTB; # dbg
611 613 tb=AutoFormattedTB('Verbose');tb() #dbg
612 614
613 615 # If completion fails, don't annoy the user.
614 616 return None
General Comments 0
You need to be logged in to leave comments. Login now