##// END OF EJS Templates
Added support for automatically reopening the editor if the file had a...
fperez -
r54:2edbec55
parent child
Show More
@@ -1,7 +1,7
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3
3
4 $Id: Magic.py 958 2005-12-27 23:17:51Z fperez $"""
4 $Id: Magic.py 960 2005-12-28 06:51:01Z fperez $"""
5
5
6 #*****************************************************************************
6 #*****************************************************************************
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
@@ -1875,7 +1875,7 Currently the magic system has the following functions:\n"""
1875 else:
1875 else:
1876 print 'done. Executing edited code...'
1876 print 'done. Executing edited code...'
1877 try:
1877 try:
1878 execfile(filename,self.shell.user_ns)
1878 self.shell.safe_execfile(filename,self.shell.user_ns)
1879 except IOError,msg:
1879 except IOError,msg:
1880 if msg.filename == filename:
1880 if msg.filename == filename:
1881 warn('File not found. Did you forget to save?')
1881 warn('File not found. Did you forget to save?')
@@ -2,7 +2,7
2 """
2 """
3 Classes for handling input/output prompts.
3 Classes for handling input/output prompts.
4
4
5 $Id: Prompts.py 958 2005-12-27 23:17:51Z fperez $"""
5 $Id: Prompts.py 960 2005-12-28 06:51:01Z fperez $"""
6
6
7 #*****************************************************************************
7 #*****************************************************************************
8 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
@@ -494,7 +494,9 class CachedOutput:
494 if arg is not None:
494 if arg is not None:
495 cout_write = Term.cout.write # fast lookup
495 cout_write = Term.cout.write # fast lookup
496 # first handle the cache and counters
496 # first handle the cache and counters
497 self.update(arg)
497 # but avoid recursive reference when displaying _oh/Out
498 if arg is not self.user_ns['_oh']:
499 self.update(arg)
498 # do not print output if input ends in ';'
500 # do not print output if input ends in ';'
499 if self.input_hist[self.prompt_count].endswith(';\n'):
501 if self.input_hist[self.prompt_count].endswith(';\n'):
500 return
502 return
@@ -5,7 +5,7 General purpose utilities.
5 This is a grab-bag of stuff I find useful in most programs I write. Some of
5 This is a grab-bag of stuff I find useful in most programs I write. Some of
6 these things are also convenient when working at the command line.
6 these things are also convenient when working at the command line.
7
7
8 $Id: genutils.py 958 2005-12-27 23:17:51Z fperez $"""
8 $Id: genutils.py 960 2005-12-28 06:51:01Z fperez $"""
9
9
10 #*****************************************************************************
10 #*****************************************************************************
11 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
11 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
@@ -948,7 +948,7 def ask_yes_no(prompt,default=None):
948
948
949 Valid answers are: y/yes/n/no (match is not case sensitive)."""
949 Valid answers are: y/yes/n/no (match is not case sensitive)."""
950
950
951 answers = {'y':1,'n':0,'yes':1,'no':0}
951 answers = {'y':True,'n':False,'yes':True,'no':False}
952 ans = None
952 ans = None
953 eofs, max_eofs = 0, 20
953 eofs, max_eofs = 0, 20
954 while ans not in answers.keys():
954 while ans not in answers.keys():
@@ -32,7 +32,7 ip_set_hook('editor',myiphooks.calljed)
32 The ip_set_hook function is put by IPython into the builtin namespace, so it
32 The ip_set_hook function is put by IPython into the builtin namespace, so it
33 is always available from all running code.
33 is always available from all running code.
34
34
35 $Id: hooks.py 535 2005-03-02 08:42:25Z fperez $"""
35 $Id: hooks.py 960 2005-12-28 06:51:01Z fperez $"""
36
36
37 #*****************************************************************************
37 #*****************************************************************************
38 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
38 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
@@ -48,9 +48,9 __version__ = Release.version
48
48
49 import os
49 import os
50
50
51 # List here all the default hooks. For now it's just the editor, but over
51 # List here all the default hooks. For now it's just the editor functions
52 # time we'll move here all the public API for user-accessible things.
52 # but over time we'll move here all the public API for user-accessible things.
53 __all__ = ['editor']
53 __all__ = ['editor', 'fix_error_editor']
54
54
55 def editor(self,filename, linenum):
55 def editor(self,filename, linenum):
56 """Open the default editor at the given filename and linenumber.
56 """Open the default editor at the given filename and linenumber.
@@ -70,3 +70,26 def editor(self,filename, linenum):
70 linemark = '+%d' % linenum
70 linemark = '+%d' % linenum
71 # Call the actual editor
71 # Call the actual editor
72 os.system('%s %s %s' % (editor,linemark,filename))
72 os.system('%s %s %s' % (editor,linemark,filename))
73
74 import tempfile
75 def fix_error_editor(self,filename,linenum,column,msg):
76 """Open the editor at the given filename, linenumber, column and
77 show an error message. This is used for correcting syntax errors.
78 The current implementation only has special support for the VIM editor,
79 and falls back on the 'editor' hook if VIM is not used.
80
81 Call ip_set_hook('fix_error_editor',youfunc) to use your own function,
82 """
83 def vim_quickfix_file():
84 t = tempfile.NamedTemporaryFile()
85 t.write('%s:%d:%d:%s\n' % (filename,linenum,column,msg))
86 t.flush()
87 return t
88 if os.path.basename(self.rc.editor) != 'vim':
89 self.hooks.editor(filename,linenum)
90 return
91 t = vim_quickfix_file()
92 try:
93 os.system('vim --cmd "set errorformat=%f:%l:%c:%m" -q ' + t.name)
94 finally:
95 t.close()
@@ -6,7 +6,7 Requires Python 2.1 or newer.
6
6
7 This file contains all the classes and helper functions specific to IPython.
7 This file contains all the classes and helper functions specific to IPython.
8
8
9 $Id: iplib.py 959 2005-12-28 02:04:41Z fperez $
9 $Id: iplib.py 960 2005-12-28 06:51:01Z fperez $
10 """
10 """
11
11
12 #*****************************************************************************
12 #*****************************************************************************
@@ -212,6 +212,23 class InputList(list):
212 def __getslice__(self,i,j):
212 def __getslice__(self,i,j):
213 return ''.join(list.__getslice__(self,i,j))
213 return ''.join(list.__getslice__(self,i,j))
214
214
215 class SyntaxTB(ultraTB.ListTB):
216 """Extension which holds some state: the last exception value"""
217
218 def __init__(self,color_scheme = 'NoColor'):
219 ultraTB.ListTB.__init__(self,color_scheme)
220 self.last_syntax_error = None
221
222 def __call__(self, etype, value, elist):
223 self.last_syntax_error = value
224 ultraTB.ListTB.__call__(self,etype,value,elist)
225
226 def clear_err_state(self):
227 """Return the current error state and clear it"""
228 e = self.last_syntax_error
229 self.last_syntax_error = None
230 return e
231
215 #****************************************************************************
232 #****************************************************************************
216 # Main IPython class
233 # Main IPython class
217 class InteractiveShell(Logger, Magic):
234 class InteractiveShell(Logger, Magic):
@@ -544,10 +561,10 class InteractiveShell(Logger, Magic):
544
561
545 # TraceBack handlers:
562 # TraceBack handlers:
546 # Need two, one for syntax errors and one for other exceptions.
563 # Need two, one for syntax errors and one for other exceptions.
547 self.SyntaxTB = ultraTB.ListTB(color_scheme='NoColor')
564 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
548 # This one is initialized with an offset, meaning we always want to
565 # The interactive one is initialized with an offset, meaning we always
549 # remove the topmost item in the traceback, which is our own internal
566 # want to remove the topmost item in the traceback, which is our own
550 # code. Valid modes: ['Plain','Context','Verbose']
567 # internal code. Valid modes: ['Plain','Context','Verbose']
551 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
568 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
552 color_scheme='NoColor',
569 color_scheme='NoColor',
553 tb_offset = 1)
570 tb_offset = 1)
@@ -1022,6 +1039,44 want to merge them back into the new files.""" % locals()
1022 # Configure auto-indent for all platforms
1039 # Configure auto-indent for all platforms
1023 self.set_autoindent(self.rc.autoindent)
1040 self.set_autoindent(self.rc.autoindent)
1024
1041
1042 def _should_recompile(self,e):
1043 """Utility routine for edit_syntax_error"""
1044
1045 if e.filename in ('<ipython console>','<input>','<string>',
1046 '<console>'):
1047 return False
1048 try:
1049 if not ask_yes_no('Return to editor to correct syntax error? '
1050 '[Y/n] ','y'):
1051 return False
1052 except EOFError:
1053 return False
1054 self.hooks.fix_error_editor(e.filename,e.lineno,e.offset,e.msg)
1055 return True
1056
1057 def edit_syntax_error(self):
1058 """The bottom half of the syntax error handler called in the main loop.
1059
1060 Loop until syntax error is fixed or user cancels.
1061 """
1062
1063 while self.SyntaxTB.last_syntax_error:
1064 # copy and clear last_syntax_error
1065 err = self.SyntaxTB.clear_err_state()
1066 if not self._should_recompile(err):
1067 return
1068 try:
1069 # may set last_syntax_error again if a SyntaxError is raised
1070 self.safe_execfile(err.filename,self.shell.user_ns)
1071 except:
1072 self.showtraceback()
1073 else:
1074 f = file(err.filename)
1075 try:
1076 sys.displayhook(f.read())
1077 finally:
1078 f.close()
1079
1025 def showsyntaxerror(self, filename=None):
1080 def showsyntaxerror(self, filename=None):
1026 """Display the syntax error that just occurred.
1081 """Display the syntax error that just occurred.
1027
1082
@@ -1221,10 +1276,15 want to merge them back into the new files.""" % locals()
1221 self.indent_current_nsp -= 4
1276 self.indent_current_nsp -= 4
1222 else:
1277 else:
1223 self.indent_current_nsp = 0
1278 self.indent_current_nsp = 0
1279
1224 # indent_current is the actual string to be inserted
1280 # indent_current is the actual string to be inserted
1225 # by the readline hooks for indentation
1281 # by the readline hooks for indentation
1226 self.indent_current = ' '* self.indent_current_nsp
1282 self.indent_current = ' '* self.indent_current_nsp
1227
1283
1284 if (self.SyntaxTB.last_syntax_error and
1285 self.rc.autoedit_syntax):
1286 self.edit_syntax_error()
1287
1228 except KeyboardInterrupt:
1288 except KeyboardInterrupt:
1229 self.write("\nKeyboardInterrupt\n")
1289 self.write("\nKeyboardInterrupt\n")
1230 self.resetbuffer()
1290 self.resetbuffer()
@@ -6,7 +6,7 Requires Python 2.1 or better.
6
6
7 This file contains the main make_IPython() starter function.
7 This file contains the main make_IPython() starter function.
8
8
9 $Id: ipmaker.py 958 2005-12-27 23:17:51Z fperez $"""
9 $Id: ipmaker.py 960 2005-12-28 06:51:01Z fperez $"""
10
10
11 #*****************************************************************************
11 #*****************************************************************************
12 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
12 # Copyright (C) 2001-2004 Fernando Perez. <fperez@colorado.edu>
@@ -161,7 +161,8 object? -> Details about 'object'. ?object also works, ?? prints more.
161 'rcfile=s separate_in|si=s separate_out|so=s '
161 'rcfile=s separate_in|si=s separate_out|so=s '
162 'separate_out2|so2=s xmode=s wildcards_case_sensitive! '
162 'separate_out2|so2=s xmode=s wildcards_case_sensitive! '
163 'magic_docstrings system_verbose! '
163 'magic_docstrings system_verbose! '
164 'multi_line_specials!')
164 'multi_line_specials! '
165 'autoedit_syntax!')
165
166
166 # Options that can *only* appear at the cmd line (not in rcfiles).
167 # Options that can *only* appear at the cmd line (not in rcfiles).
167
168
@@ -224,6 +225,7 object? -> Details about 'object'. ?object also works, ?? prints more.
224 xmode = 'Verbose',
225 xmode = 'Verbose',
225 wildcards_case_sensitive = 1,
226 wildcards_case_sensitive = 1,
226 magic_docstrings = 0, # undocumented, for doc generation
227 magic_docstrings = 0, # undocumented, for doc generation
228 autoedit_syntax = 0,
227 )
229 )
228
230
229 # Things that will *only* appear in rcfiles (not at the command line).
231 # Things that will *only* appear in rcfiles (not at the command line).
@@ -6,7 +6,7
6 # the file COPYING, distributed as part of this software.
6 # the file COPYING, distributed as part of this software.
7 #*****************************************************************************
7 #*****************************************************************************
8
8
9 # $Id: usage.py 926 2005-12-01 18:14:21Z fperez $
9 # $Id: usage.py 960 2005-12-28 06:51:01Z fperez $
10
10
11 from IPython import Release
11 from IPython import Release
12 __author__ = '%s <%s>' % Release.authors['Fernando']
12 __author__ = '%s <%s>' % Release.authors['Fernando']
@@ -154,13 +154,12 REGULAR OPTIONS
154
154
155 -[no]automagic
155 -[no]automagic
156 Make magic commands automatic (without needing their first char-
156 Make magic commands automatic (without needing their first char-
157 acter to be @). Type @magic at the IPython prompt for more
157 acter to be %). Type %magic at the IPython prompt for more
158 information.
158 information.
159
159
160 -[no]autoparens
160 -[no]autoedit_syntax
161 Make IPython automatically call any callable object even if you
161 When a syntax error occurs after editing a file, automatically
162 didn’t type explicit parentheses. For example, ’str 43’ becomes
162 open the file to the trouble causing line for convenient fixing.
163 ’str(43)’ automatically.
164
163
165 -[no]banner
164 -[no]banner
166 Print the intial information banner (default on).
165 Print the intial information banner (default on).
@@ -4,6 +4,11
4 input with emtpy lines. This fixes
4 input with emtpy lines. This fixes
5 http://www.scipy.net/roundup/ipython/issue43 and a similar
5 http://www.scipy.net/roundup/ipython/issue43 and a similar
6 discussion on the user list.
6 discussion on the user list.
7 (edit_syntax_error): added support for automatically reopening the
8 editor if the file had a syntax error in it. Thanks to scottt who
9 provided the patch at:
10 http://www.scipy.net/roundup/ipython/issue36 (slightly modified
11 version committed).
7
12
8 WARNING: a behavior change is necessarily introduced to support
13 WARNING: a behavior change is necessarily introduced to support
9 blank lines: now a single blank line with whitespace does NOT
14 blank lines: now a single blank line with whitespace does NOT
@@ -124,12 +124,11 Turn automatic indentation on/off.
124 .TP
124 .TP
125 .B \-[no]automagic
125 .B \-[no]automagic
126 Make magic commands automatic (without needing their first character
126 Make magic commands automatic (without needing their first character
127 to be @). Type @magic at the IPython prompt for more information.
127 to be %). Type %magic at the IPython prompt for more information.
128 .TP
128 .TP
129 .B \-[no]autoparens
129 .B \-[no]autoedit_syntax
130 Make IPython automatically call any callable object even if you didn't
130 When a syntax error occurs after editing a file, automatically open the file
131 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
131 to the trouble causing line for convenient fixing.
132 automatically.
133 .TP
132 .TP
134 .B \-[no]banner
133 .B \-[no]banner
135 Print the intial information banner (default on).
134 Print the intial information banner (default on).
@@ -2707,6 +2707,28 show()
2707
2707
2708 \family typewriter
2708 \family typewriter
2709 \series bold
2709 \series bold
2710 -[no]autocall:
2711 \family default
2712 \series default
2713 Make IPython automatically call any callable object even if you didn't
2714 type explicit parentheses.
2715 For example, `str 43' becomes `str(43)' automatically.
2716 \layout List
2717 \labelwidthstring 00.00.0000
2718
2719
2720 \family typewriter
2721 \series bold
2722 -[no]autoindent:
2723 \family default
2724 \series default
2725 Turn automatic indentation on/off.
2726 \layout List
2727 \labelwidthstring 00.00.0000
2728
2729
2730 \family typewriter
2731 \series bold
2710 -[no]automagic
2732 -[no]automagic
2711 \series default
2733 \series default
2712 :
2734 :
@@ -2728,6 +2750,18 show()
2728
2750
2729 \family typewriter
2751 \family typewriter
2730 \series bold
2752 \series bold
2753 -[no]autoedit_syntax:
2754 \family default
2755 \series default
2756 When a syntax error occurs after editing a file, automatically open the
2757 file to the trouble causing line for convenient fixing.
2758
2759 \layout List
2760 \labelwidthstring 00.00.0000
2761
2762
2763 \family typewriter
2764 \series bold
2731 -[no]banner
2765 -[no]banner
2732 \series default
2766 \series default
2733 :
2767 :
@@ -9121,4 +9155,14 Smedt
9121 \family default
9155 \family default
9122 Debugger enhancements, so that when pdb is activated from within IPython,
9156 Debugger enhancements, so that when pdb is activated from within IPython,
9123 coloring, tab completion and other features continue to work seamlessly.
9157 coloring, tab completion and other features continue to work seamlessly.
9158 \layout List
9159 \labelwidthstring 00.00.0000
9160
9161 Scott (email unknown) Support for automatic editor invocation on syntax
9162 errors (see
9163 \begin_inset LatexCommand \htmlurl{http://www.scipy.net/roundup/ipython/issue36}
9164
9165 \end_inset
9166
9167 ).
9124 \the_end
9168 \the_end
General Comments 0
You need to be logged in to leave comments. Login now