##// END OF EJS Templates
file completer used os.path.join instead of literal /, breaking windows. Now uses /
vivainio -
Show More
@@ -1,633 +1,636 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 filneames, 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 def protect_filename(s):
361 361 return "".join([(ch in protectables and '\\' + ch or ch)
362 362 for ch in s])
363 363
364 364 lbuf = self.lbuf
365 365 open_quotes = 0 # track strings with open quotes
366 366 try:
367 367 lsplit = shlex.split(lbuf)[-1]
368 368 except ValueError:
369 369 # typically an unmatched ", or backslash without escaped char.
370 370 if lbuf.count('"')==1:
371 371 open_quotes = 1
372 372 lsplit = lbuf.split('"')[-1]
373 373 elif lbuf.count("'")==1:
374 374 open_quotes = 1
375 375 lsplit = lbuf.split("'")[-1]
376 376 else:
377 377 return None
378 378 except IndexError:
379 379 # tab pressed on empty line
380 380 lsplit = ""
381 381
382 382 if lsplit != protect_filename(lsplit):
383 383 # if protectables are found, do matching on the whole escaped
384 384 # name
385 385 has_protectables = 1
386 386 text0,text = text,lsplit
387 387 else:
388 388 has_protectables = 0
389 389 text = os.path.expanduser(text)
390 390
391 391 if text == "":
392 392 return [protect_filename(f) for f in self.glob("*")]
393 393
394 394 m0 = self.clean_glob(text.replace('\\',''))
395 395 if has_protectables:
396 396 # If we had protectables, we need to revert our changes to the
397 397 # beginning of filename so that we don't double-write the part
398 398 # of the filename we have so far
399 399 len_lsplit = len(lsplit)
400 400 matches = [text0 + protect_filename(f[len_lsplit:]) for f in m0]
401 401 else:
402 402 if open_quotes:
403 403 # if we have a string with an open quote, we don't need to
404 404 # protect the names at all (and we _shouldn't_, as it
405 405 # would cause bugs when the filesystem call is made).
406 406 matches = m0
407 407 else:
408 408 matches = [protect_filename(f) for f in m0]
409 409 if len(matches) == 1 and os.path.isdir(matches[0]):
410 410 # Takes care of links to directories also. Use '/'
411 411 # explicitly, even under Windows, so that name completions
412 # don't end up escaped.
413 pjoin = os.path.join
412 # don't end up escaped.
414 413 d = matches[0]
415 matches = [ pjoin(d,p) for p in os.listdir(d) ]
414 if d[-1] in ['/','\\']:
415 d = d[:-1]
416
417 matches = [ (d + '/' + p) for p in os.listdir(d) ]
418
416 419 return matches
417 420
418 421 def alias_matches(self, text):
419 422 """Match internal system aliases"""
420 423 #print 'Completer->alias_matches:',text,'lb',self.lbuf # dbg
421 424
422 425 # if we are not in the first 'item', alias matching
423 426 # doesn't make sense
424 427 if ' ' in self.lbuf:
425 428 return []
426 429 text = os.path.expanduser(text)
427 430 aliases = self.alias_table.keys()
428 431 if text == "":
429 432 return aliases
430 433 else:
431 434 return [alias for alias in aliases if alias.startswith(text)]
432 435
433 436 def python_matches(self,text):
434 437 """Match attributes or global python names"""
435 438
436 439 #print 'Completer->python_matches, txt=<%s>' % text # dbg
437 440 if "." in text:
438 441 try:
439 442 matches = self.attr_matches(text)
440 443 if text.endswith('.') and self.omit__names:
441 444 if self.omit__names == 1:
442 445 # true if txt is _not_ a __ name, false otherwise:
443 446 no__name = (lambda txt:
444 447 re.match(r'.*\.__.*?__',txt) is None)
445 448 else:
446 449 # true if txt is _not_ a _ name, false otherwise:
447 450 no__name = (lambda txt:
448 451 re.match(r'.*\._.*?',txt) is None)
449 452 matches = filter(no__name, matches)
450 453 except NameError:
451 454 # catches <undefined attributes>.<tab>
452 455 matches = []
453 456 else:
454 457 matches = self.global_matches(text)
455 458 # this is so completion finds magics when automagic is on:
456 459 if (matches == [] and
457 460 not text.startswith(os.sep) and
458 461 not ' ' in self.lbuf):
459 462 matches = self.attr_matches(self.magic_prefix+text)
460 463 return matches
461 464
462 465 def _default_arguments(self, obj):
463 466 """Return the list of default arguments of obj if it is callable,
464 467 or empty list otherwise."""
465 468
466 469 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
467 470 # for classes, check for __init__,__new__
468 471 if inspect.isclass(obj):
469 472 obj = (getattr(obj,'__init__',None) or
470 473 getattr(obj,'__new__',None))
471 474 # for all others, check if they are __call__able
472 475 elif hasattr(obj, '__call__'):
473 476 obj = obj.__call__
474 477 # XXX: is there a way to handle the builtins ?
475 478 try:
476 479 args,_,_1,defaults = inspect.getargspec(obj)
477 480 if defaults:
478 481 return args[-len(defaults):]
479 482 except TypeError: pass
480 483 return []
481 484
482 485 def python_func_kw_matches(self,text):
483 486 """Match named parameters (kwargs) of the last open function"""
484 487
485 488 if "." in text: # a parameter cannot be dotted
486 489 return []
487 490 try: regexp = self.__funcParamsRegex
488 491 except AttributeError:
489 492 regexp = self.__funcParamsRegex = re.compile(r'''
490 493 '.*?' | # single quoted strings or
491 494 ".*?" | # double quoted strings or
492 495 \w+ | # identifier
493 496 \S # other characters
494 497 ''', re.VERBOSE | re.DOTALL)
495 498 # 1. find the nearest identifier that comes before an unclosed
496 499 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
497 500 tokens = regexp.findall(self.get_line_buffer())
498 501 tokens.reverse()
499 502 iterTokens = iter(tokens); openPar = 0
500 503 for token in iterTokens:
501 504 if token == ')':
502 505 openPar -= 1
503 506 elif token == '(':
504 507 openPar += 1
505 508 if openPar > 0:
506 509 # found the last unclosed parenthesis
507 510 break
508 511 else:
509 512 return []
510 513 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
511 514 ids = []
512 515 isId = re.compile(r'\w+$').match
513 516 while True:
514 517 try:
515 518 ids.append(iterTokens.next())
516 519 if not isId(ids[-1]):
517 520 ids.pop(); break
518 521 if not iterTokens.next() == '.':
519 522 break
520 523 except StopIteration:
521 524 break
522 525 # lookup the candidate callable matches either using global_matches
523 526 # or attr_matches for dotted names
524 527 if len(ids) == 1:
525 528 callableMatches = self.global_matches(ids[0])
526 529 else:
527 530 callableMatches = self.attr_matches('.'.join(ids[::-1]))
528 531 argMatches = []
529 532 for callableMatch in callableMatches:
530 533 try: namedArgs = self._default_arguments(eval(callableMatch,
531 534 self.namespace))
532 535 except: continue
533 536 for namedArg in namedArgs:
534 537 if namedArg.startswith(text):
535 538 argMatches.append("%s=" %namedArg)
536 539 return argMatches
537 540
538 541 def dispatch_custom_completer(self,text):
539 542 # print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
540 543 line = self.full_lbuf
541 544 if not line.strip():
542 545 return None
543 546
544 547 event = Struct()
545 548 event.line = line
546 549 event.symbol = text
547 550 cmd = line.split(None,1)[0]
548 551 event.command = cmd
549 552 #print "\ncustom:{%s]\n" % event # dbg
550 553
551 554 # for foo etc, try also to find completer for %foo
552 555 if not cmd.startswith(self.magic_escape):
553 556 try_magic = self.custom_completers.s_matches(
554 557 self.magic_escape + cmd)
555 558 else:
556 559 try_magic = []
557 560
558 561
559 562 for c in itertools.chain(
560 563 self.custom_completers.s_matches(cmd),
561 564 try_magic,
562 565 self.custom_completers.flat_matches(self.lbuf)):
563 566 # print "try",c # dbg
564 567 try:
565 568 res = c(event)
566 569 return [r for r in res if r.lower().startswith(text.lower())]
567 570 except ipapi.TryNext:
568 571 pass
569 572
570 573 return None
571 574
572 575
573 576
574 577 def complete(self, text, state):
575 578 """Return the next possible completion for 'text'.
576 579
577 580 This is called successively with state == 0, 1, 2, ... until it
578 581 returns None. The completion should begin with 'text'. """
579 582
580 583 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
581 584
582 585 # if there is only a tab on a line with only whitespace, instead
583 586 # of the mostly useless 'do you want to see all million
584 587 # completions' message, just do the right thing and give the user
585 588 # his tab! Incidentally, this enables pasting of tabbed text from
586 589 # an editor (as long as autoindent is off).
587 590
588 591 # don't apply this on 'dumb' terminals, such as emacs buffers, so we
589 592 # don't interfere with their own tab-completion mechanism.
590 593 self.full_lbuf = self.get_line_buffer()
591 594 self.lbuf = self.full_lbuf[:self.readline.get_endidx()]
592 595 if not (self.dumb_terminal or self.get_line_buffer().strip()):
593 596 self.readline.insert_text('\t')
594 597 return None
595 598
596 599
597 600 magic_escape = self.magic_escape
598 601 magic_prefix = self.magic_prefix
599 602
600 603 try:
601 604 if text.startswith(magic_escape):
602 605 text = text.replace(magic_escape,magic_prefix)
603 606 elif text.startswith('~'):
604 607 text = os.path.expanduser(text)
605 608 if state == 0:
606 609 custom_res = self.dispatch_custom_completer(text)
607 610 if custom_res is not None:
608 611 # did custom completers produce something?
609 612 self.matches = custom_res
610 613 else:
611 614 # Extend the list of completions with the results of each
612 615 # matcher, so we return results to the user from all
613 616 # namespaces.
614 617 if self.merge_completions:
615 618 self.matches = []
616 619 for matcher in self.matchers:
617 620 self.matches.extend(matcher(text))
618 621 else:
619 622 for matcher in self.matchers:
620 623 self.matches = matcher(text)
621 624 if self.matches:
622 625 break
623 626
624 627 try:
625 628 return self.matches[state].replace(magic_prefix,magic_escape)
626 629 except IndexError:
627 630 return None
628 631 except:
629 632 from IPython.ultraTB import AutoFormattedTB; # dbg
630 633 tb=AutoFormattedTB('Verbose');tb() #dbg
631 634
632 635 # If completion fails, don't annoy the user.
633 636 return None
General Comments 0
You need to be logged in to leave comments. Login now