##// END OF EJS Templates
respect banner argument in TerminalInteractiveShell.interact...
MinRK -
Show More
@@ -1,590 +1,593 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 from contextlib import nested
20 20 import os
21 21 import re
22 22 import sys
23 23
24 24 from IPython.core.error import TryNext
25 25 from IPython.core.usage import interactive_usage, default_banner
26 26 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
27 27 from IPython.lib.inputhook import enable_gui
28 28 from IPython.lib.pylabtools import pylab_activate
29 29 from IPython.testing.skipdoctest import skip_doctest
30 30 from IPython.utils.terminal import toggle_set_term_title, set_term_title
31 31 from IPython.utils.process import abbrev_cwd
32 32 from IPython.utils.warn import warn
33 33 from IPython.utils.text import num_ini_spaces
34 34 from IPython.utils.traitlets import Int, CBool, Unicode
35 35
36 36 #-----------------------------------------------------------------------------
37 37 # Utilities
38 38 #-----------------------------------------------------------------------------
39 39
40 40 def get_default_editor():
41 41 try:
42 42 ed = os.environ['EDITOR']
43 43 except KeyError:
44 44 if os.name == 'posix':
45 45 ed = 'vi' # the only one guaranteed to be there!
46 46 else:
47 47 ed = 'notepad' # same in Windows!
48 48 return ed
49 49
50 50
51 51 # store the builtin raw_input globally, and use this always, in case user code
52 52 # overwrites it (like wx.py.PyShell does)
53 53 raw_input_original = raw_input
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 232 def interact(self, display_banner=None):
233 233 """Closely emulate the interactive Python console."""
234 234
235 235 # batch run -> do not interact
236 236 if self.exit_now:
237 237 return
238 238
239 239 if display_banner is None:
240 240 display_banner = self.display_banner
241 if display_banner:
241
242 if isinstance(display_banner, basestring):
243 self.show_banner(display_banner)
244 elif display_banner:
242 245 self.show_banner()
243 246
244 247 more = False
245 248
246 249 # Mark activity in the builtins
247 250 __builtin__.__dict__['__IPYTHON__active'] += 1
248 251
249 252 if self.has_readline:
250 253 self.readline_startup_hook(self.pre_readline)
251 254 # exit_now is set by a call to %Exit or %Quit, through the
252 255 # ask_exit callback.
253 256
254 257 while not self.exit_now:
255 258 self.hooks.pre_prompt_hook()
256 259 if more:
257 260 try:
258 261 prompt = self.hooks.generate_prompt(True)
259 262 except:
260 263 self.showtraceback()
261 264 if self.autoindent:
262 265 self.rl_do_indent = True
263 266
264 267 else:
265 268 try:
266 269 prompt = self.hooks.generate_prompt(False)
267 270 except:
268 271 self.showtraceback()
269 272 try:
270 273 line = self.raw_input(prompt)
271 274 if self.exit_now:
272 275 # quick exit on sys.std[in|out] close
273 276 break
274 277 if self.autoindent:
275 278 self.rl_do_indent = False
276 279
277 280 except KeyboardInterrupt:
278 281 #double-guard against keyboardinterrupts during kbdint handling
279 282 try:
280 283 self.write('\nKeyboardInterrupt\n')
281 284 self.input_splitter.reset()
282 285 more = False
283 286 except KeyboardInterrupt:
284 287 pass
285 288 except EOFError:
286 289 if self.autoindent:
287 290 self.rl_do_indent = False
288 291 if self.has_readline:
289 292 self.readline_startup_hook(None)
290 293 self.write('\n')
291 294 self.exit()
292 295 except bdb.BdbQuit:
293 296 warn('The Python debugger has exited with a BdbQuit exception.\n'
294 297 'Because of how pdb handles the stack, it is impossible\n'
295 298 'for IPython to properly format this particular exception.\n'
296 299 'IPython will resume normal operation.')
297 300 except:
298 301 # exceptions here are VERY RARE, but they can be triggered
299 302 # asynchronously by signal handlers, for example.
300 303 self.showtraceback()
301 304 else:
302 305 self.input_splitter.push(line)
303 306 more = self.input_splitter.push_accepts_more()
304 307 if (self.SyntaxTB.last_syntax_error and
305 308 self.autoedit_syntax):
306 309 self.edit_syntax_error()
307 310 if not more:
308 311 source_raw = self.input_splitter.source_raw_reset()[1]
309 312 self.run_cell(source_raw)
310 313
311 314 # We are off again...
312 315 __builtin__.__dict__['__IPYTHON__active'] -= 1
313 316
314 317 # Turn off the exit flag, so the mainloop can be restarted if desired
315 318 self.exit_now = False
316 319
317 320 def raw_input(self, prompt=''):
318 321 """Write a prompt and read a line.
319 322
320 323 The returned line does not include the trailing newline.
321 324 When the user enters the EOF key sequence, EOFError is raised.
322 325
323 326 Optional inputs:
324 327
325 328 - prompt(''): a string to be printed to prompt the user.
326 329
327 330 - continue_prompt(False): whether this line is the first one or a
328 331 continuation in a sequence of inputs.
329 332 """
330 333 # Code run by the user may have modified the readline completer state.
331 334 # We must ensure that our completer is back in place.
332 335
333 336 if self.has_readline:
334 337 self.set_readline_completer()
335 338
336 339 try:
337 340 line = raw_input_original(prompt).decode(self.stdin_encoding)
338 341 except ValueError:
339 342 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
340 343 " or sys.stdout.close()!\nExiting IPython!")
341 344 self.ask_exit()
342 345 return ""
343 346
344 347 # Try to be reasonably smart about not re-indenting pasted input more
345 348 # than necessary. We do this by trimming out the auto-indent initial
346 349 # spaces, if the user's actual input started itself with whitespace.
347 350 if self.autoindent:
348 351 if num_ini_spaces(line) > self.indent_current_nsp:
349 352 line = line[self.indent_current_nsp:]
350 353 self.indent_current_nsp = 0
351 354
352 355 return line
353 356
354 357 #-------------------------------------------------------------------------
355 358 # Methods to support auto-editing of SyntaxErrors.
356 359 #-------------------------------------------------------------------------
357 360
358 361 def edit_syntax_error(self):
359 362 """The bottom half of the syntax error handler called in the main loop.
360 363
361 364 Loop until syntax error is fixed or user cancels.
362 365 """
363 366
364 367 while self.SyntaxTB.last_syntax_error:
365 368 # copy and clear last_syntax_error
366 369 err = self.SyntaxTB.clear_err_state()
367 370 if not self._should_recompile(err):
368 371 return
369 372 try:
370 373 # may set last_syntax_error again if a SyntaxError is raised
371 374 self.safe_execfile(err.filename,self.user_ns)
372 375 except:
373 376 self.showtraceback()
374 377 else:
375 378 try:
376 379 f = file(err.filename)
377 380 try:
378 381 # This should be inside a display_trap block and I
379 382 # think it is.
380 383 sys.displayhook(f.read())
381 384 finally:
382 385 f.close()
383 386 except:
384 387 self.showtraceback()
385 388
386 389 def _should_recompile(self,e):
387 390 """Utility routine for edit_syntax_error"""
388 391
389 392 if e.filename in ('<ipython console>','<input>','<string>',
390 393 '<console>','<BackgroundJob compilation>',
391 394 None):
392 395
393 396 return False
394 397 try:
395 398 if (self.autoedit_syntax and
396 399 not self.ask_yes_no('Return to editor to correct syntax error? '
397 400 '[Y/n] ','y')):
398 401 return False
399 402 except EOFError:
400 403 return False
401 404
402 405 def int0(x):
403 406 try:
404 407 return int(x)
405 408 except TypeError:
406 409 return 0
407 410 # always pass integer line and offset values to editor hook
408 411 try:
409 412 self.hooks.fix_error_editor(e.filename,
410 413 int0(e.lineno),int0(e.offset),e.msg)
411 414 except TryNext:
412 415 warn('Could not open editor')
413 416 return False
414 417 return True
415 418
416 419 #-------------------------------------------------------------------------
417 420 # Things related to GUI support and pylab
418 421 #-------------------------------------------------------------------------
419 422
420 423 def enable_pylab(self, gui=None, import_all=True):
421 424 """Activate pylab support at runtime.
422 425
423 426 This turns on support for matplotlib, preloads into the interactive
424 427 namespace all of numpy and pylab, and configures IPython to correcdtly
425 428 interact with the GUI event loop. The GUI backend to be used can be
426 429 optionally selected with the optional :param:`gui` argument.
427 430
428 431 Parameters
429 432 ----------
430 433 gui : optional, string
431 434
432 435 If given, dictates the choice of matplotlib GUI backend to use
433 436 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
434 437 'gtk'), otherwise we use the default chosen by matplotlib (as
435 438 dictated by the matplotlib build-time options plus the user's
436 439 matplotlibrc configuration file).
437 440 """
438 441 # We want to prevent the loading of pylab to pollute the user's
439 442 # namespace as shown by the %who* magics, so we execute the activation
440 443 # code in an empty namespace, and we update *both* user_ns and
441 444 # user_ns_hidden with this information.
442 445 ns = {}
443 446 gui = pylab_activate(ns, gui, import_all)
444 447 self.user_ns.update(ns)
445 448 self.user_ns_hidden.update(ns)
446 449 # Now we must activate the gui pylab wants to use, and fix %run to take
447 450 # plot updates into account
448 451 enable_gui(gui)
449 452 self.magic_run = self._pylab_magic_run
450 453
451 454 #-------------------------------------------------------------------------
452 455 # Things related to exiting
453 456 #-------------------------------------------------------------------------
454 457
455 458 def ask_exit(self):
456 459 """ Ask the shell to exit. Can be overiden and used as a callback. """
457 460 self.exit_now = True
458 461
459 462 def exit(self):
460 463 """Handle interactive exit.
461 464
462 465 This method calls the ask_exit callback."""
463 466 if self.confirm_exit:
464 467 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
465 468 self.ask_exit()
466 469 else:
467 470 self.ask_exit()
468 471
469 472 #------------------------------------------------------------------------
470 473 # Magic overrides
471 474 #------------------------------------------------------------------------
472 475 # Once the base class stops inheriting from magic, this code needs to be
473 476 # moved into a separate machinery as well. For now, at least isolate here
474 477 # the magics which this class needs to implement differently from the base
475 478 # class, or that are unique to it.
476 479
477 480 def magic_autoindent(self, parameter_s = ''):
478 481 """Toggle autoindent on/off (if available)."""
479 482
480 483 self.shell.set_autoindent()
481 484 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
482 485
483 486 @skip_doctest
484 487 def magic_cpaste(self, parameter_s=''):
485 488 """Paste & execute a pre-formatted code block from clipboard.
486 489
487 490 You must terminate the block with '--' (two minus-signs) alone on the
488 491 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
489 492 is the new sentinel for this operation)
490 493
491 494 The block is dedented prior to execution to enable execution of method
492 495 definitions. '>' and '+' characters at the beginning of a line are
493 496 ignored, to allow pasting directly from e-mails, diff files and
494 497 doctests (the '...' continuation prompt is also stripped). The
495 498 executed block is also assigned to variable named 'pasted_block' for
496 499 later editing with '%edit pasted_block'.
497 500
498 501 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
499 502 This assigns the pasted block to variable 'foo' as string, without
500 503 dedenting or executing it (preceding >>> and + is still stripped)
501 504
502 505 '%cpaste -r' re-executes the block previously entered by cpaste.
503 506
504 507 Do not be alarmed by garbled output on Windows (it's a readline bug).
505 508 Just press enter and type -- (and press enter again) and the block
506 509 will be what was just pasted.
507 510
508 511 IPython statements (magics, shell escapes) are not supported (yet).
509 512
510 513 See also
511 514 --------
512 515 paste: automatically pull code from clipboard.
513 516
514 517 Examples
515 518 --------
516 519 ::
517 520
518 521 In [8]: %cpaste
519 522 Pasting code; enter '--' alone on the line to stop.
520 523 :>>> a = ["world!", "Hello"]
521 524 :>>> print " ".join(sorted(a))
522 525 :--
523 526 Hello world!
524 527 """
525 528
526 529 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
527 530 par = args.strip()
528 531 if opts.has_key('r'):
529 532 self._rerun_pasted()
530 533 return
531 534
532 535 sentinel = opts.get('s','--')
533 536
534 537 block = self._strip_pasted_lines_for_code(
535 538 self._get_pasted_lines(sentinel))
536 539
537 540 self._execute_block(block, par)
538 541
539 542 def magic_paste(self, parameter_s=''):
540 543 """Paste & execute a pre-formatted code block from clipboard.
541 544
542 545 The text is pulled directly from the clipboard without user
543 546 intervention and printed back on the screen before execution (unless
544 547 the -q flag is given to force quiet mode).
545 548
546 549 The block is dedented prior to execution to enable execution of method
547 550 definitions. '>' and '+' characters at the beginning of a line are
548 551 ignored, to allow pasting directly from e-mails, diff files and
549 552 doctests (the '...' continuation prompt is also stripped). The
550 553 executed block is also assigned to variable named 'pasted_block' for
551 554 later editing with '%edit pasted_block'.
552 555
553 556 You can also pass a variable name as an argument, e.g. '%paste foo'.
554 557 This assigns the pasted block to variable 'foo' as string, without
555 558 dedenting or executing it (preceding >>> and + is still stripped)
556 559
557 560 Options
558 561 -------
559 562
560 563 -r: re-executes the block previously entered by cpaste.
561 564
562 565 -q: quiet mode: do not echo the pasted text back to the terminal.
563 566
564 567 IPython statements (magics, shell escapes) are not supported (yet).
565 568
566 569 See also
567 570 --------
568 571 cpaste: manually paste code into terminal until you mark its end.
569 572 """
570 573 opts,args = self.parse_options(parameter_s,'rq',mode='string')
571 574 par = args.strip()
572 575 if opts.has_key('r'):
573 576 self._rerun_pasted()
574 577 return
575 578
576 579 text = self.shell.hooks.clipboard_get()
577 580 block = self._strip_pasted_lines_for_code(text.splitlines())
578 581
579 582 # By default, echo back to terminal unless quiet mode is requested
580 583 if not opts.has_key('q'):
581 584 write = self.shell.write
582 585 write(self.shell.pycolorize(block))
583 586 if not block.endswith('\n'):
584 587 write('\n')
585 588 write("## -- End pasted text --\n")
586 589
587 590 self._execute_block(block, par)
588 591
589 592
590 593 InteractiveShellABC.register(TerminalInteractiveShell)
General Comments 0
You need to be logged in to leave comments. Login now