##// END OF EJS Templates
- Big iplib cleanups, moved all tab-completion functionality to its own module...
fperez -
Show More
This diff has been collapsed as it changes many lines, (523 lines changed) Show them Hide them
@@ -0,0 +1,523 b''
1 """Word completion for IPython.
2
3 This module is a fork of the rlcompleter module in the Python standard
4 library. The original enhancements made to rlcompleter have been sent
5 upstream and were accepted as of Python 2.3, but we need a lot more
6 functionality specific to IPython, so this module will continue to live as an
7 IPython-specific utility.
8
9 ---------------------------------------------------------------------------
10 Original rlcompleter documentation:
11
12 This requires the latest extension to the readline module (the
13 completes keywords, built-ins and globals in __main__; when completing
14 NAME.NAME..., it evaluates (!) the expression up to the last dot and
15 completes its attributes.
16
17 It's very cool to do "import string" type "string.", hit the
18 completion key (twice), and see the list of names defined by the
19 string module!
20
21 Tip: to use the tab key as the completion key, call
22
23 readline.parse_and_bind("tab: complete")
24
25 Notes:
26
27 - Exceptions raised by the completer function are *ignored* (and
28 generally cause the completion to fail). This is a feature -- since
29 readline sets the tty device in raw (or cbreak) mode, printing a
30 traceback wouldn't work well without some complicated hoopla to save,
31 reset and restore the tty state.
32
33 - The evaluation of the NAME.NAME... form may cause arbitrary
34 application defined code to be executed if an object with a
35 __getattr__ hook is found. Since it is the responsibility of the
36 application (or the user) to enable this feature, I consider this an
37 acceptable risk. More complicated expressions (e.g. function calls or
38 indexing operations) are *not* evaluated.
39
40 - GNU readline is also used by the built-in functions input() and
41 raw_input(), and thus these also benefit/suffer from the completer
42 features. Clearly an interactive application can benefit by
43 specifying its own completer function and using raw_input() for all
44 its input.
45
46 - When the original stdin is not a tty device, GNU readline is never
47 used, and this module (and the readline module) are silently inactive.
48
49 """
50
51 #*****************************************************************************
52 #
53 # Since this file is essentially a minimally modified copy of the rlcompleter
54 # module which is part of the standard Python distribution, I assume that the
55 # proper procedure is to maintain its copyright as belonging to the Python
56 # Software Foundation (in addition to my own, for all new code).
57 #
58 # Copyright (C) 2001 Python Software Foundation, www.python.org
59 # Copyright (C) 2001-2005 Fernando Perez. <fperez@colorado.edu>
60 #
61 # Distributed under the terms of the BSD License. The full license is in
62 # the file COPYING, distributed as part of this software.
63 #
64 #*****************************************************************************
65
66 import __builtin__
67 import __main__
68 import glob
69 import keyword
70 import os
71 import re
72 import readline
73 import sys
74 import types
75
76 from IPython.genutils import shlex_split
77
78 __all__ = ['Completer','IPCompleter']
79
80 def get_class_members(klass):
81 ret = dir(klass)
82 if hasattr(klass,'__bases__'):
83 for base in klass.__bases__:
84 ret.extend(get_class_members(base))
85 return ret
86
87 class Completer:
88 def __init__(self,namespace=None,global_namespace=None):
89 """Create a new completer for the command line.
90
91 Completer([namespace,global_namespace]) -> completer instance.
92
93 If unspecified, the default namespace where completions are performed
94 is __main__ (technically, __main__.__dict__). Namespaces should be
95 given as dictionaries.
96
97 An optional second namespace can be given. This allows the completer
98 to handle cases where both the local and global scopes need to be
99 distinguished.
100
101 Completer instances should be used as the completion mechanism of
102 readline via the set_completer() call:
103
104 readline.set_completer(Completer(my_namespace).complete)
105 """
106
107 if namespace and type(namespace) != types.DictType:
108 raise TypeError,'namespace must be a dictionary'
109
110 if global_namespace and type(global_namespace) != types.DictType:
111 raise TypeError,'global_namespace must be a dictionary'
112
113 # Don't bind to namespace quite yet, but flag whether the user wants a
114 # specific namespace or to use __main__.__dict__. This will allow us
115 # to bind to __main__.__dict__ at completion time, not now.
116 if namespace is None:
117 self.use_main_ns = 1
118 else:
119 self.use_main_ns = 0
120 self.namespace = namespace
121
122 # The global namespace, if given, can be bound directly
123 if global_namespace is None:
124 self.global_namespace = {}
125 else:
126 self.global_namespace = global_namespace
127
128 def complete(self, text, state):
129 """Return the next possible completion for 'text'.
130
131 This is called successively with state == 0, 1, 2, ... until it
132 returns None. The completion should begin with 'text'.
133
134 """
135 if self.use_main_ns:
136 self.namespace = __main__.__dict__
137
138 if state == 0:
139 if "." in text:
140 self.matches = self.attr_matches(text)
141 else:
142 self.matches = self.global_matches(text)
143 try:
144 return self.matches[state]
145 except IndexError:
146 return None
147
148 def global_matches(self, text):
149 """Compute matches when text is a simple name.
150
151 Return a list of all keywords, built-in functions and names currently
152 defined in self.namespace or self.global_namespace that match.
153
154 """
155 matches = []
156 match_append = matches.append
157 n = len(text)
158 for lst in [keyword.kwlist,
159 __builtin__.__dict__.keys(),
160 self.namespace.keys(),
161 self.global_namespace.keys()]:
162 for word in lst:
163 if word[:n] == text and word != "__builtins__":
164 match_append(word)
165 return matches
166
167 def attr_matches(self, text):
168 """Compute matches when text contains a dot.
169
170 Assuming the text is of the form NAME.NAME....[NAME], and is
171 evaluatable in self.namespace or self.global_namespace, it will be
172 evaluated and its attributes (as revealed by dir()) are used as
173 possible completions. (For class instances, class members are are
174 also considered.)
175
176 WARNING: this can still invoke arbitrary C code, if an object
177 with a __getattr__ hook is evaluated.
178
179 """
180 import re
181
182 # Another option, seems to work great. Catches things like ''.<tab>
183 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
184
185 if not m:
186 return []
187 expr, attr = m.group(1, 3)
188 try:
189 object = eval(expr, self.namespace)
190 except:
191 object = eval(expr, self.global_namespace)
192 words = [w for w in dir(object) if isinstance(w, basestring)]
193 if hasattr(object,'__class__'):
194 words.append('__class__')
195 words.extend(get_class_members(object.__class__))
196 n = len(attr)
197 matches = []
198 for word in words:
199 if word[:n] == attr and word != "__builtins__":
200 matches.append("%s.%s" % (expr, word))
201 return matches
202
203 class IPCompleter(Completer):
204 """Extension of the completer class with IPython-specific features"""
205
206 def __init__(self,shell,namespace=None,global_namespace=None,
207 omit__names=0,alias_table=None):
208 """IPCompleter() -> completer
209
210 Return a completer object suitable for use by the readline library
211 via readline.set_completer().
212
213 Inputs:
214
215 - shell: a pointer to the ipython shell itself. This is needed
216 because this completer knows about magic functions, and those can
217 only be accessed via the ipython instance.
218
219 - namespace: an optional dict where completions are performed.
220
221 - global_namespace: secondary optional dict for completions, to
222 handle cases (such as IPython embedded inside functions) where
223 both Python scopes are visible.
224
225 - The optional omit__names parameter sets the completer to omit the
226 'magic' names (__magicname__) for python objects unless the text
227 to be completed explicitly starts with one or more underscores.
228
229 - If alias_table is supplied, it should be a dictionary of aliases
230 to complete. """
231
232 Completer.__init__(self,namespace,global_namespace)
233 self.magic_prefix = shell.name+'.magic_'
234 self.magic_escape = shell.ESC_MAGIC
235 self.readline = readline
236 delims = self.readline.get_completer_delims()
237 delims = delims.replace(self.magic_escape,'')
238 self.readline.set_completer_delims(delims)
239 self.get_line_buffer = self.readline.get_line_buffer
240 self.omit__names = omit__names
241 self.merge_completions = shell.rc.readline_merge_completions
242
243 if alias_table is None:
244 alias_table = {}
245 self.alias_table = alias_table
246 # Regexp to split filenames with spaces in them
247 self.space_name_re = re.compile(r'([^\\] )')
248 # Hold a local ref. to glob.glob for speed
249 self.glob = glob.glob
250 # Special handling of backslashes needed in win32 platforms
251 if sys.platform == "win32":
252 self.clean_glob = self._clean_glob_win32
253 else:
254 self.clean_glob = self._clean_glob
255 self.matchers = [self.python_matches,
256 self.file_matches,
257 self.alias_matches,
258 self.python_func_kw_matches]
259
260 # Code contributed by Alex Schmolck, for ipython/emacs integration
261 def all_completions(self, text):
262 """Return all possible completions for the benefit of emacs."""
263
264 completions = []
265 comp_append = completions.append
266 try:
267 for i in xrange(sys.maxint):
268 res = self.complete(text, i)
269
270 if not res: break
271
272 comp_append(res)
273 #XXX workaround for ``notDefined.<tab>``
274 except NameError:
275 pass
276 return completions
277 # /end Alex Schmolck code.
278
279 def _clean_glob(self,text):
280 return self.glob("%s*" % text)
281
282 def _clean_glob_win32(self,text):
283 return [f.replace("\\","/")
284 for f in self.glob("%s*" % text)]
285
286 def file_matches(self, text):
287 """Match filneames, expanding ~USER type strings.
288
289 Most of the seemingly convoluted logic in this completer is an
290 attempt to handle filenames with spaces in them. And yet it's not
291 quite perfect, because Python's readline doesn't expose all of the
292 GNU readline details needed for this to be done correctly.
293
294 For a filename with a space in it, the printed completions will be
295 only the parts after what's already been typed (instead of the
296 full completions, as is normally done). I don't think with the
297 current (as of Python 2.3) Python readline it's possible to do
298 better."""
299
300 #print 'Completer->file_matches: <%s>' % text # dbg
301
302 # chars that require escaping with backslash - i.e. chars
303 # that readline treats incorrectly as delimiters, but we
304 # don't want to treat as delimiters in filename matching
305 # when escaped with backslash
306
307 protectables = ' ()[]{}'
308
309 def protect_filename(s):
310 return "".join([(ch in protectables and '\\' + ch or ch)
311 for ch in s])
312
313 lbuf = self.get_line_buffer()[:self.readline.get_endidx()]
314 open_quotes = 0 # track strings with open quotes
315 try:
316 lsplit = shlex_split(lbuf)[-1]
317 except ValueError:
318 # typically an unmatched ", or backslash without escaped char.
319 if lbuf.count('"')==1:
320 open_quotes = 1
321 lsplit = lbuf.split('"')[-1]
322 elif lbuf.count("'")==1:
323 open_quotes = 1
324 lsplit = lbuf.split("'")[-1]
325 else:
326 return None
327 except IndexError:
328 # tab pressed on empty line
329 lsplit = ""
330
331 if lsplit != protect_filename(lsplit):
332 # if protectables are found, do matching on the whole escaped
333 # name
334 has_protectables = 1
335 text0,text = text,lsplit
336 else:
337 has_protectables = 0
338 text = os.path.expanduser(text)
339
340 if text == "":
341 return [protect_filename(f) for f in self.glob("*")]
342
343 m0 = self.clean_glob(text.replace('\\',''))
344 if has_protectables:
345 # If we had protectables, we need to revert our changes to the
346 # beginning of filename so that we don't double-write the part
347 # of the filename we have so far
348 len_lsplit = len(lsplit)
349 matches = [text0 + protect_filename(f[len_lsplit:]) for f in m0]
350 else:
351 if open_quotes:
352 # if we have a string with an open quote, we don't need to
353 # protect the names at all (and we _shouldn't_, as it
354 # would cause bugs when the filesystem call is made).
355 matches = m0
356 else:
357 matches = [protect_filename(f) for f in m0]
358 if len(matches) == 1 and os.path.isdir(matches[0]):
359 # Takes care of links to directories also. Use '/'
360 # explicitly, even under Windows, so that name completions
361 # don't end up escaped.
362 matches[0] += '/'
363 return matches
364
365 def alias_matches(self, text):
366 """Match internal system aliases"""
367 #print 'Completer->alias_matches:',text # dbg
368 text = os.path.expanduser(text)
369 aliases = self.alias_table.keys()
370 if text == "":
371 return aliases
372 else:
373 return [alias for alias in aliases if alias.startswith(text)]
374
375 def python_matches(self,text):
376 """Match attributes or global python names"""
377 #print 'Completer->python_matches' # dbg
378 if "." in text:
379 try:
380 matches = self.attr_matches(text)
381 if text.endswith('.') and self.omit__names:
382 if self.omit__names == 1:
383 # true if txt is _not_ a __ name, false otherwise:
384 no__name = (lambda txt:
385 re.match(r'.*\.__.*?__',txt) is None)
386 else:
387 # true if txt is _not_ a _ name, false otherwise:
388 no__name = (lambda txt:
389 re.match(r'.*\._.*?',txt) is None)
390 matches = filter(no__name, matches)
391 except NameError:
392 # catches <undefined attributes>.<tab>
393 matches = []
394 else:
395 matches = self.global_matches(text)
396 # this is so completion finds magics when automagic is on:
397 if matches == [] and not text.startswith(os.sep):
398 matches = self.attr_matches(self.magic_prefix+text)
399 return matches
400
401 def _default_arguments(self, obj):
402 """Return the list of default arguments of obj if it is callable,
403 or empty list otherwise."""
404
405 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
406 # for classes, check for __init__,__new__
407 if inspect.isclass(obj):
408 obj = (getattr(obj,'__init__',None) or
409 getattr(obj,'__new__',None))
410 # for all others, check if they are __call__able
411 elif hasattr(obj, '__call__'):
412 obj = obj.__call__
413 # XXX: is there a way to handle the builtins ?
414 try:
415 args,_,_1,defaults = inspect.getargspec(obj)
416 if defaults:
417 return args[-len(defaults):]
418 except TypeError: pass
419 return []
420
421 def python_func_kw_matches(self,text):
422 """Match named parameters (kwargs) of the last open function"""
423
424 if "." in text: # a parameter cannot be dotted
425 return []
426 try: regexp = self.__funcParamsRegex
427 except AttributeError:
428 regexp = self.__funcParamsRegex = re.compile(r'''
429 '.*?' | # single quoted strings or
430 ".*?" | # double quoted strings or
431 \w+ | # identifier
432 \S # other characters
433 ''', re.VERBOSE | re.DOTALL)
434 # 1. find the nearest identifier that comes before an unclosed
435 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
436 tokens = regexp.findall(self.get_line_buffer())
437 tokens.reverse()
438 iterTokens = iter(tokens); openPar = 0
439 for token in iterTokens:
440 if token == ')':
441 openPar -= 1
442 elif token == '(':
443 openPar += 1
444 if openPar > 0:
445 # found the last unclosed parenthesis
446 break
447 else:
448 return []
449 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
450 ids = []
451 isId = re.compile(r'\w+$').match
452 while True:
453 try:
454 ids.append(iterTokens.next())
455 if not isId(ids[-1]):
456 ids.pop(); break
457 if not iterTokens.next() == '.':
458 break
459 except StopIteration:
460 break
461 # lookup the candidate callable matches either using global_matches
462 # or attr_matches for dotted names
463 if len(ids) == 1:
464 callableMatches = self.global_matches(ids[0])
465 else:
466 callableMatches = self.attr_matches('.'.join(ids[::-1]))
467 argMatches = []
468 for callableMatch in callableMatches:
469 try: namedArgs = self._default_arguments(eval(callableMatch,
470 self.namespace))
471 except: continue
472 for namedArg in namedArgs:
473 if namedArg.startswith(text):
474 argMatches.append("%s=" %namedArg)
475 return argMatches
476
477 def complete(self, text, state):
478 """Return the next possible completion for 'text'.
479
480 This is called successively with state == 0, 1, 2, ... until it
481 returns None. The completion should begin with 'text'. """
482
483 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
484
485 # if there is only a tab on a line with only whitespace, instead
486 # of the mostly useless 'do you want to see all million
487 # completions' message, just do the right thing and give the user
488 # his tab! Incidentally, this enables pasting of tabbed text from
489 # an editor (as long as autoindent is off).
490 if not self.get_line_buffer().strip():
491 self.readline.insert_text('\t')
492 return None
493
494 magic_escape = self.magic_escape
495 magic_prefix = self.magic_prefix
496
497 try:
498 if text.startswith(magic_escape):
499 text = text.replace(magic_escape,magic_prefix)
500 elif text.startswith('~'):
501 text = os.path.expanduser(text)
502 if state == 0:
503 # Extend the list of completions with the results of each
504 # matcher, so we return results to the user from all
505 # namespaces.
506 if self.merge_completions:
507 self.matches = []
508 for matcher in self.matchers:
509 self.matches.extend(matcher(text))
510 else:
511 for matcher in self.matchers:
512 self.matches = matcher(text)
513 if self.matches:
514 break
515
516 try:
517 return self.matches[state].replace(magic_prefix,magic_escape)
518 except IndexError:
519 return None
520 except:
521 #import traceback; traceback.print_exc() # dbg
522 # If completion fails, don't annoy the user.
523 return None
This diff has been collapsed as it changes many lines, (518 lines changed) Show them Hide them
@@ -6,21 +6,23 b' Requires Python 2.1 or newer.'
6 6
7 7 This file contains all the classes and helper functions specific to IPython.
8 8
9 $Id: iplib.py 955 2005-12-27 07:50:29Z fperez $
9 $Id: iplib.py 957 2005-12-27 22:33:22Z fperez $
10 10 """
11 11
12 12 #*****************************************************************************
13 13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
14 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
14 # Copyright (C) 2001-2005 Fernando Perez. <fperez@colorado.edu>
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #
19 19 # Note: this code originally subclassed code.InteractiveConsole from the
20 # Python standard library. Over time, much of that class has been copied
20 # Python standard library. Over time, all of that class has been copied
21 21 # verbatim here for modifications which could not be accomplished by
22 # subclassing. The Python License (sec. 2) allows for this, but it's always
23 # nice to acknowledge credit where credit is due.
22 # subclassing. At this point, there are no dependencies at all on the code
23 # module anymore (it is not even imported). The Python License (sec. 2)
24 # allows for this, but it's always nice to acknowledge credit where credit is
25 # due.
24 26 #*****************************************************************************
25 27
26 28 #****************************************************************************
@@ -37,26 +39,33 b' __version__ = Release.version'
37 39 # Python standard modules
38 40 import __main__
39 41 import __builtin__
42 import bdb
43 import codeop
44 import cPickle as pickle
40 45 import exceptions
46 import glob
47 import inspect
41 48 import keyword
42 49 import new
43 import os, sys, shutil
44 import code, glob, types, re
45 import string, StringIO
46 import inspect, pydoc
47 import bdb, pdb
48 import UserList # don't subclass list so this works with Python2.1
49 from pprint import pprint, pformat
50 import cPickle as pickle
50 import os
51 import pdb
52 import pydoc
53 import re
54 import shutil
55 import string
56 import StringIO
57 import sys
51 58 import traceback
52 from codeop import CommandCompiler
59 import types
60
61 from pprint import pprint, pformat
53 62
54 63 # IPython's own modules
55 64 import IPython
56 65 from IPython import OInspect,PyColorize,ultraTB
57 66 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
58 67 from IPython.Logger import Logger
59 from IPython.Magic import Magic,magic2python,shlex_split
68 from IPython.Magic import Magic,magic2python
60 69 from IPython.usage import cmd_line_usage,interactive_usage
61 70 from IPython.Struct import Struct
62 71 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
@@ -74,8 +83,6 b' raw_input_original = raw_input'
74 83 #****************************************************************************
75 84 # Some utility function definitions
76 85
77 class Bunch: pass
78
79 86 def esc_quotes(strng):
80 87 """Return the input string with single and double quotes escaped out"""
81 88
@@ -163,340 +170,32 b' def ipalias(arg_s):'
163 170 else:
164 171 error("Alias `%s` not found." % alias_name)
165 172
166 #-----------------------------------------------------------------------------
167 # Local use classes
168 try:
169 from IPython import FlexCompleter
170
171 class MagicCompleter(FlexCompleter.Completer):
172 """Extension of the completer class to work on %-prefixed lines."""
173
174 def __init__(self,shell,namespace=None,global_namespace=None,
175 omit__names=0,alias_table=None):
176 """MagicCompleter() -> completer
177
178 Return a completer object suitable for use by the readline library
179 via readline.set_completer().
180
181 Inputs:
182
183 - shell: a pointer to the ipython shell itself. This is needed
184 because this completer knows about magic functions, and those can
185 only be accessed via the ipython instance.
186
187 - namespace: an optional dict where completions are performed.
188
189 - global_namespace: secondary optional dict for completions, to
190 handle cases (such as IPython embedded inside functions) where
191 both Python scopes are visible.
192
193 - The optional omit__names parameter sets the completer to omit the
194 'magic' names (__magicname__) for python objects unless the text
195 to be completed explicitly starts with one or more underscores.
196
197 - If alias_table is supplied, it should be a dictionary of aliases
198 to complete. """
199
200 FlexCompleter.Completer.__init__(self,namespace)
201 self.magic_prefix = shell.name+'.magic_'
202 self.magic_escape = shell.ESC_MAGIC
203 self.readline = FlexCompleter.readline
204 delims = self.readline.get_completer_delims()
205 delims = delims.replace(self.magic_escape,'')
206 self.readline.set_completer_delims(delims)
207 self.get_line_buffer = self.readline.get_line_buffer
208 self.omit__names = omit__names
209 self.merge_completions = shell.rc.readline_merge_completions
210
211 if alias_table is None:
212 alias_table = {}
213 self.alias_table = alias_table
214 # Regexp to split filenames with spaces in them
215 self.space_name_re = re.compile(r'([^\\] )')
216 # Hold a local ref. to glob.glob for speed
217 self.glob = glob.glob
218 # Special handling of backslashes needed in win32 platforms
219 if sys.platform == "win32":
220 self.clean_glob = self._clean_glob_win32
221 else:
222 self.clean_glob = self._clean_glob
223 self.matchers = [self.python_matches,
224 self.file_matches,
225 self.alias_matches,
226 self.python_func_kw_matches]
227
228 # Code contributed by Alex Schmolck, for ipython/emacs integration
229 def all_completions(self, text):
230 """Return all possible completions for the benefit of emacs."""
231
232 completions = []
233 comp_append = completions.append
234 try:
235 for i in xrange(sys.maxint):
236 res = self.complete(text, i)
237
238 if not res: break
239
240 comp_append(res)
241 #XXX workaround for ``notDefined.<tab>``
242 except NameError:
243 pass
244 return completions
245 # /end Alex Schmolck code.
246
247 def _clean_glob(self,text):
248 return self.glob("%s*" % text)
249
250 def _clean_glob_win32(self,text):
251 return [f.replace("\\","/")
252 for f in self.glob("%s*" % text)]
253
254 def file_matches(self, text):
255 """Match filneames, expanding ~USER type strings.
256
257 Most of the seemingly convoluted logic in this completer is an
258 attempt to handle filenames with spaces in them. And yet it's not
259 quite perfect, because Python's readline doesn't expose all of the
260 GNU readline details needed for this to be done correctly.
261
262 For a filename with a space in it, the printed completions will be
263 only the parts after what's already been typed (instead of the
264 full completions, as is normally done). I don't think with the
265 current (as of Python 2.3) Python readline it's possible to do
266 better."""
267
268 #print 'Completer->file_matches: <%s>' % text # dbg
269
270 # chars that require escaping with backslash - i.e. chars
271 # that readline treats incorrectly as delimiters, but we
272 # don't want to treat as delimiters in filename matching
273 # when escaped with backslash
274
275 protectables = ' ()[]{}'
276
277 def protect_filename(s):
278 return "".join([(ch in protectables and '\\' + ch or ch)
279 for ch in s])
173 def softspace(file, newvalue):
174 """Copied from code.py, to remove the dependency"""
175 oldvalue = 0
176 try:
177 oldvalue = file.softspace
178 except AttributeError:
179 pass
180 try:
181 file.softspace = newvalue
182 except (AttributeError, TypeError):
183 # "attribute-less object" or "read-only attributes"
184 pass
185 return oldvalue
280 186
281 lbuf = self.get_line_buffer()[:self.readline.get_endidx()]
282 open_quotes = 0 # track strings with open quotes
283 try:
284 lsplit = shlex_split(lbuf)[-1]
285 except ValueError:
286 # typically an unmatched ", or backslash without escaped char.
287 if lbuf.count('"')==1:
288 open_quotes = 1
289 lsplit = lbuf.split('"')[-1]
290 elif lbuf.count("'")==1:
291 open_quotes = 1
292 lsplit = lbuf.split("'")[-1]
293 else:
294 return None
295 except IndexError:
296 # tab pressed on empty line
297 lsplit = ""
298
299 if lsplit != protect_filename(lsplit):
300 # if protectables are found, do matching on the whole escaped
301 # name
302 has_protectables = 1
303 text0,text = text,lsplit
304 else:
305 has_protectables = 0
306 text = os.path.expanduser(text)
307
308 if text == "":
309 return [protect_filename(f) for f in self.glob("*")]
310
311 m0 = self.clean_glob(text.replace('\\',''))
312 if has_protectables:
313 # If we had protectables, we need to revert our changes to the
314 # beginning of filename so that we don't double-write the part
315 # of the filename we have so far
316 len_lsplit = len(lsplit)
317 matches = [text0 + protect_filename(f[len_lsplit:]) for f in m0]
318 else:
319 if open_quotes:
320 # if we have a string with an open quote, we don't need to
321 # protect the names at all (and we _shouldn't_, as it
322 # would cause bugs when the filesystem call is made).
323 matches = m0
324 else:
325 matches = [protect_filename(f) for f in m0]
326 if len(matches) == 1 and os.path.isdir(matches[0]):
327 # Takes care of links to directories also. Use '/'
328 # explicitly, even under Windows, so that name completions
329 # don't end up escaped.
330 matches[0] += '/'
331 return matches
332
333 def alias_matches(self, text):
334 """Match internal system aliases"""
335 #print 'Completer->alias_matches:',text # dbg
336 text = os.path.expanduser(text)
337 aliases = self.alias_table.keys()
338 if text == "":
339 return aliases
340 else:
341 return [alias for alias in aliases if alias.startswith(text)]
342
343 def python_matches(self,text):
344 """Match attributes or global python names"""
345 #print 'Completer->python_matches' # dbg
346 if "." in text:
347 try:
348 matches = self.attr_matches(text)
349 if text.endswith('.') and self.omit__names:
350 if self.omit__names == 1:
351 # true if txt is _not_ a __ name, false otherwise:
352 no__name = (lambda txt:
353 re.match(r'.*\.__.*?__',txt) is None)
354 else:
355 # true if txt is _not_ a _ name, false otherwise:
356 no__name = (lambda txt:
357 re.match(r'.*\._.*?',txt) is None)
358 matches = filter(no__name, matches)
359 except NameError:
360 # catches <undefined attributes>.<tab>
361 matches = []
362 else:
363 matches = self.global_matches(text)
364 # this is so completion finds magics when automagic is on:
365 if matches == [] and not text.startswith(os.sep):
366 matches = self.attr_matches(self.magic_prefix+text)
367 return matches
368
369 def _default_arguments(self, obj):
370 """Return the list of default arguments of obj if it is callable,
371 or empty list otherwise."""
372
373 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
374 # for classes, check for __init__,__new__
375 if inspect.isclass(obj):
376 obj = (getattr(obj,'__init__',None) or
377 getattr(obj,'__new__',None))
378 # for all others, check if they are __call__able
379 elif hasattr(obj, '__call__'):
380 obj = obj.__call__
381 # XXX: is there a way to handle the builtins ?
382 try:
383 args,_,_1,defaults = inspect.getargspec(obj)
384 if defaults:
385 return args[-len(defaults):]
386 except TypeError: pass
387 return []
388
389 def python_func_kw_matches(self,text):
390 """Match named parameters (kwargs) of the last open function"""
391
392 if "." in text: # a parameter cannot be dotted
393 return []
394 try: regexp = self.__funcParamsRegex
395 except AttributeError:
396 regexp = self.__funcParamsRegex = re.compile(r'''
397 '.*?' | # single quoted strings or
398 ".*?" | # double quoted strings or
399 \w+ | # identifier
400 \S # other characters
401 ''', re.VERBOSE | re.DOTALL)
402 # 1. find the nearest identifier that comes before an unclosed
403 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
404 tokens = regexp.findall(self.get_line_buffer())
405 tokens.reverse()
406 iterTokens = iter(tokens); openPar = 0
407 for token in iterTokens:
408 if token == ')':
409 openPar -= 1
410 elif token == '(':
411 openPar += 1
412 if openPar > 0:
413 # found the last unclosed parenthesis
414 break
415 else:
416 return []
417 # 2. Concatenate any dotted names (e.g. "foo.bar" for "foo.bar(x, pa" )
418 ids = []
419 isId = re.compile(r'\w+$').match
420 while True:
421 try:
422 ids.append(iterTokens.next())
423 if not isId(ids[-1]):
424 ids.pop(); break
425 if not iterTokens.next() == '.':
426 break
427 except StopIteration:
428 break
429 # lookup the candidate callable matches either using global_matches
430 # or attr_matches for dotted names
431 if len(ids) == 1:
432 callableMatches = self.global_matches(ids[0])
433 else:
434 callableMatches = self.attr_matches('.'.join(ids[::-1]))
435 argMatches = []
436 for callableMatch in callableMatches:
437 try: namedArgs = self._default_arguments(eval(callableMatch,
438 self.namespace))
439 except: continue
440 for namedArg in namedArgs:
441 if namedArg.startswith(text):
442 argMatches.append("%s=" %namedArg)
443 return argMatches
444
445 def complete(self, text, state):
446 """Return the next possible completion for 'text'.
447
448 This is called successively with state == 0, 1, 2, ... until it
449 returns None. The completion should begin with 'text'. """
450
451 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
452
453 # if there is only a tab on a line with only whitespace, instead
454 # of the mostly useless 'do you want to see all million
455 # completions' message, just do the right thing and give the user
456 # his tab! Incidentally, this enables pasting of tabbed text from
457 # an editor (as long as autoindent is off).
458 if not self.get_line_buffer().strip():
459 self.readline.insert_text('\t')
460 return None
461
462 magic_escape = self.magic_escape
463 magic_prefix = self.magic_prefix
464
465 try:
466 if text.startswith(magic_escape):
467 text = text.replace(magic_escape,magic_prefix)
468 elif text.startswith('~'):
469 text = os.path.expanduser(text)
470 if state == 0:
471 # Extend the list of completions with the results of each
472 # matcher, so we return results to the user from all
473 # namespaces.
474 if self.merge_completions:
475 self.matches = []
476 for matcher in self.matchers:
477 self.matches.extend(matcher(text))
478 else:
479 for matcher in self.matchers:
480 self.matches = matcher(text)
481 if self.matches:
482 break
483
484 try:
485 return self.matches[state].replace(magic_prefix,magic_escape)
486 except IndexError:
487 return None
488 except:
489 # If completion fails, don't annoy the user.
490 return None
491 187
492 except ImportError:
493 pass # no readline support
188 #****************************************************************************
189 # Local use exceptions
190 class SpaceInInput(exceptions.Exception): pass
494 191
495 except KeyError:
496 pass # Windows doesn't set TERM, it doesn't matter
192 class IPythonExit(exceptions.Exception): pass
497 193
194 #****************************************************************************
195 # Local use classes
196 class Bunch: pass
498 197
499 class InputList(UserList.UserList):
198 class InputList(list):
500 199 """Class to store user input.
501 200
502 201 It's basically a list, but slices return a string instead of a list, thus
@@ -509,17 +208,11 b' class InputList(UserList.UserList):'
509 208 exec In[5:9] + In[14] + In[21:25]"""
510 209
511 210 def __getslice__(self,i,j):
512 return ''.join(UserList.UserList.__getslice__(self,i,j))
513
514 #****************************************************************************
515 # Local use exceptions
516 class SpaceInInput(exceptions.Exception):
517 pass
211 return ''.join(list.__getslice__(self,i,j))
518 212
519 213 #****************************************************************************
520 214 # Main IPython class
521
522 class InteractiveShell(code.InteractiveConsole, Logger, Magic):
215 class InteractiveShell(Logger, Magic):
523 216 """An enhanced console for Python."""
524 217
525 218 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
@@ -543,17 +236,20 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
543 236 # which also gives us a way to determine the nesting level.
544 237 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
545 238
546 # Inform the user of ipython's fast exit magics.
547 _exit = ' Use %Exit or %Quit to exit without confirmation.'
548 __builtin__.exit += _exit
549 __builtin__.quit += _exit
239 # Do the intuitively correct thing for quit/exit: we remove the
240 # builtins if they exist, and our own prefilter routine will handle
241 # these special cases
242 try:
243 del __builtin__.exit, __builtin__.quit
244 except AttributeError:
245 pass
550 246
551 247 # We need to know whether the instance is meant for embedding, since
552 248 # global/local namespaces need to be handled differently in that case
553 249 self.embedded = embedded
554 250
555 251 # compiler command
556 self.compile = CommandCompiler()
252 self.compile = codeop.CommandCompiler()
557 253
558 254 # User input buffer
559 255 self.buffer = []
@@ -589,10 +285,10 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
589 285
590 286 # Well, it's documented that '__builtins__' can be either a dictionary
591 287 # or a module, and it's been that way for a long time. Whether it's
592 # intentional (or sensible), I don't know. In any case, the idea is that
593 # if you need to access the built-in namespace directly, you should start
594 # with "import __builtin__" (note, no 's') which will definitely give you
595 # a module. Yeah, it's somewhat confusing:-(.
288 # intentional (or sensible), I don't know. In any case, the idea is
289 # that if you need to access the built-in namespace directly, you
290 # should start with "import __builtin__" (note, no 's') which will
291 # definitely give you a module. Yeah, it's somewhat confusing:-(.
596 292
597 293 if user_ns is None:
598 294 # Set __name__ to __main__ to better match the behavior of the
@@ -668,7 +364,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
668 364 # dict of output history
669 365 self.output_hist = {}
670 366
671 # dict of things NOT to alias (keywords, builtins and some special magics)
367 # dict of things NOT to alias (keywords, builtins and some magics)
672 368 no_alias = {}
673 369 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
674 370 for key in keyword.kwlist + no_alias_magics:
@@ -762,7 +458,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
762 458 self.tempfiles = []
763 459
764 460 # Keep track of readline usage (later set by init_readline)
765 self.has_readline = 0
461 self.has_readline = False
766 462
767 463 # for pushd/popd management
768 464 try:
@@ -816,6 +512,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
816 512 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
817 513 # RegExp to exclude strings with this start from autocalling
818 514 self.re_exclude_auto = re.compile('^[!=()<>,\*/\+-]|^is ')
515
819 516 # try to catch also methods for stuff in lists/tuples/dicts: off
820 517 # (experimental). For this to work, the line_split regexp would need
821 518 # to be modified so it wouldn't break things at '['. That line is
@@ -826,7 +523,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
826 523 self.starting_dir = os.getcwd()
827 524
828 525 # Attributes for Logger mixin class, make defaults here
829 self._dolog = 0
526 self._dolog = False
830 527 self.LOG = ''
831 528 self.LOGDEF = '.InteractiveShell.log'
832 529 self.LOGMODE = 'over'
@@ -859,7 +556,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
859 556 ins_colors = OInspect.InspectColors
860 557 code_colors = PyColorize.ANSICodeColors
861 558 self.inspector = OInspect.Inspector(ins_colors,code_colors,'NoColor')
862 self.autoindent = 0
559 self.autoindent = False
863 560
864 561 # Make some aliases automatically
865 562 # Prepare list of shell aliases to auto-define
@@ -1015,8 +712,8 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
1015 712 if rc.readline:
1016 713 self.init_readline()
1017 714
1018 # Set user colors (don't do it in the constructor above so that it doesn't
1019 # crash if colors option is invalid)
715 # Set user colors (don't do it in the constructor above so that it
716 # doesn't crash if colors option is invalid)
1020 717 self.magic_colors(rc.colors)
1021 718
1022 719 # Load user aliases
@@ -1257,28 +954,23 b' want to merge them back into the new files.""" % locals()'
1257 954 """Command history completion/saving/reloading."""
1258 955 try:
1259 956 import readline
1260 self.Completer = MagicCompleter(self,
1261 self.user_ns,
1262 self.user_global_ns,
1263 self.rc.readline_omit__names,
1264 self.alias_table)
1265 except ImportError,NameError:
1266 # If FlexCompleter failed to import, MagicCompleter won't be
1267 # defined. This can happen because of a problem with readline
957 except ImportError:
1268 958 self.has_readline = 0
959 self.readline = None
1269 960 # no point in bugging windows users with this every time:
1270 961 if os.name == 'posix':
1271 962 warn('Readline services not available on this platform.')
1272 963 else:
1273 964 import atexit
965 from IPython.completer import IPCompleter
966 self.Completer = IPCompleter(self,
967 self.user_ns,
968 self.user_global_ns,
969 self.rc.readline_omit__names,
970 self.alias_table)
1274 971
1275 972 # Platform-specific configuration
1276 973 if os.name == 'nt':
1277 # readline under Windows modifies the default exit behavior
1278 # from being Ctrl-Z/Return to the Unix Ctrl-D one.
1279 __builtin__.exit = __builtin__.quit = \
1280 ('Use Ctrl-D (i.e. EOF) to exit. '
1281 'Use %Exit or %Quit to exit without confirmation.')
1282 974 self.readline_startup_hook = readline.set_pre_input_hook
1283 975 else:
1284 976 self.readline_startup_hook = readline.set_startup_hook
@@ -1386,7 +1078,7 b' want to merge them back into the new files.""" % locals()'
1386 1078 """puts line into cache"""
1387 1079 self.inputcache.insert(0, line) # This copies the cache every time ... :-(
1388 1080 if len(self.inputcache) >= self.CACHELENGTH:
1389 self.inputcache.pop() # This not :-)
1081 self.inputcache.pop() # This doesn't :-)
1390 1082
1391 1083 def mainloop(self,banner=None):
1392 1084 """Creates the local namespace and starts the mainloop.
@@ -1504,11 +1196,9 b' want to merge them back into the new files.""" % locals()'
1504 1196 if self.autoindent:
1505 1197 self.readline_startup_hook(None)
1506 1198 self.write("\n")
1507 if self.rc.confirm_exit:
1508 if ask_yes_no('Do you really want to exit ([y]/n)?','y'):
1509 break
1510 else:
1511 break
1199 self.exit()
1200 except IPythonExit:
1201 self.exit()
1512 1202 else:
1513 1203 more = self.push(line)
1514 1204 # Auto-indent management
@@ -1720,7 +1410,8 b' want to merge them back into the new files.""" % locals()'
1720 1410 except SystemExit:
1721 1411 self.resetbuffer()
1722 1412 self.showtraceback()
1723 warn( __builtin__.exit,level=1)
1413 warn("Type exit or quit to exit IPython "
1414 "(%Exit or %Quit do so unconditionally).",level=1)
1724 1415 except self.custom_exceptions:
1725 1416 etype,value,tb = sys.exc_info()
1726 1417 self.CustomTB(etype,value,tb)
@@ -1728,11 +1419,36 b' want to merge them back into the new files.""" % locals()'
1728 1419 self.showtraceback()
1729 1420 else:
1730 1421 outflag = 0
1731 if code.softspace(sys.stdout, 0):
1422 if softspace(sys.stdout, 0):
1732 1423 print
1733 1424 # Flush out code object which has been run (and source)
1734 1425 self.code_to_run = None
1735 1426 return outflag
1427
1428 def push(self, line):
1429 """Push a line to the interpreter.
1430
1431 The line should not have a trailing newline; it may have
1432 internal newlines. The line is appended to a buffer and the
1433 interpreter's runsource() method is called with the
1434 concatenated contents of the buffer as source. If this
1435 indicates that the command was executed or invalid, the buffer
1436 is reset; otherwise, the command is incomplete, and the buffer
1437 is left as it was after the line was appended. The return
1438 value is 1 if more input is required, 0 if the line was dealt
1439 with in some way (this is the same as runsource()).
1440
1441 """
1442 self.buffer.append(line)
1443 source = "\n".join(self.buffer)
1444 more = self.runsource(source, self.filename)
1445 if not more:
1446 self.resetbuffer()
1447 return more
1448
1449 def resetbuffer(self):
1450 """Reset the input buffer."""
1451 self.buffer[:] = []
1736 1452
1737 1453 def raw_input(self,prompt='',continue_prompt=False):
1738 1454 """Write a prompt and read a line.
@@ -1871,6 +1587,8 b' want to merge them back into the new files.""" % locals()'
1871 1587 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
1872 1588
1873 1589 if not oinfo['found']:
1590 if iFun in ('quit','exit'):
1591 raise IPythonExit
1874 1592 return self.handle_normal(line,continue_prompt)
1875 1593 else:
1876 1594 #print 'iFun <%s> rest <%s>' % (iFun,theRest) # dbg
@@ -2008,7 +1726,7 b' want to merge them back into the new files.""" % locals()'
2008 1726 # We need to make sure that we don't process lines which would be
2009 1727 # otherwise valid python, such as "x=1 # what?"
2010 1728 try:
2011 code.compile_command(line)
1729 codeop.compile_command(line)
2012 1730 except SyntaxError:
2013 1731 # We should only handle as help stuff which is NOT valid syntax
2014 1732 if line[0]==self.ESC_HELP:
@@ -2048,6 +1766,18 b' want to merge them back into the new files.""" % locals()'
2048 1766 """Write a string to the default error output"""
2049 1767 Term.cerr.write(data)
2050 1768
1769 def exit(self):
1770 """Handle interactive exit.
1771
1772 This method sets the exit_now attribute."""
1773
1774 if self.rc.confirm_exit:
1775 if ask_yes_no('Do you really want to exit ([y]/n)?','y'):
1776 self.exit_now = True
1777 else:
1778 self.exit_now = True
1779 return self.exit_now
1780
2051 1781 def safe_execfile(self,fname,*where,**kw):
2052 1782 fname = os.path.expanduser(fname)
2053 1783
@@ -2134,9 +1864,9 b' want to merge them back into the new files.""" % locals()'
2134 1864 sys.stdout = stdout_save
2135 1865 print 'Finished replaying log file <%s>' % fname
2136 1866 if badblocks:
2137 print >> sys.stderr, \
2138 '\nThe following lines/blocks in file <%s> reported errors:' \
2139 % fname
1867 print >> sys.stderr, ('\nThe following lines/blocks in file '
1868 '<%s> reported errors:' % fname)
1869
2140 1870 for badline in badblocks:
2141 1871 print >> sys.stderr, badline
2142 1872 else: # regular file execution
@@ -1,5 +1,9 b''
1 1 2005-12-27 Fernando Perez <Fernando.Perez@colorado.edu>
2 2
3 * IPython/completer.py (MagicCompleter.__init__): new 'completer'
4 module to better organize all readline-related functionality.
5 I've deleted FlexCompleter and put all completion clases here.
6
3 7 * IPython/iplib.py (raw_input): improve indentation management.
4 8 It is now possible to paste indented code with autoindent on, and
5 9 the code is interpreted correctly (though it still looks bad on
@@ -9,6 +13,17 b''
9 13 on the entire global namespace. This makes it easier to use the
10 14 TAB key for indentation. After a request by Hans Meine
11 15 <hans_meine-AT-gmx.net>
16 (_prefilter): add support so that typing plain 'exit' or 'quit'
17 does a sensible thing. Originally I tried to deviate as little as
18 possible from the default python behavior, but even that one may
19 change in this direction (thread on python-dev to that effect).
20 Regardless, ipython should do the right thing even if CPython's
21 '>>>' prompt doesn't.
22 (InteractiveShell): removed subclassing code.InteractiveConsole
23 class. By now we'd overridden just about all of its methods: I've
24 copied the remaining two over, and now ipython is a standalone
25 class. This will provide a clearer picture for the chainsaw
26 branch refactoring.
12 27
13 28 2005-12-26 Fernando Perez <Fernando.Perez@colorado.edu>
14 29
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now