##// END OF EJS Templates
clarify variable names
Julian Taylor -
Show More
@@ -1,610 +1,610 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Subclass of InteractiveShell for terminal based frontends."""
3 3
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 7 # Copyright (C) 2008-2010 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 import __builtin__
18 18 import bdb
19 19 import os
20 20 import re
21 21 import sys
22 22
23 23 try:
24 24 from contextlib import nested
25 25 except:
26 26 from IPython.utils.nested_context import nested
27 27
28 28 from IPython.core.error import TryNext
29 29 from IPython.core.usage import interactive_usage, default_banner
30 30 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
31 31 from IPython.lib.inputhook import enable_gui
32 32 from IPython.lib.pylabtools import pylab_activate
33 33 from IPython.testing.skipdoctest import skip_doctest
34 34 from IPython.utils import py3compat
35 35 from IPython.utils.terminal import toggle_set_term_title, set_term_title
36 36 from IPython.utils.process import abbrev_cwd
37 37 from IPython.utils.warn import warn
38 38 from IPython.utils.text import num_ini_spaces
39 39 from IPython.utils.traitlets import Int, CBool, Unicode
40 40
41 41 #-----------------------------------------------------------------------------
42 42 # Utilities
43 43 #-----------------------------------------------------------------------------
44 44
45 45 def get_default_editor():
46 46 try:
47 47 ed = os.environ['EDITOR']
48 48 except KeyError:
49 49 if os.name == 'posix':
50 50 ed = 'vi' # the only one guaranteed to be there!
51 51 else:
52 52 ed = 'notepad' # same in Windows!
53 53 return ed
54 54
55 55 #-----------------------------------------------------------------------------
56 56 # Main class
57 57 #-----------------------------------------------------------------------------
58 58
59 59 class TerminalInteractiveShell(InteractiveShell):
60 60
61 61 autoedit_syntax = CBool(False, config=True,
62 62 help="auto editing of files with syntax errors.")
63 63 banner = Unicode('')
64 64 banner1 = Unicode(default_banner, config=True,
65 65 help="""The part of the banner to be printed before the profile"""
66 66 )
67 67 banner2 = Unicode('', config=True,
68 68 help="""The part of the banner to be printed after the profile"""
69 69 )
70 70 confirm_exit = CBool(True, config=True,
71 71 help="""
72 72 Set to confirm when you try to exit IPython with an EOF (Control-D
73 73 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
74 74 you can force a direct exit without any confirmation.""",
75 75 )
76 76 # This display_banner only controls whether or not self.show_banner()
77 77 # is called when mainloop/interact are called. The default is False
78 78 # because for the terminal based application, the banner behavior
79 79 # is controlled by Global.display_banner, which IPythonApp looks at
80 80 # to determine if *it* should call show_banner() by hand or not.
81 81 display_banner = CBool(False) # This isn't configurable!
82 82 embedded = CBool(False)
83 83 embedded_active = CBool(False)
84 84 editor = Unicode(get_default_editor(), config=True,
85 85 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
86 86 )
87 87 pager = Unicode('less', config=True,
88 88 help="The shell program to be used for paging.")
89 89
90 90 screen_length = Int(0, config=True,
91 91 help=
92 92 """Number of lines of your screen, used to control printing of very
93 93 long strings. Strings longer than this number of lines will be sent
94 94 through a pager instead of directly printed. The default value for
95 95 this is 0, which means IPython will auto-detect your screen size every
96 96 time it needs to print certain potentially long strings (this doesn't
97 97 change the behavior of the 'print' keyword, it's only triggered
98 98 internally). If for some reason this isn't working well (it needs
99 99 curses support), specify it yourself. Otherwise don't change the
100 100 default.""",
101 101 )
102 102 term_title = CBool(False, config=True,
103 103 help="Enable auto setting the terminal title."
104 104 )
105 105
106 106 def __init__(self, config=None, ipython_dir=None, profile_dir=None, user_ns=None,
107 107 user_global_ns=None, custom_exceptions=((),None),
108 108 usage=None, banner1=None, banner2=None,
109 109 display_banner=None):
110 110
111 111 super(TerminalInteractiveShell, self).__init__(
112 112 config=config, profile_dir=profile_dir, user_ns=user_ns,
113 113 user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
114 114 )
115 115 # use os.system instead of utils.process.system by default, except on Windows
116 116 if os.name == 'nt':
117 117 self.system = self.system_piped
118 118 else:
119 119 self.system = self.system_raw
120 120
121 121 self.init_term_title()
122 122 self.init_usage(usage)
123 123 self.init_banner(banner1, banner2, display_banner)
124 124
125 125 #-------------------------------------------------------------------------
126 126 # Things related to the terminal
127 127 #-------------------------------------------------------------------------
128 128
129 129 @property
130 130 def usable_screen_length(self):
131 131 if self.screen_length == 0:
132 132 return 0
133 133 else:
134 134 num_lines_bot = self.separate_in.count('\n')+1
135 135 return self.screen_length - num_lines_bot
136 136
137 137 def init_term_title(self):
138 138 # Enable or disable the terminal title.
139 139 if self.term_title:
140 140 toggle_set_term_title(True)
141 141 set_term_title('IPython: ' + abbrev_cwd())
142 142 else:
143 143 toggle_set_term_title(False)
144 144
145 145 #-------------------------------------------------------------------------
146 146 # Things related to aliases
147 147 #-------------------------------------------------------------------------
148 148
149 149 def init_alias(self):
150 150 # The parent class defines aliases that can be safely used with any
151 151 # frontend.
152 152 super(TerminalInteractiveShell, self).init_alias()
153 153
154 154 # Now define aliases that only make sense on the terminal, because they
155 155 # need direct access to the console in a way that we can't emulate in
156 156 # GUI or web frontend
157 157 if os.name == 'posix':
158 158 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
159 159 ('man', 'man')]
160 160 elif os.name == 'nt':
161 161 aliases = [('cls', 'cls')]
162 162
163 163
164 164 for name, cmd in aliases:
165 165 self.alias_manager.define_alias(name, cmd)
166 166
167 167 #-------------------------------------------------------------------------
168 168 # Things related to the banner and usage
169 169 #-------------------------------------------------------------------------
170 170
171 171 def _banner1_changed(self):
172 172 self.compute_banner()
173 173
174 174 def _banner2_changed(self):
175 175 self.compute_banner()
176 176
177 177 def _term_title_changed(self, name, new_value):
178 178 self.init_term_title()
179 179
180 180 def init_banner(self, banner1, banner2, display_banner):
181 181 if banner1 is not None:
182 182 self.banner1 = banner1
183 183 if banner2 is not None:
184 184 self.banner2 = banner2
185 185 if display_banner is not None:
186 186 self.display_banner = display_banner
187 187 self.compute_banner()
188 188
189 189 def show_banner(self, banner=None):
190 190 if banner is None:
191 191 banner = self.banner
192 192 self.write(banner)
193 193
194 194 def compute_banner(self):
195 195 self.banner = self.banner1
196 196 if self.profile and self.profile != 'default':
197 197 self.banner += '\nIPython profile: %s\n' % self.profile
198 198 if self.banner2:
199 199 self.banner += '\n' + self.banner2
200 200
201 201 def init_usage(self, usage=None):
202 202 if usage is None:
203 203 self.usage = interactive_usage
204 204 else:
205 205 self.usage = usage
206 206
207 207 #-------------------------------------------------------------------------
208 208 # Mainloop and code execution logic
209 209 #-------------------------------------------------------------------------
210 210
211 211 def mainloop(self, display_banner=None):
212 212 """Start the mainloop.
213 213
214 214 If an optional banner argument is given, it will override the
215 215 internally created default banner.
216 216 """
217 217
218 218 with nested(self.builtin_trap, self.display_trap):
219 219
220 220 while 1:
221 221 try:
222 222 self.interact(display_banner=display_banner)
223 223 #self.interact_with_readline()
224 224 # XXX for testing of a readline-decoupled repl loop, call
225 225 # interact_with_readline above
226 226 break
227 227 except KeyboardInterrupt:
228 228 # this should not be necessary, but KeyboardInterrupt
229 229 # handling seems rather unpredictable...
230 230 self.write("\nKeyboardInterrupt in interact()\n")
231 231
232 def _store_multiline_history(self, source_raw, orig_hlen):
232 def _replace_rlhist_multiline(self, source_raw, hlen_before_cell):
233 233 """Store multiple lines as a single entry in history"""
234 234 if self.multiline_history and self.has_readline:
235 235 hlen = self.readline.get_current_history_length()
236 for i in range(hlen - orig_hlen):
236 for i in range(hlen - hlen_before_cell):
237 237 self.readline.remove_history_item(hlen - i - 1)
238 238 self.readline.add_history(source_raw.rstrip())
239 239
240 240 def interact(self, display_banner=None):
241 241 """Closely emulate the interactive Python console."""
242 242
243 243 # batch run -> do not interact
244 244 if self.exit_now:
245 245 return
246 246
247 247 if display_banner is None:
248 248 display_banner = self.display_banner
249 249
250 250 if isinstance(display_banner, basestring):
251 251 self.show_banner(display_banner)
252 252 elif display_banner:
253 253 self.show_banner()
254 254
255 255 more = False
256 hlen = self.readline.get_current_history_length()
256 hlen_before_cell = self.readline.get_current_history_length()
257 257
258 258 # Mark activity in the builtins
259 259 __builtin__.__dict__['__IPYTHON__active'] += 1
260 260
261 261 if self.has_readline:
262 262 self.readline_startup_hook(self.pre_readline)
263 263 # exit_now is set by a call to %Exit or %Quit, through the
264 264 # ask_exit callback.
265 265
266 266 while not self.exit_now:
267 267 self.hooks.pre_prompt_hook()
268 268 if more:
269 269 try:
270 270 prompt = self.hooks.generate_prompt(True)
271 271 except:
272 272 self.showtraceback()
273 273 if self.autoindent:
274 274 self.rl_do_indent = True
275 275
276 276 else:
277 277 try:
278 278 prompt = self.hooks.generate_prompt(False)
279 279 except:
280 280 self.showtraceback()
281 281 try:
282 282 line = self.raw_input(prompt)
283 283 if self.exit_now:
284 284 # quick exit on sys.std[in|out] close
285 285 break
286 286 if self.autoindent:
287 287 self.rl_do_indent = False
288 288
289 289 except KeyboardInterrupt:
290 290 #double-guard against keyboardinterrupts during kbdint handling
291 291 try:
292 292 self.write('\nKeyboardInterrupt\n')
293 293 source_raw = self.input_splitter.source_raw_reset()[1]
294 self._store_multiline_history(source_raw, hlen)
295 hlen = self.readline.get_current_history_length()
294 self._replace_rlhist_multiline(source_raw, hlen_before_cell)
295 hlen_before_cell = self.readline.get_current_history_length()
296 296 more = False
297 297 except KeyboardInterrupt:
298 298 pass
299 299 except EOFError:
300 300 if self.autoindent:
301 301 self.rl_do_indent = False
302 302 if self.has_readline:
303 303 self.readline_startup_hook(None)
304 304 self.write('\n')
305 305 self.exit()
306 306 except bdb.BdbQuit:
307 307 warn('The Python debugger has exited with a BdbQuit exception.\n'
308 308 'Because of how pdb handles the stack, it is impossible\n'
309 309 'for IPython to properly format this particular exception.\n'
310 310 'IPython will resume normal operation.')
311 311 except:
312 312 # exceptions here are VERY RARE, but they can be triggered
313 313 # asynchronously by signal handlers, for example.
314 314 self.showtraceback()
315 315 else:
316 316 self.input_splitter.push(line)
317 317 more = self.input_splitter.push_accepts_more()
318 318 if (self.SyntaxTB.last_syntax_error and
319 319 self.autoedit_syntax):
320 320 self.edit_syntax_error()
321 321 if not more:
322 322 source_raw = self.input_splitter.source_raw_reset()[1]
323 self._store_multiline_history(source_raw, hlen)
324 hlen = self.readline.get_current_history_length()
323 self._replace_rlhist_multiline(source_raw, hlen_before_cell)
324 hlen_before_cell = self.readline.get_current_history_length()
325 325 self.run_cell(source_raw, store_history=True)
326 326
327 327 # We are off again...
328 328 __builtin__.__dict__['__IPYTHON__active'] -= 1
329 329
330 330 # Turn off the exit flag, so the mainloop can be restarted if desired
331 331 self.exit_now = False
332 332
333 333 def raw_input(self, prompt=''):
334 334 """Write a prompt and read a line.
335 335
336 336 The returned line does not include the trailing newline.
337 337 When the user enters the EOF key sequence, EOFError is raised.
338 338
339 339 Optional inputs:
340 340
341 341 - prompt(''): a string to be printed to prompt the user.
342 342
343 343 - continue_prompt(False): whether this line is the first one or a
344 344 continuation in a sequence of inputs.
345 345 """
346 346 # Code run by the user may have modified the readline completer state.
347 347 # We must ensure that our completer is back in place.
348 348
349 349 if self.has_readline:
350 350 self.set_readline_completer()
351 351
352 352 try:
353 353 line = py3compat.str_to_unicode(self.raw_input_original(prompt))
354 354 except ValueError:
355 355 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
356 356 " or sys.stdout.close()!\nExiting IPython!")
357 357 self.ask_exit()
358 358 return ""
359 359
360 360 # Try to be reasonably smart about not re-indenting pasted input more
361 361 # than necessary. We do this by trimming out the auto-indent initial
362 362 # spaces, if the user's actual input started itself with whitespace.
363 363 if self.autoindent:
364 364 if num_ini_spaces(line) > self.indent_current_nsp:
365 365 line = line[self.indent_current_nsp:]
366 366 self.indent_current_nsp = 0
367 367
368 368 return line
369 369
370 370 #-------------------------------------------------------------------------
371 371 # Methods to support auto-editing of SyntaxErrors.
372 372 #-------------------------------------------------------------------------
373 373
374 374 def edit_syntax_error(self):
375 375 """The bottom half of the syntax error handler called in the main loop.
376 376
377 377 Loop until syntax error is fixed or user cancels.
378 378 """
379 379
380 380 while self.SyntaxTB.last_syntax_error:
381 381 # copy and clear last_syntax_error
382 382 err = self.SyntaxTB.clear_err_state()
383 383 if not self._should_recompile(err):
384 384 return
385 385 try:
386 386 # may set last_syntax_error again if a SyntaxError is raised
387 387 self.safe_execfile(err.filename,self.user_ns)
388 388 except:
389 389 self.showtraceback()
390 390 else:
391 391 try:
392 392 f = file(err.filename)
393 393 try:
394 394 # This should be inside a display_trap block and I
395 395 # think it is.
396 396 sys.displayhook(f.read())
397 397 finally:
398 398 f.close()
399 399 except:
400 400 self.showtraceback()
401 401
402 402 def _should_recompile(self,e):
403 403 """Utility routine for edit_syntax_error"""
404 404
405 405 if e.filename in ('<ipython console>','<input>','<string>',
406 406 '<console>','<BackgroundJob compilation>',
407 407 None):
408 408
409 409 return False
410 410 try:
411 411 if (self.autoedit_syntax and
412 412 not self.ask_yes_no('Return to editor to correct syntax error? '
413 413 '[Y/n] ','y')):
414 414 return False
415 415 except EOFError:
416 416 return False
417 417
418 418 def int0(x):
419 419 try:
420 420 return int(x)
421 421 except TypeError:
422 422 return 0
423 423 # always pass integer line and offset values to editor hook
424 424 try:
425 425 self.hooks.fix_error_editor(e.filename,
426 426 int0(e.lineno),int0(e.offset),e.msg)
427 427 except TryNext:
428 428 warn('Could not open editor')
429 429 return False
430 430 return True
431 431
432 432 #-------------------------------------------------------------------------
433 433 # Things related to GUI support and pylab
434 434 #-------------------------------------------------------------------------
435 435
436 436 def enable_pylab(self, gui=None, import_all=True):
437 437 """Activate pylab support at runtime.
438 438
439 439 This turns on support for matplotlib, preloads into the interactive
440 440 namespace all of numpy and pylab, and configures IPython to correcdtly
441 441 interact with the GUI event loop. The GUI backend to be used can be
442 442 optionally selected with the optional :param:`gui` argument.
443 443
444 444 Parameters
445 445 ----------
446 446 gui : optional, string
447 447
448 448 If given, dictates the choice of matplotlib GUI backend to use
449 449 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
450 450 'gtk'), otherwise we use the default chosen by matplotlib (as
451 451 dictated by the matplotlib build-time options plus the user's
452 452 matplotlibrc configuration file).
453 453 """
454 454 # We want to prevent the loading of pylab to pollute the user's
455 455 # namespace as shown by the %who* magics, so we execute the activation
456 456 # code in an empty namespace, and we update *both* user_ns and
457 457 # user_ns_hidden with this information.
458 458 ns = {}
459 459 gui = pylab_activate(ns, gui, import_all)
460 460 self.user_ns.update(ns)
461 461 self.user_ns_hidden.update(ns)
462 462 # Now we must activate the gui pylab wants to use, and fix %run to take
463 463 # plot updates into account
464 464 enable_gui(gui)
465 465 self.magic_run = self._pylab_magic_run
466 466
467 467 #-------------------------------------------------------------------------
468 468 # Things related to exiting
469 469 #-------------------------------------------------------------------------
470 470
471 471 def ask_exit(self):
472 472 """ Ask the shell to exit. Can be overiden and used as a callback. """
473 473 self.exit_now = True
474 474
475 475 def exit(self):
476 476 """Handle interactive exit.
477 477
478 478 This method calls the ask_exit callback."""
479 479 if self.confirm_exit:
480 480 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
481 481 self.ask_exit()
482 482 else:
483 483 self.ask_exit()
484 484
485 485 #------------------------------------------------------------------------
486 486 # Magic overrides
487 487 #------------------------------------------------------------------------
488 488 # Once the base class stops inheriting from magic, this code needs to be
489 489 # moved into a separate machinery as well. For now, at least isolate here
490 490 # the magics which this class needs to implement differently from the base
491 491 # class, or that are unique to it.
492 492
493 493 def magic_autoindent(self, parameter_s = ''):
494 494 """Toggle autoindent on/off (if available)."""
495 495
496 496 self.shell.set_autoindent()
497 497 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
498 498
499 499 @skip_doctest
500 500 def magic_cpaste(self, parameter_s=''):
501 501 """Paste & execute a pre-formatted code block from clipboard.
502 502
503 503 You must terminate the block with '--' (two minus-signs) or Ctrl-D alone on the
504 504 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
505 505 is the new sentinel for this operation)
506 506
507 507 The block is dedented prior to execution to enable execution of method
508 508 definitions. '>' and '+' characters at the beginning of a line are
509 509 ignored, to allow pasting directly from e-mails, diff files and
510 510 doctests (the '...' continuation prompt is also stripped). The
511 511 executed block is also assigned to variable named 'pasted_block' for
512 512 later editing with '%edit pasted_block'.
513 513
514 514 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
515 515 This assigns the pasted block to variable 'foo' as string, without
516 516 dedenting or executing it (preceding >>> and + is still stripped)
517 517
518 518 '%cpaste -r' re-executes the block previously entered by cpaste.
519 519
520 520 Do not be alarmed by garbled output on Windows (it's a readline bug).
521 521 Just press enter and type -- (and press enter again) and the block
522 522 will be what was just pasted.
523 523
524 524 IPython statements (magics, shell escapes) are not supported (yet).
525 525
526 526 See also
527 527 --------
528 528 paste: automatically pull code from clipboard.
529 529
530 530 Examples
531 531 --------
532 532 ::
533 533
534 534 In [8]: %cpaste
535 535 Pasting code; enter '--' alone on the line to stop.
536 536 :>>> a = ["world!", "Hello"]
537 537 :>>> print " ".join(sorted(a))
538 538 :--
539 539 Hello world!
540 540 """
541 541
542 542 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
543 543 par = args.strip()
544 544 if opts.has_key('r'):
545 545 self._rerun_pasted()
546 546 return
547 547
548 548 sentinel = opts.get('s','--')
549 549
550 550 block = self._strip_pasted_lines_for_code(
551 551 self._get_pasted_lines(sentinel))
552 552
553 553 self._execute_block(block, par)
554 554
555 555 def magic_paste(self, parameter_s=''):
556 556 """Paste & execute a pre-formatted code block from clipboard.
557 557
558 558 The text is pulled directly from the clipboard without user
559 559 intervention and printed back on the screen before execution (unless
560 560 the -q flag is given to force quiet mode).
561 561
562 562 The block is dedented prior to execution to enable execution of method
563 563 definitions. '>' and '+' characters at the beginning of a line are
564 564 ignored, to allow pasting directly from e-mails, diff files and
565 565 doctests (the '...' continuation prompt is also stripped). The
566 566 executed block is also assigned to variable named 'pasted_block' for
567 567 later editing with '%edit pasted_block'.
568 568
569 569 You can also pass a variable name as an argument, e.g. '%paste foo'.
570 570 This assigns the pasted block to variable 'foo' as string, without
571 571 dedenting or executing it (preceding >>> and + is still stripped)
572 572
573 573 Options
574 574 -------
575 575
576 576 -r: re-executes the block previously entered by cpaste.
577 577
578 578 -q: quiet mode: do not echo the pasted text back to the terminal.
579 579
580 580 IPython statements (magics, shell escapes) are not supported (yet).
581 581
582 582 See also
583 583 --------
584 584 cpaste: manually paste code into terminal until you mark its end.
585 585 """
586 586 opts,args = self.parse_options(parameter_s,'rq',mode='string')
587 587 par = args.strip()
588 588 if opts.has_key('r'):
589 589 self._rerun_pasted()
590 590 return
591 591
592 592 text = self.shell.hooks.clipboard_get()
593 593 block = self._strip_pasted_lines_for_code(text.splitlines())
594 594
595 595 # By default, echo back to terminal unless quiet mode is requested
596 596 if not opts.has_key('q'):
597 597 write = self.shell.write
598 598 write(self.shell.pycolorize(block))
599 599 if not block.endswith('\n'):
600 600 write('\n')
601 601 write("## -- End pasted text --\n")
602 602
603 603 self._execute_block(block, par)
604 604
605 605 def showindentationerror(self):
606 606 super(TerminalInteractiveShell, self).showindentationerror()
607 607 print("If you want to paste code into IPython, try the %paste magic function.")
608 608
609 609
610 610 InteractiveShellABC.register(TerminalInteractiveShell)
General Comments 0
You need to be logged in to leave comments. Login now