##// END OF EJS Templates
Fall back to default editor if $EDITOR is non-ASCII....
Thomas Kluyver -
Show More
@@ -1,691 +1,697 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-2011 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 from __future__ import print_function
17 17
18 18 import bdb
19 19 import os
20 20 import sys
21 21
22 22 from IPython.core.error import TryNext, UsageError
23 23 from IPython.core.usage import interactive_usage, default_banner
24 24 from IPython.core.inputsplitter import IPythonInputSplitter
25 25 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
26 26 from IPython.core.magic import Magics, magics_class, line_magic
27 27 from IPython.lib.clipboard import ClipboardEmpty
28 28 from IPython.testing.skipdoctest import skip_doctest
29 29 from IPython.utils.encoding import get_stream_enc
30 30 from IPython.utils import py3compat
31 31 from IPython.utils.terminal import toggle_set_term_title, set_term_title
32 32 from IPython.utils.process import abbrev_cwd
33 33 from IPython.utils.warn import warn, error
34 34 from IPython.utils.text import num_ini_spaces, SList, strip_email_quotes
35 35 from IPython.utils.traitlets import Integer, CBool, Unicode
36 36
37 37 #-----------------------------------------------------------------------------
38 38 # Utilities
39 39 #-----------------------------------------------------------------------------
40 40
41 41 def get_default_editor():
42 42 try:
43 43 ed = os.environ['EDITOR']
44 if not py3compat.PY3:
45 ed = ed.decode()
46 return ed
44 47 except KeyError:
45 if os.name == 'posix':
46 ed = 'vi' # the only one guaranteed to be there!
47 else:
48 ed = 'notepad' # same in Windows!
49 return ed
50
48 pass
49 except UnicodeError:
50 warn("$EDITOR environment variable is not pure ASCII. Using platform "
51 "default editor.")
52
53 if os.name == 'posix':
54 return 'vi' # the only one guaranteed to be there!
55 else:
56 return 'notepad' # same in Windows!
51 57
52 58 def get_pasted_lines(sentinel, l_input=py3compat.input):
53 59 """ Yield pasted lines until the user enters the given sentinel value.
54 60 """
55 61 print("Pasting code; enter '%s' alone on the line to stop or use Ctrl-D." \
56 62 % sentinel)
57 63 while True:
58 64 try:
59 65 l = l_input(':')
60 66 if l == sentinel:
61 67 return
62 68 else:
63 69 yield l
64 70 except EOFError:
65 71 print('<EOF>')
66 72 return
67 73
68 74
69 75 #------------------------------------------------------------------------
70 76 # Terminal-specific magics
71 77 #------------------------------------------------------------------------
72 78
73 79 @magics_class
74 80 class TerminalMagics(Magics):
75 81 def __init__(self, shell):
76 82 super(TerminalMagics, self).__init__(shell)
77 83 self.input_splitter = IPythonInputSplitter()
78 84
79 85 def store_or_execute(self, block, name):
80 86 """ Execute a block, or store it in a variable, per the user's request.
81 87 """
82 88 if name:
83 89 # If storing it for further editing
84 90 self.shell.user_ns[name] = SList(block.splitlines())
85 91 print("Block assigned to '%s'" % name)
86 92 else:
87 93 b = self.preclean_input(block)
88 94 self.shell.user_ns['pasted_block'] = b
89 95 self.shell.using_paste_magics = True
90 96 try:
91 97 self.shell.run_cell(b)
92 98 finally:
93 99 self.shell.using_paste_magics = False
94 100
95 101 def preclean_input(self, block):
96 102 lines = block.splitlines()
97 103 while lines and not lines[0].strip():
98 104 lines = lines[1:]
99 105 return strip_email_quotes('\n'.join(lines))
100 106
101 107 def rerun_pasted(self, name='pasted_block'):
102 108 """ Rerun a previously pasted command.
103 109 """
104 110 b = self.shell.user_ns.get(name)
105 111
106 112 # Sanity checks
107 113 if b is None:
108 114 raise UsageError('No previous pasted block available')
109 115 if not isinstance(b, py3compat.string_types):
110 116 raise UsageError(
111 117 "Variable 'pasted_block' is not a string, can't execute")
112 118
113 119 print("Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b)))
114 120 self.shell.run_cell(b)
115 121
116 122 @line_magic
117 123 def autoindent(self, parameter_s = ''):
118 124 """Toggle autoindent on/off (if available)."""
119 125
120 126 self.shell.set_autoindent()
121 127 print("Automatic indentation is:",['OFF','ON'][self.shell.autoindent])
122 128
123 129 @skip_doctest
124 130 @line_magic
125 131 def cpaste(self, parameter_s=''):
126 132 """Paste & execute a pre-formatted code block from clipboard.
127 133
128 134 You must terminate the block with '--' (two minus-signs) or Ctrl-D
129 135 alone on the line. You can also provide your own sentinel with '%paste
130 136 -s %%' ('%%' is the new sentinel for this operation)
131 137
132 138 The block is dedented prior to execution to enable execution of method
133 139 definitions. '>' and '+' characters at the beginning of a line are
134 140 ignored, to allow pasting directly from e-mails, diff files and
135 141 doctests (the '...' continuation prompt is also stripped). The
136 142 executed block is also assigned to variable named 'pasted_block' for
137 143 later editing with '%edit pasted_block'.
138 144
139 145 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
140 146 This assigns the pasted block to variable 'foo' as string, without
141 147 dedenting or executing it (preceding >>> and + is still stripped)
142 148
143 149 '%cpaste -r' re-executes the block previously entered by cpaste.
144 150
145 151 Do not be alarmed by garbled output on Windows (it's a readline bug).
146 152 Just press enter and type -- (and press enter again) and the block
147 153 will be what was just pasted.
148 154
149 155 IPython statements (magics, shell escapes) are not supported (yet).
150 156
151 157 See also
152 158 --------
153 159 paste: automatically pull code from clipboard.
154 160
155 161 Examples
156 162 --------
157 163 ::
158 164
159 165 In [8]: %cpaste
160 166 Pasting code; enter '--' alone on the line to stop.
161 167 :>>> a = ["world!", "Hello"]
162 168 :>>> print " ".join(sorted(a))
163 169 :--
164 170 Hello world!
165 171 """
166 172 opts, name = self.parse_options(parameter_s, 'rs:', mode='string')
167 173 if 'r' in opts:
168 174 self.rerun_pasted()
169 175 return
170 176
171 177 sentinel = opts.get('s', '--')
172 178 block = '\n'.join(get_pasted_lines(sentinel))
173 179 self.store_or_execute(block, name)
174 180
175 181 @line_magic
176 182 def paste(self, parameter_s=''):
177 183 """Paste & execute a pre-formatted code block from clipboard.
178 184
179 185 The text is pulled directly from the clipboard without user
180 186 intervention and printed back on the screen before execution (unless
181 187 the -q flag is given to force quiet mode).
182 188
183 189 The block is dedented prior to execution to enable execution of method
184 190 definitions. '>' and '+' characters at the beginning of a line are
185 191 ignored, to allow pasting directly from e-mails, diff files and
186 192 doctests (the '...' continuation prompt is also stripped). The
187 193 executed block is also assigned to variable named 'pasted_block' for
188 194 later editing with '%edit pasted_block'.
189 195
190 196 You can also pass a variable name as an argument, e.g. '%paste foo'.
191 197 This assigns the pasted block to variable 'foo' as string, without
192 198 executing it (preceding >>> and + is still stripped).
193 199
194 200 Options:
195 201
196 202 -r: re-executes the block previously entered by cpaste.
197 203
198 204 -q: quiet mode: do not echo the pasted text back to the terminal.
199 205
200 206 IPython statements (magics, shell escapes) are not supported (yet).
201 207
202 208 See also
203 209 --------
204 210 cpaste: manually paste code into terminal until you mark its end.
205 211 """
206 212 opts, name = self.parse_options(parameter_s, 'rq', mode='string')
207 213 if 'r' in opts:
208 214 self.rerun_pasted()
209 215 return
210 216 try:
211 217 block = self.shell.hooks.clipboard_get()
212 218 except TryNext as clipboard_exc:
213 219 message = getattr(clipboard_exc, 'args')
214 220 if message:
215 221 error(message[0])
216 222 else:
217 223 error('Could not get text from the clipboard.')
218 224 return
219 225 except ClipboardEmpty:
220 226 raise UsageError("The clipboard appears to be empty")
221 227
222 228 # By default, echo back to terminal unless quiet mode is requested
223 229 if 'q' not in opts:
224 230 write = self.shell.write
225 231 write(self.shell.pycolorize(block))
226 232 if not block.endswith('\n'):
227 233 write('\n')
228 234 write("## -- End pasted text --\n")
229 235
230 236 self.store_or_execute(block, name)
231 237
232 238 # Class-level: add a '%cls' magic only on Windows
233 239 if sys.platform == 'win32':
234 240 @line_magic
235 241 def cls(self, s):
236 242 """Clear screen.
237 243 """
238 244 os.system("cls")
239 245
240 246 #-----------------------------------------------------------------------------
241 247 # Main class
242 248 #-----------------------------------------------------------------------------
243 249
244 250 class TerminalInteractiveShell(InteractiveShell):
245 251
246 252 autoedit_syntax = CBool(False, config=True,
247 253 help="auto editing of files with syntax errors.")
248 254 banner = Unicode('')
249 255 banner1 = Unicode(default_banner, config=True,
250 256 help="""The part of the banner to be printed before the profile"""
251 257 )
252 258 banner2 = Unicode('', config=True,
253 259 help="""The part of the banner to be printed after the profile"""
254 260 )
255 261 confirm_exit = CBool(True, config=True,
256 262 help="""
257 263 Set to confirm when you try to exit IPython with an EOF (Control-D
258 264 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
259 265 you can force a direct exit without any confirmation.""",
260 266 )
261 267 # This display_banner only controls whether or not self.show_banner()
262 268 # is called when mainloop/interact are called. The default is False
263 269 # because for the terminal based application, the banner behavior
264 270 # is controlled by Global.display_banner, which IPythonApp looks at
265 271 # to determine if *it* should call show_banner() by hand or not.
266 272 display_banner = CBool(False) # This isn't configurable!
267 273 embedded = CBool(False)
268 274 embedded_active = CBool(False)
269 275 editor = Unicode(get_default_editor(), config=True,
270 276 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
271 277 )
272 278 pager = Unicode('less', config=True,
273 279 help="The shell program to be used for paging.")
274 280
275 281 screen_length = Integer(0, config=True,
276 282 help=
277 283 """Number of lines of your screen, used to control printing of very
278 284 long strings. Strings longer than this number of lines will be sent
279 285 through a pager instead of directly printed. The default value for
280 286 this is 0, which means IPython will auto-detect your screen size every
281 287 time it needs to print certain potentially long strings (this doesn't
282 288 change the behavior of the 'print' keyword, it's only triggered
283 289 internally). If for some reason this isn't working well (it needs
284 290 curses support), specify it yourself. Otherwise don't change the
285 291 default.""",
286 292 )
287 293 term_title = CBool(False, config=True,
288 294 help="Enable auto setting the terminal title."
289 295 )
290 296
291 297 # This `using_paste_magics` is used to detect whether the code is being
292 298 # executed via paste magics functions
293 299 using_paste_magics = CBool(False)
294 300
295 301 # In the terminal, GUI control is done via PyOS_InputHook
296 302 @staticmethod
297 303 def enable_gui(gui=None, app=None):
298 304 """Switch amongst GUI input hooks by name.
299 305 """
300 306 # Deferred import
301 307 from IPython.lib.inputhook import enable_gui as real_enable_gui
302 308 try:
303 309 return real_enable_gui(gui, app)
304 310 except ValueError as e:
305 311 raise UsageError("%s" % e)
306 312
307 313 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
308 314 user_ns=None, user_module=None, custom_exceptions=((),None),
309 315 usage=None, banner1=None, banner2=None, display_banner=None,
310 316 **kwargs):
311 317
312 318 super(TerminalInteractiveShell, self).__init__(
313 319 config=config, ipython_dir=ipython_dir, profile_dir=profile_dir, user_ns=user_ns,
314 320 user_module=user_module, custom_exceptions=custom_exceptions,
315 321 **kwargs
316 322 )
317 323 # use os.system instead of utils.process.system by default,
318 324 # because piped system doesn't make sense in the Terminal:
319 325 self.system = self.system_raw
320 326
321 327 self.init_term_title()
322 328 self.init_usage(usage)
323 329 self.init_banner(banner1, banner2, display_banner)
324 330
325 331 #-------------------------------------------------------------------------
326 332 # Overrides of init stages
327 333 #-------------------------------------------------------------------------
328 334
329 335 def init_display_formatter(self):
330 336 super(TerminalInteractiveShell, self).init_display_formatter()
331 337 # terminal only supports plaintext
332 338 self.display_formatter.active_types = ['text/plain']
333 339
334 340 #-------------------------------------------------------------------------
335 341 # Things related to the terminal
336 342 #-------------------------------------------------------------------------
337 343
338 344 @property
339 345 def usable_screen_length(self):
340 346 if self.screen_length == 0:
341 347 return 0
342 348 else:
343 349 num_lines_bot = self.separate_in.count('\n')+1
344 350 return self.screen_length - num_lines_bot
345 351
346 352 def init_term_title(self):
347 353 # Enable or disable the terminal title.
348 354 if self.term_title:
349 355 toggle_set_term_title(True)
350 356 set_term_title('IPython: ' + abbrev_cwd())
351 357 else:
352 358 toggle_set_term_title(False)
353 359
354 360 #-------------------------------------------------------------------------
355 361 # Things related to aliases
356 362 #-------------------------------------------------------------------------
357 363
358 364 def init_alias(self):
359 365 # The parent class defines aliases that can be safely used with any
360 366 # frontend.
361 367 super(TerminalInteractiveShell, self).init_alias()
362 368
363 369 # Now define aliases that only make sense on the terminal, because they
364 370 # need direct access to the console in a way that we can't emulate in
365 371 # GUI or web frontend
366 372 if os.name == 'posix':
367 373 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
368 374 ('man', 'man')]
369 375 elif os.name == 'nt':
370 376 aliases = [('cls', 'cls')]
371 377
372 378
373 379 for name, cmd in aliases:
374 380 self.alias_manager.soft_define_alias(name, cmd)
375 381
376 382 #-------------------------------------------------------------------------
377 383 # Things related to the banner and usage
378 384 #-------------------------------------------------------------------------
379 385
380 386 def _banner1_changed(self):
381 387 self.compute_banner()
382 388
383 389 def _banner2_changed(self):
384 390 self.compute_banner()
385 391
386 392 def _term_title_changed(self, name, new_value):
387 393 self.init_term_title()
388 394
389 395 def init_banner(self, banner1, banner2, display_banner):
390 396 if banner1 is not None:
391 397 self.banner1 = banner1
392 398 if banner2 is not None:
393 399 self.banner2 = banner2
394 400 if display_banner is not None:
395 401 self.display_banner = display_banner
396 402 self.compute_banner()
397 403
398 404 def show_banner(self, banner=None):
399 405 if banner is None:
400 406 banner = self.banner
401 407 self.write(banner)
402 408
403 409 def compute_banner(self):
404 410 self.banner = self.banner1
405 411 if self.profile and self.profile != 'default':
406 412 self.banner += '\nIPython profile: %s\n' % self.profile
407 413 if self.banner2:
408 414 self.banner += '\n' + self.banner2
409 415
410 416 def init_usage(self, usage=None):
411 417 if usage is None:
412 418 self.usage = interactive_usage
413 419 else:
414 420 self.usage = usage
415 421
416 422 #-------------------------------------------------------------------------
417 423 # Mainloop and code execution logic
418 424 #-------------------------------------------------------------------------
419 425
420 426 def mainloop(self, display_banner=None):
421 427 """Start the mainloop.
422 428
423 429 If an optional banner argument is given, it will override the
424 430 internally created default banner.
425 431 """
426 432
427 433 with self.builtin_trap, self.display_trap:
428 434
429 435 while 1:
430 436 try:
431 437 self.interact(display_banner=display_banner)
432 438 #self.interact_with_readline()
433 439 # XXX for testing of a readline-decoupled repl loop, call
434 440 # interact_with_readline above
435 441 break
436 442 except KeyboardInterrupt:
437 443 # this should not be necessary, but KeyboardInterrupt
438 444 # handling seems rather unpredictable...
439 445 self.write("\nKeyboardInterrupt in interact()\n")
440 446
441 447 def _replace_rlhist_multiline(self, source_raw, hlen_before_cell):
442 448 """Store multiple lines as a single entry in history"""
443 449
444 450 # do nothing without readline or disabled multiline
445 451 if not self.has_readline or not self.multiline_history:
446 452 return hlen_before_cell
447 453
448 454 # windows rl has no remove_history_item
449 455 if not hasattr(self.readline, "remove_history_item"):
450 456 return hlen_before_cell
451 457
452 458 # skip empty cells
453 459 if not source_raw.rstrip():
454 460 return hlen_before_cell
455 461
456 462 # nothing changed do nothing, e.g. when rl removes consecutive dups
457 463 hlen = self.readline.get_current_history_length()
458 464 if hlen == hlen_before_cell:
459 465 return hlen_before_cell
460 466
461 467 for i in range(hlen - hlen_before_cell):
462 468 self.readline.remove_history_item(hlen - i - 1)
463 469 stdin_encoding = get_stream_enc(sys.stdin, 'utf-8')
464 470 self.readline.add_history(py3compat.unicode_to_str(source_raw.rstrip(),
465 471 stdin_encoding))
466 472 return self.readline.get_current_history_length()
467 473
468 474 def interact(self, display_banner=None):
469 475 """Closely emulate the interactive Python console."""
470 476
471 477 # batch run -> do not interact
472 478 if self.exit_now:
473 479 return
474 480
475 481 if display_banner is None:
476 482 display_banner = self.display_banner
477 483
478 484 if isinstance(display_banner, py3compat.string_types):
479 485 self.show_banner(display_banner)
480 486 elif display_banner:
481 487 self.show_banner()
482 488
483 489 more = False
484 490
485 491 if self.has_readline:
486 492 self.readline_startup_hook(self.pre_readline)
487 493 hlen_b4_cell = self.readline.get_current_history_length()
488 494 else:
489 495 hlen_b4_cell = 0
490 496 # exit_now is set by a call to %Exit or %Quit, through the
491 497 # ask_exit callback.
492 498
493 499 while not self.exit_now:
494 500 self.hooks.pre_prompt_hook()
495 501 if more:
496 502 try:
497 503 prompt = self.prompt_manager.render('in2')
498 504 except:
499 505 self.showtraceback()
500 506 if self.autoindent:
501 507 self.rl_do_indent = True
502 508
503 509 else:
504 510 try:
505 511 prompt = self.separate_in + self.prompt_manager.render('in')
506 512 except:
507 513 self.showtraceback()
508 514 try:
509 515 line = self.raw_input(prompt)
510 516 if self.exit_now:
511 517 # quick exit on sys.std[in|out] close
512 518 break
513 519 if self.autoindent:
514 520 self.rl_do_indent = False
515 521
516 522 except KeyboardInterrupt:
517 523 #double-guard against keyboardinterrupts during kbdint handling
518 524 try:
519 525 self.write('\nKeyboardInterrupt\n')
520 526 source_raw = self.input_splitter.source_raw_reset()[1]
521 527 hlen_b4_cell = \
522 528 self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
523 529 more = False
524 530 except KeyboardInterrupt:
525 531 pass
526 532 except EOFError:
527 533 if self.autoindent:
528 534 self.rl_do_indent = False
529 535 if self.has_readline:
530 536 self.readline_startup_hook(None)
531 537 self.write('\n')
532 538 self.exit()
533 539 except bdb.BdbQuit:
534 540 warn('The Python debugger has exited with a BdbQuit exception.\n'
535 541 'Because of how pdb handles the stack, it is impossible\n'
536 542 'for IPython to properly format this particular exception.\n'
537 543 'IPython will resume normal operation.')
538 544 except:
539 545 # exceptions here are VERY RARE, but they can be triggered
540 546 # asynchronously by signal handlers, for example.
541 547 self.showtraceback()
542 548 else:
543 549 self.input_splitter.push(line)
544 550 more = self.input_splitter.push_accepts_more()
545 551 if (self.SyntaxTB.last_syntax_error and
546 552 self.autoedit_syntax):
547 553 self.edit_syntax_error()
548 554 if not more:
549 555 source_raw = self.input_splitter.source_raw_reset()[1]
550 556 self.run_cell(source_raw, store_history=True)
551 557 hlen_b4_cell = \
552 558 self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
553 559
554 560 # Turn off the exit flag, so the mainloop can be restarted if desired
555 561 self.exit_now = False
556 562
557 563 def raw_input(self, prompt=''):
558 564 """Write a prompt and read a line.
559 565
560 566 The returned line does not include the trailing newline.
561 567 When the user enters the EOF key sequence, EOFError is raised.
562 568
563 569 Parameters
564 570 ----------
565 571
566 572 prompt : str, optional
567 573 A string to be printed to prompt the user.
568 574 """
569 575 # Code run by the user may have modified the readline completer state.
570 576 # We must ensure that our completer is back in place.
571 577
572 578 if self.has_readline:
573 579 self.set_readline_completer()
574 580
575 581 # raw_input expects str, but we pass it unicode sometimes
576 582 prompt = py3compat.cast_bytes_py2(prompt)
577 583
578 584 try:
579 585 line = py3compat.str_to_unicode(self.raw_input_original(prompt))
580 586 except ValueError:
581 587 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
582 588 " or sys.stdout.close()!\nExiting IPython!\n")
583 589 self.ask_exit()
584 590 return ""
585 591
586 592 # Try to be reasonably smart about not re-indenting pasted input more
587 593 # than necessary. We do this by trimming out the auto-indent initial
588 594 # spaces, if the user's actual input started itself with whitespace.
589 595 if self.autoindent:
590 596 if num_ini_spaces(line) > self.indent_current_nsp:
591 597 line = line[self.indent_current_nsp:]
592 598 self.indent_current_nsp = 0
593 599
594 600 return line
595 601
596 602 #-------------------------------------------------------------------------
597 603 # Methods to support auto-editing of SyntaxErrors.
598 604 #-------------------------------------------------------------------------
599 605
600 606 def edit_syntax_error(self):
601 607 """The bottom half of the syntax error handler called in the main loop.
602 608
603 609 Loop until syntax error is fixed or user cancels.
604 610 """
605 611
606 612 while self.SyntaxTB.last_syntax_error:
607 613 # copy and clear last_syntax_error
608 614 err = self.SyntaxTB.clear_err_state()
609 615 if not self._should_recompile(err):
610 616 return
611 617 try:
612 618 # may set last_syntax_error again if a SyntaxError is raised
613 619 self.safe_execfile(err.filename,self.user_ns)
614 620 except:
615 621 self.showtraceback()
616 622 else:
617 623 try:
618 624 f = open(err.filename)
619 625 try:
620 626 # This should be inside a display_trap block and I
621 627 # think it is.
622 628 sys.displayhook(f.read())
623 629 finally:
624 630 f.close()
625 631 except:
626 632 self.showtraceback()
627 633
628 634 def _should_recompile(self,e):
629 635 """Utility routine for edit_syntax_error"""
630 636
631 637 if e.filename in ('<ipython console>','<input>','<string>',
632 638 '<console>','<BackgroundJob compilation>',
633 639 None):
634 640
635 641 return False
636 642 try:
637 643 if (self.autoedit_syntax and
638 644 not self.ask_yes_no('Return to editor to correct syntax error? '
639 645 '[Y/n] ','y')):
640 646 return False
641 647 except EOFError:
642 648 return False
643 649
644 650 def int0(x):
645 651 try:
646 652 return int(x)
647 653 except TypeError:
648 654 return 0
649 655 # always pass integer line and offset values to editor hook
650 656 try:
651 657 self.hooks.fix_error_editor(e.filename,
652 658 int0(e.lineno),int0(e.offset),e.msg)
653 659 except TryNext:
654 660 warn('Could not open editor')
655 661 return False
656 662 return True
657 663
658 664 #-------------------------------------------------------------------------
659 665 # Things related to exiting
660 666 #-------------------------------------------------------------------------
661 667
662 668 def ask_exit(self):
663 669 """ Ask the shell to exit. Can be overiden and used as a callback. """
664 670 self.exit_now = True
665 671
666 672 def exit(self):
667 673 """Handle interactive exit.
668 674
669 675 This method calls the ask_exit callback."""
670 676 if self.confirm_exit:
671 677 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
672 678 self.ask_exit()
673 679 else:
674 680 self.ask_exit()
675 681
676 682 #-------------------------------------------------------------------------
677 683 # Things related to magics
678 684 #-------------------------------------------------------------------------
679 685
680 686 def init_magics(self):
681 687 super(TerminalInteractiveShell, self).init_magics()
682 688 self.register_magics(TerminalMagics)
683 689
684 690 def showindentationerror(self):
685 691 super(TerminalInteractiveShell, self).showindentationerror()
686 692 if not self.using_paste_magics:
687 693 print("If you want to paste code into IPython, try the "
688 694 "%paste and %cpaste magic functions.")
689 695
690 696
691 697 InteractiveShellABC.register(TerminalInteractiveShell)
General Comments 0
You need to be logged in to leave comments. Login now