##// END OF EJS Templates
Do not show exception w/ file completer when pressing tab after backslash
vivainio -
Show More
@@ -1,644 +1,644 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 try:
205 205 object = eval(expr, self.global_namespace)
206 206 except:
207 207 return []
208 208
209 209
210 210 # Start building the attribute list via dir(), and then complete it
211 211 # with a few extra special-purpose calls.
212 212 words = dir(object)
213 213
214 214 if hasattr(object,'__class__'):
215 215 words.append('__class__')
216 216 words.extend(get_class_members(object.__class__))
217 217
218 218 # this is the 'dir' function for objects with Enthought's traits
219 219 if hasattr(object, 'trait_names'):
220 220 try:
221 221 words.extend(object.trait_names())
222 222 # eliminate possible duplicates, as some traits may also
223 223 # appear as normal attributes in the dir() call.
224 224 words = set(words)
225 225 except TypeError:
226 226 # This will happen if `object` is a class and not an instance.
227 227 pass
228 228
229 229 # Support for PyCrust-style _getAttributeNames magic method.
230 230 if hasattr(object, '_getAttributeNames'):
231 231 try:
232 232 words.extend(object._getAttributeNames())
233 233 # Eliminate duplicates.
234 234 words = set(words)
235 235 except TypeError:
236 236 # `object` is a class and not an instance. Ignore
237 237 # this error.
238 238 pass
239 239
240 240 # filter out non-string attributes which may be stuffed by dir() calls
241 241 # and poor coding in third-party modules
242 242 words = [w for w in words
243 243 if isinstance(w, basestring) and w != "__builtins__"]
244 244 # Build match list to return
245 245 n = len(attr)
246 246 return ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
247 247
248 248 class IPCompleter(Completer):
249 249 """Extension of the completer class with IPython-specific features"""
250 250
251 251 def __init__(self,shell,namespace=None,global_namespace=None,
252 252 omit__names=0,alias_table=None):
253 253 """IPCompleter() -> completer
254 254
255 255 Return a completer object suitable for use by the readline library
256 256 via readline.set_completer().
257 257
258 258 Inputs:
259 259
260 260 - shell: a pointer to the ipython shell itself. This is needed
261 261 because this completer knows about magic functions, and those can
262 262 only be accessed via the ipython instance.
263 263
264 264 - namespace: an optional dict where completions are performed.
265 265
266 266 - global_namespace: secondary optional dict for completions, to
267 267 handle cases (such as IPython embedded inside functions) where
268 268 both Python scopes are visible.
269 269
270 270 - The optional omit__names parameter sets the completer to omit the
271 271 'magic' names (__magicname__) for python objects unless the text
272 272 to be completed explicitly starts with one or more underscores.
273 273
274 274 - If alias_table is supplied, it should be a dictionary of aliases
275 275 to complete. """
276 276
277 277 Completer.__init__(self,namespace,global_namespace)
278 278 self.magic_prefix = shell.name+'.magic_'
279 279 self.magic_escape = shell.ESC_MAGIC
280 280 self.readline = readline
281 281 delims = self.readline.get_completer_delims()
282 282 delims = delims.replace(self.magic_escape,'')
283 283 self.readline.set_completer_delims(delims)
284 284 self.get_line_buffer = self.readline.get_line_buffer
285 285 self.omit__names = omit__names
286 286 self.merge_completions = shell.rc.readline_merge_completions
287 287
288 288 if alias_table is None:
289 289 alias_table = {}
290 290 self.alias_table = alias_table
291 291 # Regexp to split filenames with spaces in them
292 292 self.space_name_re = re.compile(r'([^\\] )')
293 293 # Hold a local ref. to glob.glob for speed
294 294 self.glob = glob.glob
295 295
296 296 # Determine if we are running on 'dumb' terminals, like (X)Emacs
297 297 # buffers, to avoid completion problems.
298 298 term = os.environ.get('TERM','xterm')
299 299 self.dumb_terminal = term in ['dumb','emacs']
300 300
301 301 # Special handling of backslashes needed in win32 platforms
302 302 if sys.platform == "win32":
303 303 self.clean_glob = self._clean_glob_win32
304 304 else:
305 305 self.clean_glob = self._clean_glob
306 306 self.matchers = [self.python_matches,
307 307 self.file_matches,
308 308 self.alias_matches,
309 309 self.python_func_kw_matches]
310 310
311 311 # Code contributed by Alex Schmolck, for ipython/emacs integration
312 312 def all_completions(self, text):
313 313 """Return all possible completions for the benefit of emacs."""
314 314
315 315 completions = []
316 316 comp_append = completions.append
317 317 try:
318 318 for i in xrange(sys.maxint):
319 319 res = self.complete(text, i)
320 320
321 321 if not res: break
322 322
323 323 comp_append(res)
324 324 #XXX workaround for ``notDefined.<tab>``
325 325 except NameError:
326 326 pass
327 327 return completions
328 328 # /end Alex Schmolck code.
329 329
330 330 def _clean_glob(self,text):
331 331 return self.glob("%s*" % text)
332 332
333 333 def _clean_glob_win32(self,text):
334 334 return [f.replace("\\","/")
335 335 for f in self.glob("%s*" % text)]
336 336
337 337 def file_matches(self, text):
338 338 """Match filenames, expanding ~USER type strings.
339 339
340 340 Most of the seemingly convoluted logic in this completer is an
341 341 attempt to handle filenames with spaces in them. And yet it's not
342 342 quite perfect, because Python's readline doesn't expose all of the
343 343 GNU readline details needed for this to be done correctly.
344 344
345 345 For a filename with a space in it, the printed completions will be
346 346 only the parts after what's already been typed (instead of the
347 347 full completions, as is normally done). I don't think with the
348 348 current (as of Python 2.3) Python readline it's possible to do
349 349 better."""
350 350
351 351 #print 'Completer->file_matches: <%s>' % text # dbg
352 352
353 353 # chars that require escaping with backslash - i.e. chars
354 354 # that readline treats incorrectly as delimiters, but we
355 355 # don't want to treat as delimiters in filename matching
356 356 # when escaped with backslash
357 357
358 358 protectables = ' ()[]{}'
359 359
360 360 if text.startswith('!'):
361 361 text = text[1:]
362 362 text_prefix = '!'
363 363 else:
364 364 text_prefix = ''
365 365
366 366 def protect_filename(s):
367 367 return "".join([(ch in protectables and '\\' + ch or ch)
368 368 for ch in s])
369 369
370 370 lbuf = self.lbuf
371 371 open_quotes = 0 # track strings with open quotes
372 372 try:
373 373 lsplit = shlex.split(lbuf)[-1]
374 374 except ValueError:
375 375 # typically an unmatched ", or backslash without escaped char.
376 376 if lbuf.count('"')==1:
377 377 open_quotes = 1
378 378 lsplit = lbuf.split('"')[-1]
379 379 elif lbuf.count("'")==1:
380 380 open_quotes = 1
381 381 lsplit = lbuf.split("'")[-1]
382 382 else:
383 return None
383 return []
384 384 except IndexError:
385 385 # tab pressed on empty line
386 386 lsplit = ""
387 387
388 388 if lsplit != protect_filename(lsplit):
389 389 # if protectables are found, do matching on the whole escaped
390 390 # name
391 391 has_protectables = 1
392 392 text0,text = text,lsplit
393 393 else:
394 394 has_protectables = 0
395 395 text = os.path.expanduser(text)
396 396
397 397 if text == "":
398 398 return [text_prefix + protect_filename(f) for f in self.glob("*")]
399 399
400 400 m0 = self.clean_glob(text.replace('\\',''))
401 401 if has_protectables:
402 402 # If we had protectables, we need to revert our changes to the
403 403 # beginning of filename so that we don't double-write the part
404 404 # of the filename we have so far
405 405 len_lsplit = len(lsplit)
406 406 matches = [text_prefix + text0 +
407 407 protect_filename(f[len_lsplit:]) for f in m0]
408 408 else:
409 409 if open_quotes:
410 410 # if we have a string with an open quote, we don't need to
411 411 # protect the names at all (and we _shouldn't_, as it
412 412 # would cause bugs when the filesystem call is made).
413 413 matches = m0
414 414 else:
415 415 matches = [text_prefix +
416 416 protect_filename(f) for f in m0]
417 417 if len(matches) == 1 and os.path.isdir(matches[0]):
418 418 # Takes care of links to directories also. Use '/'
419 419 # explicitly, even under Windows, so that name completions
420 420 # don't end up escaped.
421 421 d = matches[0]
422 422 if d[-1] in ['/','\\']:
423 423 d = d[:-1]
424 424
425 425 matches = [ (d + '/' + p) for p in os.listdir(d) ]
426 426
427 427 return matches
428 428
429 429 def alias_matches(self, text):
430 430 """Match internal system aliases"""
431 431 #print 'Completer->alias_matches:',text,'lb',self.lbuf # dbg
432 432
433 433 # if we are not in the first 'item', alias matching
434 434 # doesn't make sense
435 435 if ' ' in self.lbuf:
436 436 return []
437 437 text = os.path.expanduser(text)
438 438 aliases = self.alias_table.keys()
439 439 if text == "":
440 440 return aliases
441 441 else:
442 442 return [alias for alias in aliases if alias.startswith(text)]
443 443
444 444 def python_matches(self,text):
445 445 """Match attributes or global python names"""
446 446
447 447 #print 'Completer->python_matches, txt=<%s>' % text # dbg
448 448 if "." in text:
449 449 try:
450 450 matches = self.attr_matches(text)
451 451 if text.endswith('.') and self.omit__names:
452 452 if self.omit__names == 1:
453 453 # true if txt is _not_ a __ name, false otherwise:
454 454 no__name = (lambda txt:
455 455 re.match(r'.*\.__.*?__',txt) is None)
456 456 else:
457 457 # true if txt is _not_ a _ name, false otherwise:
458 458 no__name = (lambda txt:
459 459 re.match(r'.*\._.*?',txt) is None)
460 460 matches = filter(no__name, matches)
461 461 except NameError:
462 462 # catches <undefined attributes>.<tab>
463 463 matches = []
464 464 else:
465 465 matches = self.global_matches(text)
466 466 # this is so completion finds magics when automagic is on:
467 467 if (matches == [] and
468 468 not text.startswith(os.sep) and
469 469 not ' ' in self.lbuf):
470 470 matches = self.attr_matches(self.magic_prefix+text)
471 471 return matches
472 472
473 473 def _default_arguments(self, obj):
474 474 """Return the list of default arguments of obj if it is callable,
475 475 or empty list otherwise."""
476 476
477 477 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
478 478 # for classes, check for __init__,__new__
479 479 if inspect.isclass(obj):
480 480 obj = (getattr(obj,'__init__',None) or
481 481 getattr(obj,'__new__',None))
482 482 # for all others, check if they are __call__able
483 483 elif hasattr(obj, '__call__'):
484 484 obj = obj.__call__
485 485 # XXX: is there a way to handle the builtins ?
486 486 try:
487 487 args,_,_1,defaults = inspect.getargspec(obj)
488 488 if defaults:
489 489 return args[-len(defaults):]
490 490 except TypeError: pass
491 491 return []
492 492
493 493 def python_func_kw_matches(self,text):
494 494 """Match named parameters (kwargs) of the last open function"""
495 495
496 496 if "." in text: # a parameter cannot be dotted
497 497 return []
498 498 try: regexp = self.__funcParamsRegex
499 499 except AttributeError:
500 500 regexp = self.__funcParamsRegex = re.compile(r'''
501 501 '.*?' | # single quoted strings or
502 502 ".*?" | # double quoted strings or
503 503 \w+ | # identifier
504 504 \S # other characters
505 505 ''', re.VERBOSE | re.DOTALL)
506 506 # 1. find the nearest identifier that comes before an unclosed
507 507 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
508 508 tokens = regexp.findall(self.get_line_buffer())
509 509 tokens.reverse()
510 510 iterTokens = iter(tokens); openPar = 0
511 511 for token in iterTokens:
512 512 if token == ')':
513 513 openPar -= 1
514 514 elif token == '(':
515 515 openPar += 1
516 516 if openPar > 0:
517 517 # found the last unclosed parenthesis
518 518 break
519 519 else:
520 520 return []
521 521 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
522 522 ids = []
523 523 isId = re.compile(r'\w+$').match
524 524 while True:
525 525 try:
526 526 ids.append(iterTokens.next())
527 527 if not isId(ids[-1]):
528 528 ids.pop(); break
529 529 if not iterTokens.next() == '.':
530 530 break
531 531 except StopIteration:
532 532 break
533 533 # lookup the candidate callable matches either using global_matches
534 534 # or attr_matches for dotted names
535 535 if len(ids) == 1:
536 536 callableMatches = self.global_matches(ids[0])
537 537 else:
538 538 callableMatches = self.attr_matches('.'.join(ids[::-1]))
539 539 argMatches = []
540 540 for callableMatch in callableMatches:
541 541 try: namedArgs = self._default_arguments(eval(callableMatch,
542 542 self.namespace))
543 543 except: continue
544 544 for namedArg in namedArgs:
545 545 if namedArg.startswith(text):
546 546 argMatches.append("%s=" %namedArg)
547 547 return argMatches
548 548
549 549 def dispatch_custom_completer(self,text):
550 550 # print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
551 551 line = self.full_lbuf
552 552 if not line.strip():
553 553 return None
554 554
555 555 event = Struct()
556 556 event.line = line
557 557 event.symbol = text
558 558 cmd = line.split(None,1)[0]
559 559 event.command = cmd
560 560 #print "\ncustom:{%s]\n" % event # dbg
561 561
562 562 # for foo etc, try also to find completer for %foo
563 563 if not cmd.startswith(self.magic_escape):
564 564 try_magic = self.custom_completers.s_matches(
565 565 self.magic_escape + cmd)
566 566 else:
567 567 try_magic = []
568 568
569 569
570 570 for c in itertools.chain(
571 571 self.custom_completers.s_matches(cmd),
572 572 try_magic,
573 573 self.custom_completers.flat_matches(self.lbuf)):
574 574 # print "try",c # dbg
575 575 try:
576 576 res = c(event)
577 577 return [r for r in res if r.lower().startswith(text.lower())]
578 578 except ipapi.TryNext:
579 579 pass
580 580
581 581 return None
582 582
583 583
584 584
585 585 def complete(self, text, state):
586 586 """Return the next possible completion for 'text'.
587 587
588 588 This is called successively with state == 0, 1, 2, ... until it
589 589 returns None. The completion should begin with 'text'. """
590 590
591 591 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
592 592
593 593 # if there is only a tab on a line with only whitespace, instead
594 594 # of the mostly useless 'do you want to see all million
595 595 # completions' message, just do the right thing and give the user
596 596 # his tab! Incidentally, this enables pasting of tabbed text from
597 597 # an editor (as long as autoindent is off).
598 598
599 599 # don't apply this on 'dumb' terminals, such as emacs buffers, so we
600 600 # don't interfere with their own tab-completion mechanism.
601 601 self.full_lbuf = self.get_line_buffer()
602 602 self.lbuf = self.full_lbuf[:self.readline.get_endidx()]
603 603 if not (self.dumb_terminal or self.get_line_buffer().strip()):
604 604 self.readline.insert_text('\t')
605 605 return None
606 606
607 607
608 608 magic_escape = self.magic_escape
609 609 magic_prefix = self.magic_prefix
610 610
611 611 try:
612 612 if text.startswith(magic_escape):
613 613 text = text.replace(magic_escape,magic_prefix)
614 614 elif text.startswith('~'):
615 615 text = os.path.expanduser(text)
616 616 if state == 0:
617 617 custom_res = self.dispatch_custom_completer(text)
618 618 if custom_res is not None:
619 619 # did custom completers produce something?
620 620 self.matches = custom_res
621 621 else:
622 622 # Extend the list of completions with the results of each
623 623 # matcher, so we return results to the user from all
624 624 # namespaces.
625 625 if self.merge_completions:
626 626 self.matches = []
627 627 for matcher in self.matchers:
628 628 self.matches.extend(matcher(text))
629 629 else:
630 630 for matcher in self.matchers:
631 631 self.matches = matcher(text)
632 632 if self.matches:
633 633 break
634 634
635 635 try:
636 636 return self.matches[state].replace(magic_prefix,magic_escape)
637 637 except IndexError:
638 638 return None
639 639 except:
640 640 from IPython.ultraTB import AutoFormattedTB; # dbg
641 641 tb=AutoFormattedTB('Verbose');tb() #dbg
642 642
643 643 # If completion fails, don't annoy the user.
644 644 return None
General Comments 0
You need to be logged in to leave comments. Login now