##// END OF EJS Templates
add '=' to greedy completer delims...
klonuo -
Show More
@@ -1,933 +1,933 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 IPython Development Team
57 57 # Copyright (C) 2001 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
65 65 #-----------------------------------------------------------------------------
66 66 # Imports
67 67 #-----------------------------------------------------------------------------
68 68
69 69 import __builtin__
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 shlex
78 78 import sys
79 79
80 80 from IPython.config.configurable import Configurable
81 81 from IPython.core.error import TryNext
82 82 from IPython.core.inputsplitter 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 from IPython.utils.traitlets import CBool, Enum
88 88
89 89 #-----------------------------------------------------------------------------
90 90 # Globals
91 91 #-----------------------------------------------------------------------------
92 92
93 93 # Public API
94 94 __all__ = ['Completer','IPCompleter']
95 95
96 96 if sys.platform == 'win32':
97 97 PROTECTABLES = ' '
98 98 else:
99 99 PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&'
100 100
101 101 #-----------------------------------------------------------------------------
102 102 # Main functions and classes
103 103 #-----------------------------------------------------------------------------
104 104
105 105 def has_open_quotes(s):
106 106 """Return whether a string has open quotes.
107 107
108 108 This simply counts whether the number of quote characters of either type in
109 109 the string is odd.
110 110
111 111 Returns
112 112 -------
113 113 If there is an open quote, the quote character is returned. Else, return
114 114 False.
115 115 """
116 116 # We check " first, then ', so complex cases with nested quotes will get
117 117 # the " to take precedence.
118 118 if s.count('"') % 2:
119 119 return '"'
120 120 elif s.count("'") % 2:
121 121 return "'"
122 122 else:
123 123 return False
124 124
125 125
126 126 def protect_filename(s):
127 127 """Escape a string to protect certain characters."""
128 128
129 129 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
130 130 for ch in s])
131 131
132 132 def expand_user(path):
133 133 """Expand '~'-style usernames in strings.
134 134
135 135 This is similar to :func:`os.path.expanduser`, but it computes and returns
136 136 extra information that will be useful if the input was being used in
137 137 computing completions, and you wish to return the completions with the
138 138 original '~' instead of its expanded value.
139 139
140 140 Parameters
141 141 ----------
142 142 path : str
143 143 String to be expanded. If no ~ is present, the output is the same as the
144 144 input.
145 145
146 146 Returns
147 147 -------
148 148 newpath : str
149 149 Result of ~ expansion in the input path.
150 150 tilde_expand : bool
151 151 Whether any expansion was performed or not.
152 152 tilde_val : str
153 153 The value that ~ was replaced with.
154 154 """
155 155 # Default values
156 156 tilde_expand = False
157 157 tilde_val = ''
158 158 newpath = path
159 159
160 160 if path.startswith('~'):
161 161 tilde_expand = True
162 162 rest = len(path)-1
163 163 newpath = os.path.expanduser(path)
164 164 if rest:
165 165 tilde_val = newpath[:-rest]
166 166 else:
167 167 tilde_val = newpath
168 168
169 169 return newpath, tilde_expand, tilde_val
170 170
171 171
172 172 def compress_user(path, tilde_expand, tilde_val):
173 173 """Does the opposite of expand_user, with its outputs.
174 174 """
175 175 if tilde_expand:
176 176 return path.replace(tilde_val, '~')
177 177 else:
178 178 return path
179 179
180 180
181 181 class Bunch(object): pass
182 182
183 183
184 184 DELIMS = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?'
185 GREEDY_DELIMS = ' \r\n'
185 GREEDY_DELIMS = ' =\r\n'
186 186
187 187
188 188 class CompletionSplitter(object):
189 189 """An object to split an input line in a manner similar to readline.
190 190
191 191 By having our own implementation, we can expose readline-like completion in
192 192 a uniform manner to all frontends. This object only needs to be given the
193 193 line of text to be split and the cursor position on said line, and it
194 194 returns the 'word' to be completed on at the cursor after splitting the
195 195 entire line.
196 196
197 197 What characters are used as splitting delimiters can be controlled by
198 198 setting the `delims` attribute (this is a property that internally
199 199 automatically builds the necessary regular expression)"""
200 200
201 201 # Private interface
202 202
203 203 # A string of delimiter characters. The default value makes sense for
204 204 # IPython's most typical usage patterns.
205 205 _delims = DELIMS
206 206
207 207 # The expression (a normal string) to be compiled into a regular expression
208 208 # for actual splitting. We store it as an attribute mostly for ease of
209 209 # debugging, since this type of code can be so tricky to debug.
210 210 _delim_expr = None
211 211
212 212 # The regular expression that does the actual splitting
213 213 _delim_re = None
214 214
215 215 def __init__(self, delims=None):
216 216 delims = CompletionSplitter._delims if delims is None else delims
217 217 self.delims = delims
218 218
219 219 @property
220 220 def delims(self):
221 221 """Return the string of delimiter characters."""
222 222 return self._delims
223 223
224 224 @delims.setter
225 225 def delims(self, delims):
226 226 """Set the delimiters for line splitting."""
227 227 expr = '[' + ''.join('\\'+ c for c in delims) + ']'
228 228 self._delim_re = re.compile(expr)
229 229 self._delims = delims
230 230 self._delim_expr = expr
231 231
232 232 def split_line(self, line, cursor_pos=None):
233 233 """Split a line of text with a cursor at the given position.
234 234 """
235 235 l = line if cursor_pos is None else line[:cursor_pos]
236 236 return self._delim_re.split(l)[-1]
237 237
238 238
239 239 class Completer(Configurable):
240 240
241 241 greedy = CBool(False, config=True,
242 242 help="""Activate greedy completion
243 243
244 244 This will enable completion on elements of lists, results of function calls, etc.,
245 245 but can be unsafe because the code is actually evaluated on TAB.
246 246 """
247 247 )
248 248
249 249
250 250 def __init__(self, namespace=None, global_namespace=None, config=None, **kwargs):
251 251 """Create a new completer for the command line.
252 252
253 253 Completer(namespace=ns,global_namespace=ns2) -> completer instance.
254 254
255 255 If unspecified, the default namespace where completions are performed
256 256 is __main__ (technically, __main__.__dict__). Namespaces should be
257 257 given as dictionaries.
258 258
259 259 An optional second namespace can be given. This allows the completer
260 260 to handle cases where both the local and global scopes need to be
261 261 distinguished.
262 262
263 263 Completer instances should be used as the completion mechanism of
264 264 readline via the set_completer() call:
265 265
266 266 readline.set_completer(Completer(my_namespace).complete)
267 267 """
268 268
269 269 # Don't bind to namespace quite yet, but flag whether the user wants a
270 270 # specific namespace or to use __main__.__dict__. This will allow us
271 271 # to bind to __main__.__dict__ at completion time, not now.
272 272 if namespace is None:
273 273 self.use_main_ns = 1
274 274 else:
275 275 self.use_main_ns = 0
276 276 self.namespace = namespace
277 277
278 278 # The global namespace, if given, can be bound directly
279 279 if global_namespace is None:
280 280 self.global_namespace = {}
281 281 else:
282 282 self.global_namespace = global_namespace
283 283
284 284 super(Completer, self).__init__(config=config, **kwargs)
285 285
286 286 def complete(self, text, state):
287 287 """Return the next possible completion for 'text'.
288 288
289 289 This is called successively with state == 0, 1, 2, ... until it
290 290 returns None. The completion should begin with 'text'.
291 291
292 292 """
293 293 if self.use_main_ns:
294 294 self.namespace = __main__.__dict__
295 295
296 296 if state == 0:
297 297 if "." in text:
298 298 self.matches = self.attr_matches(text)
299 299 else:
300 300 self.matches = self.global_matches(text)
301 301 try:
302 302 return self.matches[state]
303 303 except IndexError:
304 304 return None
305 305
306 306 def global_matches(self, text):
307 307 """Compute matches when text is a simple name.
308 308
309 309 Return a list of all keywords, built-in functions and names currently
310 310 defined in self.namespace or self.global_namespace that match.
311 311
312 312 """
313 313 #print 'Completer->global_matches, txt=%r' % text # dbg
314 314 matches = []
315 315 match_append = matches.append
316 316 n = len(text)
317 317 for lst in [keyword.kwlist,
318 318 __builtin__.__dict__.keys(),
319 319 self.namespace.keys(),
320 320 self.global_namespace.keys()]:
321 321 for word in lst:
322 322 if word[:n] == text and word != "__builtins__":
323 323 match_append(word)
324 324 return matches
325 325
326 326 def attr_matches(self, text):
327 327 """Compute matches when text contains a dot.
328 328
329 329 Assuming the text is of the form NAME.NAME....[NAME], and is
330 330 evaluatable in self.namespace or self.global_namespace, it will be
331 331 evaluated and its attributes (as revealed by dir()) are used as
332 332 possible completions. (For class instances, class members are are
333 333 also considered.)
334 334
335 335 WARNING: this can still invoke arbitrary C code, if an object
336 336 with a __getattr__ hook is evaluated.
337 337
338 338 """
339 339
340 340 #io.rprint('Completer->attr_matches, txt=%r' % text) # dbg
341 341 # Another option, seems to work great. Catches things like ''.<tab>
342 342 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
343 343
344 344 if m:
345 345 expr, attr = m.group(1, 3)
346 346 elif self.greedy:
347 347 m2 = re.match(r"(.+)\.(\w*)$", self.line_buffer)
348 348 if not m2:
349 349 return []
350 350 expr, attr = m2.group(1,2)
351 351 else:
352 352 return []
353 353
354 354 try:
355 355 obj = eval(expr, self.namespace)
356 356 except:
357 357 try:
358 358 obj = eval(expr, self.global_namespace)
359 359 except:
360 360 return []
361 361
362 362 if self.limit_to__all__ and hasattr(obj, '__all__'):
363 363 words = get__all__entries(obj)
364 364 else:
365 365 words = dir2(obj)
366 366
367 367 try:
368 368 words = generics.complete_object(obj, words)
369 369 except TryNext:
370 370 pass
371 371 except Exception:
372 372 # Silence errors from completion function
373 373 #raise # dbg
374 374 pass
375 375 # Build match list to return
376 376 n = len(attr)
377 377 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
378 378 return res
379 379
380 380
381 381 def get__all__entries(obj):
382 382 """returns the strings in the __all__ attribute"""
383 383 try:
384 384 words = getattr(obj, '__all__')
385 385 except:
386 386 return []
387 387
388 388 return [w for w in words if isinstance(w, basestring)]
389 389
390 390
391 391 class IPCompleter(Completer):
392 392 """Extension of the completer class with IPython-specific features"""
393 393
394 394 def _greedy_changed(self, name, old, new):
395 395 """update the splitter and readline delims when greedy is changed"""
396 396 if new:
397 397 self.splitter.delims = GREEDY_DELIMS
398 398 else:
399 399 self.splitter.delims = DELIMS
400 400
401 401 if self.readline:
402 402 self.readline.set_completer_delims(self.splitter.delims)
403 403
404 404 merge_completions = CBool(True, config=True,
405 405 help="""Whether to merge completion results into a single list
406 406
407 407 If False, only the completion results from the first non-empty
408 408 completer will be returned.
409 409 """
410 410 )
411 411 omit__names = Enum((0,1,2), default_value=2, config=True,
412 412 help="""Instruct the completer to omit private method names
413 413
414 414 Specifically, when completing on ``object.<tab>``.
415 415
416 416 When 2 [default]: all names that start with '_' will be excluded.
417 417
418 418 When 1: all 'magic' names (``__foo__``) will be excluded.
419 419
420 420 When 0: nothing will be excluded.
421 421 """
422 422 )
423 423 limit_to__all__ = CBool(default_value=False, config=True,
424 424 help="""Instruct the completer to use __all__ for the completion
425 425
426 426 Specifically, when completing on ``object.<tab>``.
427 427
428 428 When True: only those names in obj.__all__ will be included.
429 429
430 430 When False [default]: the __all__ attribute is ignored
431 431 """
432 432 )
433 433
434 434 def __init__(self, shell=None, namespace=None, global_namespace=None,
435 435 alias_table=None, use_readline=True,
436 436 config=None, **kwargs):
437 437 """IPCompleter() -> completer
438 438
439 439 Return a completer object suitable for use by the readline library
440 440 via readline.set_completer().
441 441
442 442 Inputs:
443 443
444 444 - shell: a pointer to the ipython shell itself. This is needed
445 445 because this completer knows about magic functions, and those can
446 446 only be accessed via the ipython instance.
447 447
448 448 - namespace: an optional dict where completions are performed.
449 449
450 450 - global_namespace: secondary optional dict for completions, to
451 451 handle cases (such as IPython embedded inside functions) where
452 452 both Python scopes are visible.
453 453
454 454 - If alias_table is supplied, it should be a dictionary of aliases
455 455 to complete.
456 456
457 457 use_readline : bool, optional
458 458 If true, use the readline library. This completer can still function
459 459 without readline, though in that case callers must provide some extra
460 460 information on each call about the current line."""
461 461
462 462 self.magic_escape = ESC_MAGIC
463 463 self.splitter = CompletionSplitter()
464 464
465 465 # Readline configuration, only used by the rlcompleter method.
466 466 if use_readline:
467 467 # We store the right version of readline so that later code
468 468 import IPython.utils.rlineimpl as readline
469 469 self.readline = readline
470 470 else:
471 471 self.readline = None
472 472
473 473 # _greedy_changed() depends on splitter and readline being defined:
474 474 Completer.__init__(self, namespace=namespace, global_namespace=global_namespace,
475 475 config=config, **kwargs)
476 476
477 477 # List where completion matches will be stored
478 478 self.matches = []
479 479 self.shell = shell
480 480 if alias_table is None:
481 481 alias_table = {}
482 482 self.alias_table = alias_table
483 483 # Regexp to split filenames with spaces in them
484 484 self.space_name_re = re.compile(r'([^\\] )')
485 485 # Hold a local ref. to glob.glob for speed
486 486 self.glob = glob.glob
487 487
488 488 # Determine if we are running on 'dumb' terminals, like (X)Emacs
489 489 # buffers, to avoid completion problems.
490 490 term = os.environ.get('TERM','xterm')
491 491 self.dumb_terminal = term in ['dumb','emacs']
492 492
493 493 # Special handling of backslashes needed in win32 platforms
494 494 if sys.platform == "win32":
495 495 self.clean_glob = self._clean_glob_win32
496 496 else:
497 497 self.clean_glob = self._clean_glob
498 498
499 499 # All active matcher routines for completion
500 500 self.matchers = [self.python_matches,
501 501 self.file_matches,
502 502 self.magic_matches,
503 503 self.alias_matches,
504 504 self.python_func_kw_matches,
505 505 ]
506 506
507 507 def all_completions(self, text):
508 508 """
509 509 Wrapper around the complete method for the benefit of emacs
510 510 and pydb.
511 511 """
512 512 return self.complete(text)[1]
513 513
514 514 def _clean_glob(self,text):
515 515 return self.glob("%s*" % text)
516 516
517 517 def _clean_glob_win32(self,text):
518 518 return [f.replace("\\","/")
519 519 for f in self.glob("%s*" % text)]
520 520
521 521 def file_matches(self, text):
522 522 """Match filenames, expanding ~USER type strings.
523 523
524 524 Most of the seemingly convoluted logic in this completer is an
525 525 attempt to handle filenames with spaces in them. And yet it's not
526 526 quite perfect, because Python's readline doesn't expose all of the
527 527 GNU readline details needed for this to be done correctly.
528 528
529 529 For a filename with a space in it, the printed completions will be
530 530 only the parts after what's already been typed (instead of the
531 531 full completions, as is normally done). I don't think with the
532 532 current (as of Python 2.3) Python readline it's possible to do
533 533 better."""
534 534
535 535 #io.rprint('Completer->file_matches: <%r>' % text) # dbg
536 536
537 537 # chars that require escaping with backslash - i.e. chars
538 538 # that readline treats incorrectly as delimiters, but we
539 539 # don't want to treat as delimiters in filename matching
540 540 # when escaped with backslash
541 541 if text.startswith('!'):
542 542 text = text[1:]
543 543 text_prefix = '!'
544 544 else:
545 545 text_prefix = ''
546 546
547 547 text_until_cursor = self.text_until_cursor
548 548 # track strings with open quotes
549 549 open_quotes = has_open_quotes(text_until_cursor)
550 550
551 551 if '(' in text_until_cursor or '[' in text_until_cursor:
552 552 lsplit = text
553 553 else:
554 554 try:
555 555 # arg_split ~ shlex.split, but with unicode bugs fixed by us
556 556 lsplit = arg_split(text_until_cursor)[-1]
557 557 except ValueError:
558 558 # typically an unmatched ", or backslash without escaped char.
559 559 if open_quotes:
560 560 lsplit = text_until_cursor.split(open_quotes)[-1]
561 561 else:
562 562 return []
563 563 except IndexError:
564 564 # tab pressed on empty line
565 565 lsplit = ""
566 566
567 567 if not open_quotes and lsplit != protect_filename(lsplit):
568 568 # if protectables are found, do matching on the whole escaped name
569 569 has_protectables = True
570 570 text0,text = text,lsplit
571 571 else:
572 572 has_protectables = False
573 573 text = os.path.expanduser(text)
574 574
575 575 if text == "":
576 576 return [text_prefix + protect_filename(f) for f in self.glob("*")]
577 577
578 578 # Compute the matches from the filesystem
579 579 m0 = self.clean_glob(text.replace('\\',''))
580 580
581 581 if has_protectables:
582 582 # If we had protectables, we need to revert our changes to the
583 583 # beginning of filename so that we don't double-write the part
584 584 # of the filename we have so far
585 585 len_lsplit = len(lsplit)
586 586 matches = [text_prefix + text0 +
587 587 protect_filename(f[len_lsplit:]) for f in m0]
588 588 else:
589 589 if open_quotes:
590 590 # if we have a string with an open quote, we don't need to
591 591 # protect the names at all (and we _shouldn't_, as it
592 592 # would cause bugs when the filesystem call is made).
593 593 matches = m0
594 594 else:
595 595 matches = [text_prefix +
596 596 protect_filename(f) for f in m0]
597 597
598 598 #io.rprint('mm', matches) # dbg
599 599
600 600 # Mark directories in input list by appending '/' to their names.
601 601 matches = [x+'/' if os.path.isdir(x) else x for x in matches]
602 602 return matches
603 603
604 604 def magic_matches(self, text):
605 605 """Match magics"""
606 606 #print 'Completer->magic_matches:',text,'lb',self.text_until_cursor # dbg
607 607 # Get all shell magics now rather than statically, so magics loaded at
608 608 # runtime show up too.
609 609 lsm = self.shell.magics_manager.lsmagic()
610 610 line_magics = lsm['line']
611 611 cell_magics = lsm['cell']
612 612 pre = self.magic_escape
613 613 pre2 = pre+pre
614 614
615 615 # Completion logic:
616 616 # - user gives %%: only do cell magics
617 617 # - user gives %: do both line and cell magics
618 618 # - no prefix: do both
619 619 # In other words, line magics are skipped if the user gives %% explicitly
620 620 bare_text = text.lstrip(pre)
621 621 comp = [ pre2+m for m in cell_magics if m.startswith(bare_text)]
622 622 if not text.startswith(pre2):
623 623 comp += [ pre+m for m in line_magics if m.startswith(bare_text)]
624 624 return comp
625 625
626 626 def alias_matches(self, text):
627 627 """Match internal system aliases"""
628 628 #print 'Completer->alias_matches:',text,'lb',self.text_until_cursor # dbg
629 629
630 630 # if we are not in the first 'item', alias matching
631 631 # doesn't make sense - unless we are starting with 'sudo' command.
632 632 main_text = self.text_until_cursor.lstrip()
633 633 if ' ' in main_text and not main_text.startswith('sudo'):
634 634 return []
635 635 text = os.path.expanduser(text)
636 636 aliases = self.alias_table.keys()
637 637 if text == '':
638 638 return aliases
639 639 else:
640 640 return [a for a in aliases if a.startswith(text)]
641 641
642 642 def python_matches(self,text):
643 643 """Match attributes or global python names"""
644 644
645 645 #io.rprint('Completer->python_matches, txt=%r' % text) # dbg
646 646 if "." in text:
647 647 try:
648 648 matches = self.attr_matches(text)
649 649 if text.endswith('.') and self.omit__names:
650 650 if self.omit__names == 1:
651 651 # true if txt is _not_ a __ name, false otherwise:
652 652 no__name = (lambda txt:
653 653 re.match(r'.*\.__.*?__',txt) is None)
654 654 else:
655 655 # true if txt is _not_ a _ name, false otherwise:
656 656 no__name = (lambda txt:
657 657 re.match(r'.*\._.*?',txt) is None)
658 658 matches = filter(no__name, matches)
659 659 except NameError:
660 660 # catches <undefined attributes>.<tab>
661 661 matches = []
662 662 else:
663 663 matches = self.global_matches(text)
664 664
665 665 return matches
666 666
667 667 def _default_arguments(self, obj):
668 668 """Return the list of default arguments of obj if it is callable,
669 669 or empty list otherwise."""
670 670
671 671 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
672 672 # for classes, check for __init__,__new__
673 673 if inspect.isclass(obj):
674 674 obj = (getattr(obj,'__init__',None) or
675 675 getattr(obj,'__new__',None))
676 676 # for all others, check if they are __call__able
677 677 elif hasattr(obj, '__call__'):
678 678 obj = obj.__call__
679 679 # XXX: is there a way to handle the builtins ?
680 680 try:
681 681 args,_,_1,defaults = inspect.getargspec(obj)
682 682 if defaults:
683 683 return args[-len(defaults):]
684 684 except TypeError: pass
685 685 return []
686 686
687 687 def python_func_kw_matches(self,text):
688 688 """Match named parameters (kwargs) of the last open function"""
689 689
690 690 if "." in text: # a parameter cannot be dotted
691 691 return []
692 692 try: regexp = self.__funcParamsRegex
693 693 except AttributeError:
694 694 regexp = self.__funcParamsRegex = re.compile(r'''
695 695 '.*?(?<!\\)' | # single quoted strings or
696 696 ".*?(?<!\\)" | # double quoted strings or
697 697 \w+ | # identifier
698 698 \S # other characters
699 699 ''', re.VERBOSE | re.DOTALL)
700 700 # 1. find the nearest identifier that comes before an unclosed
701 701 # parenthesis before the cursor
702 702 # e.g. for "foo (1+bar(x), pa<cursor>,a=1)", the candidate is "foo"
703 703 tokens = regexp.findall(self.text_until_cursor)
704 704 tokens.reverse()
705 705 iterTokens = iter(tokens); openPar = 0
706 706 for token in iterTokens:
707 707 if token == ')':
708 708 openPar -= 1
709 709 elif token == '(':
710 710 openPar += 1
711 711 if openPar > 0:
712 712 # found the last unclosed parenthesis
713 713 break
714 714 else:
715 715 return []
716 716 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
717 717 ids = []
718 718 isId = re.compile(r'\w+$').match
719 719 while True:
720 720 try:
721 721 ids.append(next(iterTokens))
722 722 if not isId(ids[-1]):
723 723 ids.pop(); break
724 724 if not next(iterTokens) == '.':
725 725 break
726 726 except StopIteration:
727 727 break
728 728 # lookup the candidate callable matches either using global_matches
729 729 # or attr_matches for dotted names
730 730 if len(ids) == 1:
731 731 callableMatches = self.global_matches(ids[0])
732 732 else:
733 733 callableMatches = self.attr_matches('.'.join(ids[::-1]))
734 734 argMatches = []
735 735 for callableMatch in callableMatches:
736 736 try:
737 737 namedArgs = self._default_arguments(eval(callableMatch,
738 738 self.namespace))
739 739 except:
740 740 continue
741 741 for namedArg in namedArgs:
742 742 if namedArg.startswith(text):
743 743 argMatches.append("%s=" %namedArg)
744 744 return argMatches
745 745
746 746 def dispatch_custom_completer(self, text):
747 747 #io.rprint("Custom! '%s' %s" % (text, self.custom_completers)) # dbg
748 748 line = self.line_buffer
749 749 if not line.strip():
750 750 return None
751 751
752 752 # Create a little structure to pass all the relevant information about
753 753 # the current completion to any custom completer.
754 754 event = Bunch()
755 755 event.line = line
756 756 event.symbol = text
757 757 cmd = line.split(None,1)[0]
758 758 event.command = cmd
759 759 event.text_until_cursor = self.text_until_cursor
760 760
761 761 #print "\ncustom:{%s]\n" % event # dbg
762 762
763 763 # for foo etc, try also to find completer for %foo
764 764 if not cmd.startswith(self.magic_escape):
765 765 try_magic = self.custom_completers.s_matches(
766 766 self.magic_escape + cmd)
767 767 else:
768 768 try_magic = []
769 769
770 770 for c in itertools.chain(self.custom_completers.s_matches(cmd),
771 771 try_magic,
772 772 self.custom_completers.flat_matches(self.text_until_cursor)):
773 773 #print "try",c # dbg
774 774 try:
775 775 res = c(event)
776 776 if res:
777 777 # first, try case sensitive match
778 778 withcase = [r for r in res if r.startswith(text)]
779 779 if withcase:
780 780 return withcase
781 781 # if none, then case insensitive ones are ok too
782 782 text_low = text.lower()
783 783 return [r for r in res if r.lower().startswith(text_low)]
784 784 except TryNext:
785 785 pass
786 786
787 787 return None
788 788
789 789 def complete(self, text=None, line_buffer=None, cursor_pos=None):
790 790 """Find completions for the given text and line context.
791 791
792 792 This is called successively with state == 0, 1, 2, ... until it
793 793 returns None. The completion should begin with 'text'.
794 794
795 795 Note that both the text and the line_buffer are optional, but at least
796 796 one of them must be given.
797 797
798 798 Parameters
799 799 ----------
800 800 text : string, optional
801 801 Text to perform the completion on. If not given, the line buffer
802 802 is split using the instance's CompletionSplitter object.
803 803
804 804 line_buffer : string, optional
805 805 If not given, the completer attempts to obtain the current line
806 806 buffer via readline. This keyword allows clients which are
807 807 requesting for text completions in non-readline contexts to inform
808 808 the completer of the entire text.
809 809
810 810 cursor_pos : int, optional
811 811 Index of the cursor in the full line buffer. Should be provided by
812 812 remote frontends where kernel has no access to frontend state.
813 813
814 814 Returns
815 815 -------
816 816 text : str
817 817 Text that was actually used in the completion.
818 818
819 819 matches : list
820 820 A list of completion matches.
821 821 """
822 822 #io.rprint('\nCOMP1 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
823 823
824 824 # if the cursor position isn't given, the only sane assumption we can
825 825 # make is that it's at the end of the line (the common case)
826 826 if cursor_pos is None:
827 827 cursor_pos = len(line_buffer) if text is None else len(text)
828 828
829 829 # if text is either None or an empty string, rely on the line buffer
830 830 if not text:
831 831 text = self.splitter.split_line(line_buffer, cursor_pos)
832 832
833 833 # If no line buffer is given, assume the input text is all there was
834 834 if line_buffer is None:
835 835 line_buffer = text
836 836
837 837 self.line_buffer = line_buffer
838 838 self.text_until_cursor = self.line_buffer[:cursor_pos]
839 839 #io.rprint('COMP2 %r %r %r' % (text, line_buffer, cursor_pos)) # dbg
840 840
841 841 # Start with a clean slate of completions
842 842 self.matches[:] = []
843 843 custom_res = self.dispatch_custom_completer(text)
844 844 if custom_res is not None:
845 845 # did custom completers produce something?
846 846 self.matches = custom_res
847 847 else:
848 848 # Extend the list of completions with the results of each
849 849 # matcher, so we return results to the user from all
850 850 # namespaces.
851 851 if self.merge_completions:
852 852 self.matches = []
853 853 for matcher in self.matchers:
854 854 try:
855 855 self.matches.extend(matcher(text))
856 856 except:
857 857 # Show the ugly traceback if the matcher causes an
858 858 # exception, but do NOT crash the kernel!
859 859 sys.excepthook(*sys.exc_info())
860 860 else:
861 861 for matcher in self.matchers:
862 862 self.matches = matcher(text)
863 863 if self.matches:
864 864 break
865 865 # FIXME: we should extend our api to return a dict with completions for
866 866 # different types of objects. The rlcomplete() method could then
867 867 # simply collapse the dict into a list for readline, but we'd have
868 868 # richer completion semantics in other evironments.
869 869 self.matches = sorted(set(self.matches))
870 870 #io.rprint('COMP TEXT, MATCHES: %r, %r' % (text, self.matches)) # dbg
871 871 return text, self.matches
872 872
873 873 def rlcomplete(self, text, state):
874 874 """Return the state-th possible completion for 'text'.
875 875
876 876 This is called successively with state == 0, 1, 2, ... until it
877 877 returns None. The completion should begin with 'text'.
878 878
879 879 Parameters
880 880 ----------
881 881 text : string
882 882 Text to perform the completion on.
883 883
884 884 state : int
885 885 Counter used by readline.
886 886 """
887 887 if state==0:
888 888
889 889 self.line_buffer = line_buffer = self.readline.get_line_buffer()
890 890 cursor_pos = self.readline.get_endidx()
891 891
892 892 #io.rprint("\nRLCOMPLETE: %r %r %r" %
893 893 # (text, line_buffer, cursor_pos) ) # dbg
894 894
895 895 # if there is only a tab on a line with only whitespace, instead of
896 896 # the mostly useless 'do you want to see all million completions'
897 897 # message, just do the right thing and give the user his tab!
898 898 # Incidentally, this enables pasting of tabbed text from an editor
899 899 # (as long as autoindent is off).
900 900
901 901 # It should be noted that at least pyreadline still shows file
902 902 # completions - is there a way around it?
903 903
904 904 # don't apply this on 'dumb' terminals, such as emacs buffers, so
905 905 # we don't interfere with their own tab-completion mechanism.
906 906 if not (self.dumb_terminal or line_buffer.strip()):
907 907 self.readline.insert_text('\t')
908 908 sys.stdout.flush()
909 909 return None
910 910
911 911 # Note: debugging exceptions that may occur in completion is very
912 912 # tricky, because readline unconditionally silences them. So if
913 913 # during development you suspect a bug in the completion code, turn
914 914 # this flag on temporarily by uncommenting the second form (don't
915 915 # flip the value in the first line, as the '# dbg' marker can be
916 916 # automatically detected and is used elsewhere).
917 917 DEBUG = False
918 918 #DEBUG = True # dbg
919 919 if DEBUG:
920 920 try:
921 921 self.complete(text, line_buffer, cursor_pos)
922 922 except:
923 923 import traceback; traceback.print_exc()
924 924 else:
925 925 # The normal production version is here
926 926
927 927 # This method computes the self.matches array
928 928 self.complete(text, line_buffer, cursor_pos)
929 929
930 930 try:
931 931 return self.matches[state]
932 932 except IndexError:
933 933 return None
General Comments 0
You need to be logged in to leave comments. Login now