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