##// END OF EJS Templates
Restore option to auto-edit files on syntax error
Thomas Kluyver -
Show More
@@ -1432,6 +1432,7 b' class SyntaxTB(ListTB):'
1432 1432 newtext = ulinecache.getline(value.filename, value.lineno)
1433 1433 if newtext:
1434 1434 value.text = newtext
1435 self.last_syntax_error = value
1435 1436 return super(SyntaxTB, self).structured_traceback(etype, value, elist,
1436 1437 tb_offset=tb_offset, context=context)
1437 1438
@@ -4,7 +4,9 b' from __future__ import print_function'
4 4 import os
5 5 import sys
6 6 import signal
7 from warnings import warn
7 8
9 from IPython.core.error import TryNext
8 10 from IPython.core.interactiveshell import InteractiveShell
9 11 from IPython.utils.py3compat import PY3, cast_unicode_py2, input
10 12 from IPython.utils.terminal import toggle_set_term_title, set_term_title
@@ -72,6 +74,9 b' class TerminalInteractiveShell(InteractiveShell):'
72 74
73 75 pt_cli = None
74 76
77 autoedit_syntax = CBool(False, config=True,
78 help="auto editing of files with syntax errors.")
79
75 80 confirm_exit = CBool(True, config=True,
76 81 help="""
77 82 Set to confirm when you try to exit IPython with an EOF (Control-D
@@ -295,6 +300,8 b' class TerminalInteractiveShell(InteractiveShell):'
295 300 else:
296 301 if code:
297 302 self.run_cell(code, store_history=True)
303 if self.autoedit_syntax and self.SyntaxTB.last_syntax_error:
304 self.edit_syntax_error()
298 305
299 306 def mainloop(self):
300 307 # An extra layer of protection in case someone mashing Ctrl-C breaks
@@ -317,5 +324,67 b' class TerminalInteractiveShell(InteractiveShell):'
317 324 else:
318 325 self._inputhook = None
319 326
327 # Methods to support auto-editing of SyntaxErrors:
328
329 def edit_syntax_error(self):
330 """The bottom half of the syntax error handler called in the main loop.
331
332 Loop until syntax error is fixed or user cancels.
333 """
334
335 while self.SyntaxTB.last_syntax_error:
336 # copy and clear last_syntax_error
337 err = self.SyntaxTB.clear_err_state()
338 if not self._should_recompile(err):
339 return
340 try:
341 # may set last_syntax_error again if a SyntaxError is raised
342 self.safe_execfile(err.filename, self.user_ns)
343 except:
344 self.showtraceback()
345 else:
346 try:
347 f = open(err.filename)
348 try:
349 # This should be inside a display_trap block and I
350 # think it is.
351 sys.displayhook(f.read())
352 finally:
353 f.close()
354 except:
355 self.showtraceback()
356
357 def _should_recompile(self, e):
358 """Utility routine for edit_syntax_error"""
359
360 if e.filename in ('<ipython console>', '<input>', '<string>',
361 '<console>', '<BackgroundJob compilation>',
362 None):
363 return False
364 try:
365 if (self.autoedit_syntax and
366 not self.ask_yes_no(
367 'Return to editor to correct syntax error? '
368 '[Y/n] ', 'y')):
369 return False
370 except EOFError:
371 return False
372
373 def int0(x):
374 try:
375 return int(x)
376 except TypeError:
377 return 0
378
379 # always pass integer line and offset values to editor hook
380 try:
381 self.hooks.fix_error_editor(e.filename,
382 int0(e.lineno), int0(e.offset),
383 e.msg)
384 except TryNext:
385 warn('Could not open editor')
386 return False
387 return True
388
320 389 if __name__ == '__main__':
321 390 TerminalInteractiveShell.instance().interact()
General Comments 0
You need to be logged in to leave comments. Login now