##// END OF EJS Templates
Adding partial latex completions.
Brian E. Granger -
Show More
@@ -1,1172 +1,1179 b''
1 1 # encoding: utf-8
2 2 """Word completion for IPython.
3 3
4 4 This module is a fork of the rlcompleter module in the Python standard
5 5 library. The original enhancements made to rlcompleter have been sent
6 6 upstream and were accepted as of Python 2.3, but we need a lot more
7 7 functionality specific to IPython, so this module will continue to live as an
8 8 IPython-specific utility.
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 # Since this file is essentially a minimally modified copy of the rlcompleter
53 53 # module which is part of the standard Python distribution, I assume that the
54 54 # proper procedure is to maintain its copyright as belonging to the Python
55 55 # Software Foundation (in addition to my own, for all new code).
56 56 #
57 57 # Copyright (C) 2008 IPython Development Team
58 58 # Copyright (C) 2001 Fernando Perez. <fperez@colorado.edu>
59 59 # Copyright (C) 2001 Python Software Foundation, www.python.org
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 #-----------------------------------------------------------------------------
67 67 # Imports
68 68 #-----------------------------------------------------------------------------
69 69
70 70 import __main__
71 71 import glob
72 72 import inspect
73 73 import itertools
74 74 import keyword
75 75 import os
76 76 import re
77 77 import sys
78 78
79 79 from IPython.config.configurable import Configurable
80 80 from IPython.core.error import TryNext
81 81 from IPython.core.inputsplitter import ESC_MAGIC
82 82 from IPython.core.latex_symbols import latex_symbols
83 83 from IPython.utils import generics
84 84 from IPython.utils import io
85 85 from IPython.utils.decorators import undoc
86 86 from IPython.utils.dir2 import dir2
87 87 from IPython.utils.process import arg_split
88 88 from IPython.utils.py3compat import builtin_mod, string_types, PY3
89 89 from IPython.utils.traitlets import CBool, Enum
90 90
91 91 #-----------------------------------------------------------------------------
92 92 # Globals
93 93 #-----------------------------------------------------------------------------
94 94
95 95 # Public API
96 96 __all__ = ['Completer','IPCompleter']
97 97
98 98 if sys.platform == 'win32':
99 99 PROTECTABLES = ' '
100 100 else:
101 101 PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&'
102 102
103 103
104 104 #-----------------------------------------------------------------------------
105 105 # Main functions and classes
106 106 #-----------------------------------------------------------------------------
107 107
108 108 def has_open_quotes(s):
109 109 """Return whether a string has open quotes.
110 110
111 111 This simply counts whether the number of quote characters of either type in
112 112 the string is odd.
113 113
114 114 Returns
115 115 -------
116 116 If there is an open quote, the quote character is returned. Else, return
117 117 False.
118 118 """
119 119 # We check " first, then ', so complex cases with nested quotes will get
120 120 # the " to take precedence.
121 121 if s.count('"') % 2:
122 122 return '"'
123 123 elif s.count("'") % 2:
124 124 return "'"
125 125 else:
126 126 return False
127 127
128 128
129 129 def protect_filename(s):
130 130 """Escape a string to protect certain characters."""
131 131
132 132 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
133 133 for ch in s])
134 134
135 135 def expand_user(path):
136 136 """Expand '~'-style usernames in strings.
137 137
138 138 This is similar to :func:`os.path.expanduser`, but it computes and returns
139 139 extra information that will be useful if the input was being used in
140 140 computing completions, and you wish to return the completions with the
141 141 original '~' instead of its expanded value.
142 142
143 143 Parameters
144 144 ----------
145 145 path : str
146 146 String to be expanded. If no ~ is present, the output is the same as the
147 147 input.
148 148
149 149 Returns
150 150 -------
151 151 newpath : str
152 152 Result of ~ expansion in the input path.
153 153 tilde_expand : bool
154 154 Whether any expansion was performed or not.
155 155 tilde_val : str
156 156 The value that ~ was replaced with.
157 157 """
158 158 # Default values
159 159 tilde_expand = False
160 160 tilde_val = ''
161 161 newpath = path
162 162
163 163 if path.startswith('~'):
164 164 tilde_expand = True
165 165 rest = len(path)-1
166 166 newpath = os.path.expanduser(path)
167 167 if rest:
168 168 tilde_val = newpath[:-rest]
169 169 else:
170 170 tilde_val = newpath
171 171
172 172 return newpath, tilde_expand, tilde_val
173 173
174 174
175 175 def compress_user(path, tilde_expand, tilde_val):
176 176 """Does the opposite of expand_user, with its outputs.
177 177 """
178 178 if tilde_expand:
179 179 return path.replace(tilde_val, '~')
180 180 else:
181 181 return path
182 182
183 183
184 184
185 185 def penalize_magics_key(word):
186 186 """key for sorting that penalizes magic commands in the ordering
187 187
188 188 Normal words are left alone.
189 189
190 190 Magic commands have the initial % moved to the end, e.g.
191 191 %matplotlib is transformed as follows:
192 192
193 193 %matplotlib -> matplotlib%
194 194
195 195 [The choice of the final % is arbitrary.]
196 196
197 197 Since "matplotlib" < "matplotlib%" as strings,
198 198 "timeit" will appear before the magic "%timeit" in the ordering
199 199
200 200 For consistency, move "%%" to the end, so cell magics appear *after*
201 201 line magics with the same name.
202 202
203 203 A check is performed that there are no other "%" in the string;
204 204 if there are, then the string is not a magic command and is left unchanged.
205 205
206 206 """
207 207
208 208 # Move any % signs from start to end of the key
209 209 # provided there are no others elsewhere in the string
210 210
211 211 if word[:2] == "%%":
212 212 if not "%" in word[2:]:
213 213 return word[2:] + "%%"
214 214
215 215 if word[:1] == "%":
216 216 if not "%" in word[1:]:
217 217 return word[1:] + "%"
218 218
219 219 return word
220 220
221 221
222 222 @undoc
223 223 class Bunch(object): pass
224 224
225 225
226 226 DELIMS = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?'
227 227 GREEDY_DELIMS = ' =\r\n'
228 228
229 229
230 230 class CompletionSplitter(object):
231 231 """An object to split an input line in a manner similar to readline.
232 232
233 233 By having our own implementation, we can expose readline-like completion in
234 234 a uniform manner to all frontends. This object only needs to be given the
235 235 line of text to be split and the cursor position on said line, and it
236 236 returns the 'word' to be completed on at the cursor after splitting the
237 237 entire line.
238 238
239 239 What characters are used as splitting delimiters can be controlled by
240 240 setting the `delims` attribute (this is a property that internally
241 241 automatically builds the necessary regular expression)"""
242 242
243 243 # Private interface
244 244
245 245 # A string of delimiter characters. The default value makes sense for
246 246 # IPython's most typical usage patterns.
247 247 _delims = DELIMS
248 248
249 249 # The expression (a normal string) to be compiled into a regular expression
250 250 # for actual splitting. We store it as an attribute mostly for ease of
251 251 # debugging, since this type of code can be so tricky to debug.
252 252 _delim_expr = None
253 253
254 254 # The regular expression that does the actual splitting
255 255 _delim_re = None
256 256
257 257 def __init__(self, delims=None):
258 258 delims = CompletionSplitter._delims if delims is None else delims
259 259 self.delims = delims
260 260
261 261 @property
262 262 def delims(self):
263 263 """Return the string of delimiter characters."""
264 264 return self._delims
265 265
266 266 @delims.setter
267 267 def delims(self, delims):
268 268 """Set the delimiters for line splitting."""
269 269 expr = '[' + ''.join('\\'+ c for c in delims) + ']'
270 270 self._delim_re = re.compile(expr)
271 271 self._delims = delims
272 272 self._delim_expr = expr
273 273
274 274 def split_line(self, line, cursor_pos=None):
275 275 """Split a line of text with a cursor at the given position.
276 276 """
277 277 l = line if cursor_pos is None else line[:cursor_pos]
278 278 return self._delim_re.split(l)[-1]
279 279
280 280
281 281 class Completer(Configurable):
282 282
283 283 greedy = CBool(False, config=True,
284 284 help="""Activate greedy completion
285 285
286 286 This will enable completion on elements of lists, results of function calls, etc.,
287 287 but can be unsafe because the code is actually evaluated on TAB.
288 288 """
289 289 )
290 290
291 291
292 292 def __init__(self, namespace=None, global_namespace=None, **kwargs):
293 293 """Create a new completer for the command line.
294 294
295 295 Completer(namespace=ns,global_namespace=ns2) -> completer instance.
296 296
297 297 If unspecified, the default namespace where completions are performed
298 298 is __main__ (technically, __main__.__dict__). Namespaces should be
299 299 given as dictionaries.
300 300
301 301 An optional second namespace can be given. This allows the completer
302 302 to handle cases where both the local and global scopes need to be
303 303 distinguished.
304 304
305 305 Completer instances should be used as the completion mechanism of
306 306 readline via the set_completer() call:
307 307
308 308 readline.set_completer(Completer(my_namespace).complete)
309 309 """
310 310
311 311 # Don't bind to namespace quite yet, but flag whether the user wants a
312 312 # specific namespace or to use __main__.__dict__. This will allow us
313 313 # to bind to __main__.__dict__ at completion time, not now.
314 314 if namespace is None:
315 315 self.use_main_ns = 1
316 316 else:
317 317 self.use_main_ns = 0
318 318 self.namespace = namespace
319 319
320 320 # The global namespace, if given, can be bound directly
321 321 if global_namespace is None:
322 322 self.global_namespace = {}
323 323 else:
324 324 self.global_namespace = global_namespace
325 325
326 326 super(Completer, self).__init__(**kwargs)
327 327
328 328 def complete(self, text, state):
329 329 """Return the next possible completion for 'text'.
330 330
331 331 This is called successively with state == 0, 1, 2, ... until it
332 332 returns None. The completion should begin with 'text'.
333 333
334 334 """
335 335 if self.use_main_ns:
336 336 self.namespace = __main__.__dict__
337 337
338 338 if state == 0:
339 339 if "." in text:
340 340 self.matches = self.attr_matches(text)
341 341 else:
342 342 self.matches = self.global_matches(text)
343 343 try:
344 344 return self.matches[state]
345 345 except IndexError:
346 346 return None
347 347
348 348 def global_matches(self, text):
349 349 """Compute matches when text is a simple name.
350 350
351 351 Return a list of all keywords, built-in functions and names currently
352 352 defined in self.namespace or self.global_namespace that match.
353 353
354 354 """
355 355 #print 'Completer->global_matches, txt=%r' % text # dbg
356 356 matches = []
357 357 match_append = matches.append
358 358 n = len(text)
359 359 for lst in [keyword.kwlist,
360 360 builtin_mod.__dict__.keys(),
361 361 self.namespace.keys(),
362 362 self.global_namespace.keys()]:
363 363 for word in lst:
364 364 if word[:n] == text and word != "__builtins__":
365 365 match_append(word)
366 366 return matches
367 367
368 368 def attr_matches(self, text):
369 369 """Compute matches when text contains a dot.
370 370
371 371 Assuming the text is of the form NAME.NAME....[NAME], and is
372 372 evaluatable in self.namespace or self.global_namespace, it will be
373 373 evaluated and its attributes (as revealed by dir()) are used as
374 374 possible completions. (For class instances, class members are are
375 375 also considered.)
376 376
377 377 WARNING: this can still invoke arbitrary C code, if an object
378 378 with a __getattr__ hook is evaluated.
379 379
380 380 """
381 381
382 382 #io.rprint('Completer->attr_matches, txt=%r' % text) # dbg
383 383 # Another option, seems to work great. Catches things like ''.<tab>
384 384 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
385 385
386 386 if m:
387 387 expr, attr = m.group(1, 3)
388 388 elif self.greedy:
389 389 m2 = re.match(r"(.+)\.(\w*)$", self.line_buffer)
390 390 if not m2:
391 391 return []
392 392 expr, attr = m2.group(1,2)
393 393 else:
394 394 return []
395 395
396 396 try:
397 397 obj = eval(expr, self.namespace)
398 398 except:
399 399 try:
400 400 obj = eval(expr, self.global_namespace)
401 401 except:
402 402 return []
403 403
404 404 if self.limit_to__all__ and hasattr(obj, '__all__'):
405 405 words = get__all__entries(obj)
406 406 else:
407 407 words = dir2(obj)
408 408
409 409 try:
410 410 words = generics.complete_object(obj, words)
411 411 except TryNext:
412 412 pass
413 413 except Exception:
414 414 # Silence errors from completion function
415 415 #raise # dbg
416 416 pass
417 417 # Build match list to return
418 418 n = len(attr)
419 419 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
420 420 return res
421 421
422 422
423 423 def get__all__entries(obj):
424 424 """returns the strings in the __all__ attribute"""
425 425 try:
426 426 words = getattr(obj, '__all__')
427 427 except:
428 428 return []
429 429
430 430 return [w for w in words if isinstance(w, string_types)]
431 431
432 432
433 433 def match_dict_keys(keys, prefix):
434 434 """Used by dict_key_matches, matching the prefix to a list of keys"""
435 435 if not prefix:
436 436 return None, 0, [repr(k) for k in keys
437 437 if isinstance(k, (string_types, bytes))]
438 438 quote_match = re.search('["\']', prefix)
439 439 quote = quote_match.group()
440 440 try:
441 441 prefix_str = eval(prefix + quote, {})
442 442 except Exception:
443 443 return None, 0, []
444 444
445 445 token_match = re.search(r'\w*$', prefix, re.UNICODE)
446 446 token_start = token_match.start()
447 447 token_prefix = token_match.group()
448 448
449 449 # TODO: support bytes in Py3k
450 450 matched = []
451 451 for key in keys:
452 452 try:
453 453 if not key.startswith(prefix_str):
454 454 continue
455 455 except (AttributeError, TypeError, UnicodeError):
456 456 # Python 3+ TypeError on b'a'.startswith('a') or vice-versa
457 457 continue
458 458
459 459 # reformat remainder of key to begin with prefix
460 460 rem = key[len(prefix_str):]
461 461 # force repr wrapped in '
462 462 rem_repr = repr(rem + '"')
463 463 if rem_repr.startswith('u') and prefix[0] not in 'uU':
464 464 # Found key is unicode, but prefix is Py2 string.
465 465 # Therefore attempt to interpret key as string.
466 466 try:
467 467 rem_repr = repr(rem.encode('ascii') + '"')
468 468 except UnicodeEncodeError:
469 469 continue
470 470
471 471 rem_repr = rem_repr[1 + rem_repr.index("'"):-2]
472 472 if quote == '"':
473 473 # The entered prefix is quoted with ",
474 474 # but the match is quoted with '.
475 475 # A contained " hence needs escaping for comparison:
476 476 rem_repr = rem_repr.replace('"', '\\"')
477 477
478 478 # then reinsert prefix from start of token
479 479 matched.append('%s%s' % (token_prefix, rem_repr))
480 480 return quote, token_start, matched
481 481
482 482
483 483 def _safe_isinstance(obj, module, class_name):
484 484 """Checks if obj is an instance of module.class_name if loaded
485 485 """
486 486 return (module in sys.modules and
487 487 isinstance(obj, getattr(__import__(module), class_name)))
488 488
489 489
490 490
491 491 class IPCompleter(Completer):
492 492 """Extension of the completer class with IPython-specific features"""
493 493
494 494 def _greedy_changed(self, name, old, new):
495 495 """update the splitter and readline delims when greedy is changed"""
496 496 if new:
497 497 self.splitter.delims = GREEDY_DELIMS
498 498 else:
499 499 self.splitter.delims = DELIMS
500 500
501 501 if self.readline:
502 502 self.readline.set_completer_delims(self.splitter.delims)
503 503
504 504 merge_completions = CBool(True, config=True,
505 505 help="""Whether to merge completion results into a single list
506 506
507 507 If False, only the completion results from the first non-empty
508 508 completer will be returned.
509 509 """
510 510 )
511 511 omit__names = Enum((0,1,2), default_value=2, config=True,
512 512 help="""Instruct the completer to omit private method names
513 513
514 514 Specifically, when completing on ``object.<tab>``.
515 515
516 516 When 2 [default]: all names that start with '_' will be excluded.
517 517
518 518 When 1: all 'magic' names (``__foo__``) will be excluded.
519 519
520 520 When 0: nothing will be excluded.
521 521 """
522 522 )
523 523 limit_to__all__ = CBool(default_value=False, config=True,
524 524 help="""Instruct the completer to use __all__ for the completion
525 525
526 526 Specifically, when completing on ``object.<tab>``.
527 527
528 528 When True: only those names in obj.__all__ will be included.
529 529
530 530 When False [default]: the __all__ attribute is ignored
531 531 """
532 532 )
533 533
534 534 def __init__(self, shell=None, namespace=None, global_namespace=None,
535 535 use_readline=True, config=None, **kwargs):
536 536 """IPCompleter() -> completer
537 537
538 538 Return a completer object suitable for use by the readline library
539 539 via readline.set_completer().
540 540
541 541 Inputs:
542 542
543 543 - shell: a pointer to the ipython shell itself. This is needed
544 544 because this completer knows about magic functions, and those can
545 545 only be accessed via the ipython instance.
546 546
547 547 - namespace: an optional dict where completions are performed.
548 548
549 549 - global_namespace: secondary optional dict for completions, to
550 550 handle cases (such as IPython embedded inside functions) where
551 551 both Python scopes are visible.
552 552
553 553 use_readline : bool, optional
554 554 If true, use the readline library. This completer can still function
555 555 without readline, though in that case callers must provide some extra
556 556 information on each call about the current line."""
557 557
558 558 self.magic_escape = ESC_MAGIC
559 559 self.splitter = CompletionSplitter()
560 560
561 561 # Readline configuration, only used by the rlcompleter method.
562 562 if use_readline:
563 563 # We store the right version of readline so that later code
564 564 import IPython.utils.rlineimpl as readline
565 565 self.readline = readline
566 566 else:
567 567 self.readline = None
568 568
569 569 # _greedy_changed() depends on splitter and readline being defined:
570 570 Completer.__init__(self, namespace=namespace, global_namespace=global_namespace,
571 571 config=config, **kwargs)
572 572
573 573 # List where completion matches will be stored
574 574 self.matches = []
575 575 self.shell = shell
576 576 # Regexp to split filenames with spaces in them
577 577 self.space_name_re = re.compile(r'([^\\] )')
578 578 # Hold a local ref. to glob.glob for speed
579 579 self.glob = glob.glob
580 580
581 581 # Determine if we are running on 'dumb' terminals, like (X)Emacs
582 582 # buffers, to avoid completion problems.
583 583 term = os.environ.get('TERM','xterm')
584 584 self.dumb_terminal = term in ['dumb','emacs']
585 585
586 586 # Special handling of backslashes needed in win32 platforms
587 587 if sys.platform == "win32":
588 588 self.clean_glob = self._clean_glob_win32
589 589 else:
590 590 self.clean_glob = self._clean_glob
591 591
592 592 #regexp to parse docstring for function signature
593 593 self.docstring_sig_re = re.compile(r'^[\w|\s.]+\(([^)]*)\).*')
594 594 self.docstring_kwd_re = re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)')
595 595 #use this if positional argument name is also needed
596 596 #= re.compile(r'[\s|\[]*(\w+)(?:\s*=?\s*.*)')
597 597
598 598 # All active matcher routines for completion
599 599 self.matchers = [self.python_matches,
600 600 self.file_matches,
601 601 self.magic_matches,
602 602 self.python_func_kw_matches,
603 603 self.dict_key_matches,
604 604 ]
605 605
606 606 def all_completions(self, text):
607 607 """
608 608 Wrapper around the complete method for the benefit of emacs
609 609 and pydb.
610 610 """
611 611 return self.complete(text)[1]
612 612
613 613 def _clean_glob(self,text):
614 614 return self.glob("%s*" % text)
615 615
616 616 def _clean_glob_win32(self,text):
617 617 return [f.replace("\\","/")
618 618 for f in self.glob("%s*" % text)]
619 619
620 620 def file_matches(self, text):
621 621 """Match filenames, expanding ~USER type strings.
622 622
623 623 Most of the seemingly convoluted logic in this completer is an
624 624 attempt to handle filenames with spaces in them. And yet it's not
625 625 quite perfect, because Python's readline doesn't expose all of the
626 626 GNU readline details needed for this to be done correctly.
627 627
628 628 For a filename with a space in it, the printed completions will be
629 629 only the parts after what's already been typed (instead of the
630 630 full completions, as is normally done). I don't think with the
631 631 current (as of Python 2.3) Python readline it's possible to do
632 632 better."""
633 633
634 634 #io.rprint('Completer->file_matches: <%r>' % text) # dbg
635 635
636 636 # chars that require escaping with backslash - i.e. chars
637 637 # that readline treats incorrectly as delimiters, but we
638 638 # don't want to treat as delimiters in filename matching
639 639 # when escaped with backslash
640 640 if text.startswith('!'):
641 641 text = text[1:]
642 642 text_prefix = '!'
643 643 else:
644 644 text_prefix = ''
645 645
646 646 text_until_cursor = self.text_until_cursor
647 647 # track strings with open quotes
648 648 open_quotes = has_open_quotes(text_until_cursor)
649 649
650 650 if '(' in text_until_cursor or '[' in text_until_cursor:
651 651 lsplit = text
652 652 else:
653 653 try:
654 654 # arg_split ~ shlex.split, but with unicode bugs fixed by us
655 655 lsplit = arg_split(text_until_cursor)[-1]
656 656 except ValueError:
657 657 # typically an unmatched ", or backslash without escaped char.
658 658 if open_quotes:
659 659 lsplit = text_until_cursor.split(open_quotes)[-1]
660 660 else:
661 661 return []
662 662 except IndexError:
663 663 # tab pressed on empty line
664 664 lsplit = ""
665 665
666 666 if not open_quotes and lsplit != protect_filename(lsplit):
667 667 # if protectables are found, do matching on the whole escaped name
668 668 has_protectables = True
669 669 text0,text = text,lsplit
670 670 else:
671 671 has_protectables = False
672 672 text = os.path.expanduser(text)
673 673
674 674 if text == "":
675 675 return [text_prefix + protect_filename(f) for f in self.glob("*")]
676 676
677 677 # Compute the matches from the filesystem
678 678 m0 = self.clean_glob(text.replace('\\',''))
679 679
680 680 if has_protectables:
681 681 # If we had protectables, we need to revert our changes to the
682 682 # beginning of filename so that we don't double-write the part
683 683 # of the filename we have so far
684 684 len_lsplit = len(lsplit)
685 685 matches = [text_prefix + text0 +
686 686 protect_filename(f[len_lsplit:]) for f in m0]
687 687 else:
688 688 if open_quotes:
689 689 # if we have a string with an open quote, we don't need to
690 690 # protect the names at all (and we _shouldn't_, as it
691 691 # would cause bugs when the filesystem call is made).
692 692 matches = m0
693 693 else:
694 694 matches = [text_prefix +
695 695 protect_filename(f) for f in m0]
696 696
697 697 #io.rprint('mm', matches) # dbg
698 698
699 699 # Mark directories in input list by appending '/' to their names.
700 700 matches = [x+'/' if os.path.isdir(x) else x for x in matches]
701 701 return matches
702 702
703 703 def magic_matches(self, text):
704 704 """Match magics"""
705 705 #print 'Completer->magic_matches:',text,'lb',self.text_until_cursor # dbg
706 706 # Get all shell magics now rather than statically, so magics loaded at
707 707 # runtime show up too.
708 708 lsm = self.shell.magics_manager.lsmagic()
709 709 line_magics = lsm['line']
710 710 cell_magics = lsm['cell']
711 711 pre = self.magic_escape
712 712 pre2 = pre+pre
713 713
714 714 # Completion logic:
715 715 # - user gives %%: only do cell magics
716 716 # - user gives %: do both line and cell magics
717 717 # - no prefix: do both
718 718 # In other words, line magics are skipped if the user gives %% explicitly
719 719 bare_text = text.lstrip(pre)
720 720 comp = [ pre2+m for m in cell_magics if m.startswith(bare_text)]
721 721 if not text.startswith(pre2):
722 722 comp += [ pre+m for m in line_magics if m.startswith(bare_text)]
723 723 return comp
724 724
725 725 def python_matches(self,text):
726 726 """Match attributes or global python names"""
727 727
728 728 #io.rprint('Completer->python_matches, txt=%r' % text) # dbg
729 729 if "." in text:
730 730 try:
731 731 matches = self.attr_matches(text)
732 732 if text.endswith('.') and self.omit__names:
733 733 if self.omit__names == 1:
734 734 # true if txt is _not_ a __ name, false otherwise:
735 735 no__name = (lambda txt:
736 736 re.match(r'.*\.__.*?__',txt) is None)
737 737 else:
738 738 # true if txt is _not_ a _ name, false otherwise:
739 739 no__name = (lambda txt:
740 740 re.match(r'.*\._.*?',txt) is None)
741 741 matches = filter(no__name, matches)
742 742 except NameError:
743 743 # catches <undefined attributes>.<tab>
744 744 matches = []
745 745 else:
746 746 matches = self.global_matches(text)
747 747
748 748 return matches
749 749
750 750 def _default_arguments_from_docstring(self, doc):
751 751 """Parse the first line of docstring for call signature.
752 752
753 753 Docstring should be of the form 'min(iterable[, key=func])\n'.
754 754 It can also parse cython docstring of the form
755 755 'Minuit.migrad(self, int ncall=10000, resume=True, int nsplit=1)'.
756 756 """
757 757 if doc is None:
758 758 return []
759 759
760 760 #care only the firstline
761 761 line = doc.lstrip().splitlines()[0]
762 762
763 763 #p = re.compile(r'^[\w|\s.]+\(([^)]*)\).*')
764 764 #'min(iterable[, key=func])\n' -> 'iterable[, key=func]'
765 765 sig = self.docstring_sig_re.search(line)
766 766 if sig is None:
767 767 return []
768 768 # iterable[, key=func]' -> ['iterable[' ,' key=func]']
769 769 sig = sig.groups()[0].split(',')
770 770 ret = []
771 771 for s in sig:
772 772 #re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)')
773 773 ret += self.docstring_kwd_re.findall(s)
774 774 return ret
775 775
776 776 def _default_arguments(self, obj):
777 777 """Return the list of default arguments of obj if it is callable,
778 778 or empty list otherwise."""
779 779 call_obj = obj
780 780 ret = []
781 781 if inspect.isbuiltin(obj):
782 782 pass
783 783 elif not (inspect.isfunction(obj) or inspect.ismethod(obj)):
784 784 if inspect.isclass(obj):
785 785 #for cython embededsignature=True the constructor docstring
786 786 #belongs to the object itself not __init__
787 787 ret += self._default_arguments_from_docstring(
788 788 getattr(obj, '__doc__', ''))
789 789 # for classes, check for __init__,__new__
790 790 call_obj = (getattr(obj, '__init__', None) or
791 791 getattr(obj, '__new__', None))
792 792 # for all others, check if they are __call__able
793 793 elif hasattr(obj, '__call__'):
794 794 call_obj = obj.__call__
795 795
796 796 ret += self._default_arguments_from_docstring(
797 797 getattr(call_obj, '__doc__', ''))
798 798
799 799 try:
800 800 args,_,_1,defaults = inspect.getargspec(call_obj)
801 801 if defaults:
802 802 ret+=args[-len(defaults):]
803 803 except TypeError:
804 804 pass
805 805
806 806 return list(set(ret))
807 807
808 808 def python_func_kw_matches(self,text):
809 809 """Match named parameters (kwargs) of the last open function"""
810 810
811 811 if "." in text: # a parameter cannot be dotted
812 812 return []
813 813 try: regexp = self.__funcParamsRegex
814 814 except AttributeError:
815 815 regexp = self.__funcParamsRegex = re.compile(r'''
816 816 '.*?(?<!\\)' | # single quoted strings or
817 817 ".*?(?<!\\)" | # double quoted strings or
818 818 \w+ | # identifier
819 819 \S # other characters
820 820 ''', re.VERBOSE | re.DOTALL)
821 821 # 1. find the nearest identifier that comes before an unclosed
822 822 # parenthesis before the cursor
823 823 # e.g. for "foo (1+bar(x), pa<cursor>,a=1)", the candidate is "foo"
824 824 tokens = regexp.findall(self.text_until_cursor)
825 825 tokens.reverse()
826 826 iterTokens = iter(tokens); openPar = 0
827 827
828 828 for token in iterTokens:
829 829 if token == ')':
830 830 openPar -= 1
831 831 elif token == '(':
832 832 openPar += 1
833 833 if openPar > 0:
834 834 # found the last unclosed parenthesis
835 835 break
836 836 else:
837 837 return []
838 838 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
839 839 ids = []
840 840 isId = re.compile(r'\w+$').match
841 841
842 842 while True:
843 843 try:
844 844 ids.append(next(iterTokens))
845 845 if not isId(ids[-1]):
846 846 ids.pop(); break
847 847 if not next(iterTokens) == '.':
848 848 break
849 849 except StopIteration:
850 850 break
851 851 # lookup the candidate callable matches either using global_matches
852 852 # or attr_matches for dotted names
853 853 if len(ids) == 1:
854 854 callableMatches = self.global_matches(ids[0])
855 855 else:
856 856 callableMatches = self.attr_matches('.'.join(ids[::-1]))
857 857 argMatches = []
858 858 for callableMatch in callableMatches:
859 859 try:
860 860 namedArgs = self._default_arguments(eval(callableMatch,
861 861 self.namespace))
862 862 except:
863 863 continue
864 864
865 865 for namedArg in namedArgs:
866 866 if namedArg.startswith(text):
867 867 argMatches.append("%s=" %namedArg)
868 868 return argMatches
869 869
870 870 def dict_key_matches(self, text):
871 871 "Match string keys in a dictionary, after e.g. 'foo[' "
872 872 def get_keys(obj):
873 873 # Only allow completion for known in-memory dict-like types
874 874 if isinstance(obj, dict) or\
875 875 _safe_isinstance(obj, 'pandas', 'DataFrame'):
876 876 try:
877 877 return list(obj.keys())
878 878 except Exception:
879 879 return []
880 880 elif _safe_isinstance(obj, 'numpy', 'ndarray'):
881 881 return obj.dtype.names or []
882 882 return []
883 883
884 884 try:
885 885 regexps = self.__dict_key_regexps
886 886 except AttributeError:
887 887 dict_key_re_fmt = r'''(?x)
888 888 ( # match dict-referring expression wrt greedy setting
889 889 %s
890 890 )
891 891 \[ # open bracket
892 892 \s* # and optional whitespace
893 893 ([uUbB]? # string prefix (r not handled)
894 894 (?: # unclosed string
895 895 '(?:[^']|(?<!\\)\\')*
896 896 |
897 897 "(?:[^"]|(?<!\\)\\")*
898 898 )
899 899 )?
900 900 $
901 901 '''
902 902 regexps = self.__dict_key_regexps = {
903 903 False: re.compile(dict_key_re_fmt % '''
904 904 # identifiers separated by .
905 905 (?!\d)\w+
906 906 (?:\.(?!\d)\w+)*
907 907 '''),
908 908 True: re.compile(dict_key_re_fmt % '''
909 909 .+
910 910 ''')
911 911 }
912 912
913 913 match = regexps[self.greedy].search(self.text_until_cursor)
914 914 if match is None:
915 915 return []
916 916
917 917 expr, prefix = match.groups()
918 918 try:
919 919 obj = eval(expr, self.namespace)
920 920 except Exception:
921 921 try:
922 922 obj = eval(expr, self.global_namespace)
923 923 except Exception:
924 924 return []
925 925
926 926 keys = get_keys(obj)
927 927 if not keys:
928 928 return keys
929 929 closing_quote, token_offset, matches = match_dict_keys(keys, prefix)
930 930 if not matches:
931 931 return matches
932 932
933 933 # get the cursor position of
934 934 # - the text being completed
935 935 # - the start of the key text
936 936 # - the start of the completion
937 937 text_start = len(self.text_until_cursor) - len(text)
938 938 if prefix:
939 939 key_start = match.start(2)
940 940 completion_start = key_start + token_offset
941 941 else:
942 942 key_start = completion_start = match.end()
943 943
944 944 # grab the leading prefix, to make sure all completions start with `text`
945 945 if text_start > key_start:
946 946 leading = ''
947 947 else:
948 948 leading = text[text_start:completion_start]
949 949
950 950 # the index of the `[` character
951 951 bracket_idx = match.end(1)
952 952
953 953 # append closing quote and bracket as appropriate
954 954 # this is *not* appropriate if the opening quote or bracket is outside
955 955 # the text given to this method
956 956 suf = ''
957 957 continuation = self.line_buffer[len(self.text_until_cursor):]
958 958 if key_start > text_start and closing_quote:
959 959 # quotes were opened inside text, maybe close them
960 960 if continuation.startswith(closing_quote):
961 961 continuation = continuation[len(closing_quote):]
962 962 else:
963 963 suf += closing_quote
964 964 if bracket_idx > text_start:
965 965 # brackets were opened inside text, maybe close them
966 966 if not continuation.startswith(']'):
967 967 suf += ']'
968 968
969 969 return [leading + k + suf for k in matches]
970 970
971 971 def latex_matches(self, text):
972 972 slashpos = text.rfind('\\')
973 973 if slashpos > -1:
974 974 s = text[slashpos:]
975 975 if s in latex_symbols:
976 # Try to complete a full latex symbol to unicode
977 # \\alpha -> Ξ±
976 978 return s, [latex_symbols[s]]
979 else:
980 # If a user has partially typed a latex symbol, give them
981 # a full list of options \al -> [\aleph, \alpha]
982 matches = [k for k in latex_symbols if k.startswith(s)]
983 return s, matches
977 984 return u'', []
978 985
979 986 def dispatch_custom_completer(self, text):
980 987 #io.rprint("Custom! '%s' %s" % (text, self.custom_completers)) # dbg
981 988 line = self.line_buffer
982 989 if not line.strip():
983 990 return None
984 991
985 992 # Create a little structure to pass all the relevant information about
986 993 # the current completion to any custom completer.
987 994 event = Bunch()
988 995 event.line = line
989 996 event.symbol = text
990 997 cmd = line.split(None,1)[0]
991 998 event.command = cmd
992 999 event.text_until_cursor = self.text_until_cursor
993 1000
994 1001 #print "\ncustom:{%s]\n" % event # dbg
995 1002
996 1003 # for foo etc, try also to find completer for %foo
997 1004 if not cmd.startswith(self.magic_escape):
998 1005 try_magic = self.custom_completers.s_matches(
999 1006 self.magic_escape + cmd)
1000 1007 else:
1001 1008 try_magic = []
1002 1009
1003 1010 for c in itertools.chain(self.custom_completers.s_matches(cmd),
1004 1011 try_magic,
1005 1012 self.custom_completers.flat_matches(self.text_until_cursor)):
1006 1013 #print "try",c # dbg
1007 1014 try:
1008 1015 res = c(event)
1009 1016 if res:
1010 1017 # first, try case sensitive match
1011 1018 withcase = [r for r in res if r.startswith(text)]
1012 1019 if withcase:
1013 1020 return withcase
1014 1021 # if none, then case insensitive ones are ok too
1015 1022 text_low = text.lower()
1016 1023 return [r for r in res if r.lower().startswith(text_low)]
1017 1024 except TryNext:
1018 1025 pass
1019 1026
1020 1027 return None
1021 1028
1022 1029 def complete(self, text=None, line_buffer=None, cursor_pos=None):
1023 1030 """Find completions for the given text and line context.
1024 1031
1025 1032 Note that both the text and the line_buffer are optional, but at least
1026 1033 one of them must be given.
1027 1034
1028 1035 Parameters
1029 1036 ----------
1030 1037 text : string, optional
1031 1038 Text to perform the completion on. If not given, the line buffer
1032 1039 is split using the instance's CompletionSplitter object.
1033 1040
1034 1041 line_buffer : string, optional
1035 1042 If not given, the completer attempts to obtain the current line
1036 1043 buffer via readline. This keyword allows clients which are
1037 1044 requesting for text completions in non-readline contexts to inform
1038 1045 the completer of the entire text.
1039 1046
1040 1047 cursor_pos : int, optional
1041 1048 Index of the cursor in the full line buffer. Should be provided by
1042 1049 remote frontends where kernel has no access to frontend state.
1043 1050
1044 1051 Returns
1045 1052 -------
1046 1053 text : str
1047 1054 Text that was actually used in the completion.
1048 1055
1049 1056 matches : list
1050 1057 A list of completion matches.
1051 1058 """
1052 1059 # io.rprint('\nCOMP1 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
1053 1060
1054 1061 # if the cursor position isn't given, the only sane assumption we can
1055 1062 # make is that it's at the end of the line (the common case)
1056 1063 if cursor_pos is None:
1057 1064 cursor_pos = len(line_buffer) if text is None else len(text)
1058 1065
1059 1066 if PY3:
1060 1067 latex_text = text if not line_buffer else line_buffer[:cursor_pos]
1061 1068 latex_text, latex_matches = self.latex_matches(latex_text)
1062 1069 if latex_matches:
1063 1070 return latex_text, latex_matches
1064 1071
1065 1072 # if text is either None or an empty string, rely on the line buffer
1066 1073 if not text:
1067 1074 text = self.splitter.split_line(line_buffer, cursor_pos)
1068 1075
1069 1076 # If no line buffer is given, assume the input text is all there was
1070 1077 if line_buffer is None:
1071 1078 line_buffer = text
1072 1079
1073 1080 self.line_buffer = line_buffer
1074 1081 self.text_until_cursor = self.line_buffer[:cursor_pos]
1075 1082 # io.rprint('COMP2 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
1076 1083
1077 1084 # Start with a clean slate of completions
1078 1085 self.matches[:] = []
1079 1086 custom_res = self.dispatch_custom_completer(text)
1080 1087 if custom_res is not None:
1081 1088 # did custom completers produce something?
1082 1089 self.matches = custom_res
1083 1090 else:
1084 1091 # Extend the list of completions with the results of each
1085 1092 # matcher, so we return results to the user from all
1086 1093 # namespaces.
1087 1094 if self.merge_completions:
1088 1095 self.matches = []
1089 1096 for matcher in self.matchers:
1090 1097 try:
1091 1098 self.matches.extend(matcher(text))
1092 1099 except:
1093 1100 # Show the ugly traceback if the matcher causes an
1094 1101 # exception, but do NOT crash the kernel!
1095 1102 sys.excepthook(*sys.exc_info())
1096 1103 else:
1097 1104 for matcher in self.matchers:
1098 1105 self.matches = matcher(text)
1099 1106 if self.matches:
1100 1107 break
1101 1108 # FIXME: we should extend our api to return a dict with completions for
1102 1109 # different types of objects. The rlcomplete() method could then
1103 1110 # simply collapse the dict into a list for readline, but we'd have
1104 1111 # richer completion semantics in other evironments.
1105 1112
1106 1113 # use penalize_magics_key to put magics after variables with same name
1107 1114 self.matches = sorted(set(self.matches), key=penalize_magics_key)
1108 1115
1109 1116 #io.rprint('COMP TEXT, MATCHES: %r, %r' % (text, self.matches)) # dbg
1110 1117 return text, self.matches
1111 1118
1112 1119 def rlcomplete(self, text, state):
1113 1120 """Return the state-th possible completion for 'text'.
1114 1121
1115 1122 This is called successively with state == 0, 1, 2, ... until it
1116 1123 returns None. The completion should begin with 'text'.
1117 1124
1118 1125 Parameters
1119 1126 ----------
1120 1127 text : string
1121 1128 Text to perform the completion on.
1122 1129
1123 1130 state : int
1124 1131 Counter used by readline.
1125 1132 """
1126 1133 if state==0:
1127 1134
1128 1135 self.line_buffer = line_buffer = self.readline.get_line_buffer()
1129 1136 cursor_pos = self.readline.get_endidx()
1130 1137
1131 1138 #io.rprint("\nRLCOMPLETE: %r %r %r" %
1132 1139 # (text, line_buffer, cursor_pos) ) # dbg
1133 1140
1134 1141 # if there is only a tab on a line with only whitespace, instead of
1135 1142 # the mostly useless 'do you want to see all million completions'
1136 1143 # message, just do the right thing and give the user his tab!
1137 1144 # Incidentally, this enables pasting of tabbed text from an editor
1138 1145 # (as long as autoindent is off).
1139 1146
1140 1147 # It should be noted that at least pyreadline still shows file
1141 1148 # completions - is there a way around it?
1142 1149
1143 1150 # don't apply this on 'dumb' terminals, such as emacs buffers, so
1144 1151 # we don't interfere with their own tab-completion mechanism.
1145 1152 if not (self.dumb_terminal or line_buffer.strip()):
1146 1153 self.readline.insert_text('\t')
1147 1154 sys.stdout.flush()
1148 1155 return None
1149 1156
1150 1157 # Note: debugging exceptions that may occur in completion is very
1151 1158 # tricky, because readline unconditionally silences them. So if
1152 1159 # during development you suspect a bug in the completion code, turn
1153 1160 # this flag on temporarily by uncommenting the second form (don't
1154 1161 # flip the value in the first line, as the '# dbg' marker can be
1155 1162 # automatically detected and is used elsewhere).
1156 1163 DEBUG = False
1157 1164 #DEBUG = True # dbg
1158 1165 if DEBUG:
1159 1166 try:
1160 1167 self.complete(text, line_buffer, cursor_pos)
1161 1168 except:
1162 1169 import traceback; traceback.print_exc()
1163 1170 else:
1164 1171 # The normal production version is here
1165 1172
1166 1173 # This method computes the self.matches array
1167 1174 self.complete(text, line_buffer, cursor_pos)
1168 1175
1169 1176 try:
1170 1177 return self.matches[state]
1171 1178 except IndexError:
1172 1179 return None
General Comments 0
You need to be logged in to leave comments. Login now