##// END OF EJS Templates
change default extension to .ipy for %save -r
Matthias BUSSONNIER -
Show More
@@ -1,507 +1,512 b''
1 """Implementation of code management magic functions.
1 """Implementation of code management magic functions.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (c) 2012 The IPython Development Team.
4 # Copyright (c) 2012 The IPython Development Team.
5 #
5 #
6 # Distributed under the terms of the Modified BSD License.
6 # Distributed under the terms of the Modified BSD License.
7 #
7 #
8 # The full license is in the file COPYING.txt, distributed with this software.
8 # The full license is in the file COPYING.txt, distributed with this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 # Stdlib
15 # Stdlib
16 import inspect
16 import inspect
17 import io
17 import io
18 import json
18 import json
19 import os
19 import os
20 import sys
20 import sys
21 from urllib2 import urlopen
21 from urllib2 import urlopen
22
22
23 # Our own packages
23 # Our own packages
24 from IPython.core.error import TryNext
24 from IPython.core.error import TryNext
25 from IPython.core.macro import Macro
25 from IPython.core.macro import Macro
26 from IPython.core.magic import Magics, magics_class, line_magic
26 from IPython.core.magic import Magics, magics_class, line_magic
27 from IPython.testing.skipdoctest import skip_doctest
27 from IPython.testing.skipdoctest import skip_doctest
28 from IPython.utils import openpy
28 from IPython.utils import openpy
29 from IPython.utils import py3compat
29 from IPython.utils import py3compat
30 from IPython.utils.io import file_read
30 from IPython.utils.io import file_read
31 from IPython.utils.path import get_py_filename, unquote_filename
31 from IPython.utils.path import get_py_filename, unquote_filename
32 from IPython.utils.warn import warn
32 from IPython.utils.warn import warn
33
33
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35 # Magic implementation classes
35 # Magic implementation classes
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37
37
38 # Used for exception handling in magic_edit
38 # Used for exception handling in magic_edit
39 class MacroToEdit(ValueError): pass
39 class MacroToEdit(ValueError): pass
40
40
41
41
42 @magics_class
42 @magics_class
43 class CodeMagics(Magics):
43 class CodeMagics(Magics):
44 """Magics related to code management (loading, saving, editing, ...)."""
44 """Magics related to code management (loading, saving, editing, ...)."""
45
45
46 @line_magic
46 @line_magic
47 def save(self, parameter_s=''):
47 def save(self, parameter_s=''):
48 """Save a set of lines or a macro to a given filename.
48 """Save a set of lines or a macro to a given filename.
49
49
50 Usage:\\
50 Usage:\\
51 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
51 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
52
52
53 Options:
53 Options:
54
54
55 -r: use 'raw' input. By default, the 'processed' history is used,
55 -r: use 'raw' input. By default, the 'processed' history is used,
56 so that magics are loaded in their transformed version to valid
56 so that magics are loaded in their transformed version to valid
57 Python. If this option is given, the raw input as typed as the
57 Python. If this option is given, the raw input as typed as the
58 command line is used instead.
58 command line is used instead.
59
59
60 This function uses the same syntax as %history for input ranges,
60 This function uses the same syntax as %history for input ranges,
61 then saves the lines to the filename you specify.
61 then saves the lines to the filename you specify.
62
62
63 It adds a '.py' extension to the file if you don't do so yourself, and
63 It adds a '.py' extension to the file if you don't do so yourself, and
64 it asks for confirmation before overwriting existing files."""
64 it asks for confirmation before overwriting existing files.
65
66 If `-r` option is used, the default extension is `.ipy`.
67 """
65
68
66 opts,args = self.parse_options(parameter_s,'r',mode='list')
69 opts,args = self.parse_options(parameter_s,'r',mode='list')
70 raw = 'r' in opts
71 ext = u'.ipy' if raw else u'.py'
67 fname, codefrom = unquote_filename(args[0]), " ".join(args[1:])
72 fname, codefrom = unquote_filename(args[0]), " ".join(args[1:])
68 if not fname.endswith('.py'):
73 if not (fname.endswith(u'.py') or fname.endswith(u'.ipy')):
69 fname += '.py'
74 fname += ext
70 if os.path.isfile(fname):
75 if os.path.isfile(fname):
71 overwrite = self.shell.ask_yes_no('File `%s` exists. Overwrite (y/[N])? ' % fname, default='n')
76 overwrite = self.shell.ask_yes_no('File `%s` exists. Overwrite (y/[N])? ' % fname, default='n')
72 if not overwrite :
77 if not overwrite :
73 print 'Operation cancelled.'
78 print 'Operation cancelled.'
74 return
79 return
75 try:
80 try:
76 cmds = self.shell.find_user_code(codefrom, 'r' in opts)
81 cmds = self.shell.find_user_code(codefrom,raw)
77 except (TypeError, ValueError) as e:
82 except (TypeError, ValueError) as e:
78 print e.args[0]
83 print e.args[0]
79 return
84 return
80 with io.open(fname,'w', encoding="utf-8") as f:
85 with io.open(fname,'w', encoding="utf-8") as f:
81 f.write(u"# coding: utf-8\n")
86 f.write(u"# coding: utf-8\n")
82 f.write(py3compat.cast_unicode(cmds))
87 f.write(py3compat.cast_unicode(cmds))
83 print 'The following commands were written to file `%s`:' % fname
88 print 'The following commands were written to file `%s`:' % fname
84 print cmds
89 print cmds
85
90
86 @line_magic
91 @line_magic
87 def pastebin(self, parameter_s=''):
92 def pastebin(self, parameter_s=''):
88 """Upload code to Github's Gist paste bin, returning the URL.
93 """Upload code to Github's Gist paste bin, returning the URL.
89
94
90 Usage:\\
95 Usage:\\
91 %pastebin [-d "Custom description"] 1-7
96 %pastebin [-d "Custom description"] 1-7
92
97
93 The argument can be an input history range, a filename, or the name of a
98 The argument can be an input history range, a filename, or the name of a
94 string or macro.
99 string or macro.
95
100
96 Options:
101 Options:
97
102
98 -d: Pass a custom description for the gist. The default will say
103 -d: Pass a custom description for the gist. The default will say
99 "Pasted from IPython".
104 "Pasted from IPython".
100 """
105 """
101 opts, args = self.parse_options(parameter_s, 'd:')
106 opts, args = self.parse_options(parameter_s, 'd:')
102
107
103 try:
108 try:
104 code = self.shell.find_user_code(args)
109 code = self.shell.find_user_code(args)
105 except (ValueError, TypeError) as e:
110 except (ValueError, TypeError) as e:
106 print e.args[0]
111 print e.args[0]
107 return
112 return
108
113
109 post_data = json.dumps({
114 post_data = json.dumps({
110 "description": opts.get('d', "Pasted from IPython"),
115 "description": opts.get('d', "Pasted from IPython"),
111 "public": True,
116 "public": True,
112 "files": {
117 "files": {
113 "file1.py": {
118 "file1.py": {
114 "content": code
119 "content": code
115 }
120 }
116 }
121 }
117 }).encode('utf-8')
122 }).encode('utf-8')
118
123
119 response = urlopen("https://api.github.com/gists", post_data)
124 response = urlopen("https://api.github.com/gists", post_data)
120 response_data = json.loads(response.read().decode('utf-8'))
125 response_data = json.loads(response.read().decode('utf-8'))
121 return response_data['html_url']
126 return response_data['html_url']
122
127
123 @line_magic
128 @line_magic
124 def loadpy(self, arg_s):
129 def loadpy(self, arg_s):
125 """Alias of `%load`
130 """Alias of `%load`
126
131
127 `%loadpy` has gained some flexibility and droped the requirement of a `.py`
132 `%loadpy` has gained some flexibility and droped the requirement of a `.py`
128 extension. So it has been renamed simply into %load. You can look at
133 extension. So it has been renamed simply into %load. You can look at
129 `%load`'s docstring for more info.
134 `%load`'s docstring for more info.
130 """
135 """
131 self.magic_load(arg_s)
136 self.magic_load(arg_s)
132
137
133 @line_magic
138 @line_magic
134 def load(self, arg_s):
139 def load(self, arg_s):
135 """Load code into the current frontend.
140 """Load code into the current frontend.
136
141
137 Usage:\\
142 Usage:\\
138 %load [options] source
143 %load [options] source
139
144
140 where source can be a filename, URL, input history range or macro
145 where source can be a filename, URL, input history range or macro
141
146
142 Options:
147 Options:
143 --------
148 --------
144 -y : Don't ask confirmation for loading source above 200 000 characters.
149 -y : Don't ask confirmation for loading source above 200 000 characters.
145
150
146 This magic command can either take a local filename, a URL, an history
151 This magic command can either take a local filename, a URL, an history
147 range (see %history) or a macro as argument, it will prompt for
152 range (see %history) or a macro as argument, it will prompt for
148 confirmation before loading source with more than 200 000 characters, unless
153 confirmation before loading source with more than 200 000 characters, unless
149 -y flag is passed or if the frontend does not support raw_input::
154 -y flag is passed or if the frontend does not support raw_input::
150
155
151 %load myscript.py
156 %load myscript.py
152 %load 7-27
157 %load 7-27
153 %load myMacro
158 %load myMacro
154 %load http://www.example.com/myscript.py
159 %load http://www.example.com/myscript.py
155 """
160 """
156 opts,args = self.parse_options(arg_s,'y')
161 opts,args = self.parse_options(arg_s,'y')
157
162
158 contents = self.shell.find_user_code(args)
163 contents = self.shell.find_user_code(args)
159 l = len(contents)
164 l = len(contents)
160
165
161 # 200 000 is ~ 2500 full 80 caracter lines
166 # 200 000 is ~ 2500 full 80 caracter lines
162 # so in average, more than 5000 lines
167 # so in average, more than 5000 lines
163 if l > 200000 and 'y' not in opts:
168 if l > 200000 and 'y' not in opts:
164 try:
169 try:
165 ans = self.shell.ask_yes_no(("The text you're trying to load seems pretty big"\
170 ans = self.shell.ask_yes_no(("The text you're trying to load seems pretty big"\
166 " (%d characters). Continue (y/[N]) ?" % l), default='n' )
171 " (%d characters). Continue (y/[N]) ?" % l), default='n' )
167 except StdinNotImplementedError:
172 except StdinNotImplementedError:
168 #asume yes if raw input not implemented
173 #asume yes if raw input not implemented
169 ans = True
174 ans = True
170
175
171 if ans is False :
176 if ans is False :
172 print 'Operation cancelled.'
177 print 'Operation cancelled.'
173 return
178 return
174
179
175 self.shell.set_next_input(contents)
180 self.shell.set_next_input(contents)
176
181
177 @staticmethod
182 @staticmethod
178 def _find_edit_target(shell, args, opts, last_call):
183 def _find_edit_target(shell, args, opts, last_call):
179 """Utility method used by magic_edit to find what to edit."""
184 """Utility method used by magic_edit to find what to edit."""
180
185
181 def make_filename(arg):
186 def make_filename(arg):
182 "Make a filename from the given args"
187 "Make a filename from the given args"
183 arg = unquote_filename(arg)
188 arg = unquote_filename(arg)
184 try:
189 try:
185 filename = get_py_filename(arg)
190 filename = get_py_filename(arg)
186 except IOError:
191 except IOError:
187 # If it ends with .py but doesn't already exist, assume we want
192 # If it ends with .py but doesn't already exist, assume we want
188 # a new file.
193 # a new file.
189 if arg.endswith('.py'):
194 if arg.endswith('.py'):
190 filename = arg
195 filename = arg
191 else:
196 else:
192 filename = None
197 filename = None
193 return filename
198 return filename
194
199
195 # Set a few locals from the options for convenience:
200 # Set a few locals from the options for convenience:
196 opts_prev = 'p' in opts
201 opts_prev = 'p' in opts
197 opts_raw = 'r' in opts
202 opts_raw = 'r' in opts
198
203
199 # custom exceptions
204 # custom exceptions
200 class DataIsObject(Exception): pass
205 class DataIsObject(Exception): pass
201
206
202 # Default line number value
207 # Default line number value
203 lineno = opts.get('n',None)
208 lineno = opts.get('n',None)
204
209
205 if opts_prev:
210 if opts_prev:
206 args = '_%s' % last_call[0]
211 args = '_%s' % last_call[0]
207 if not shell.user_ns.has_key(args):
212 if not shell.user_ns.has_key(args):
208 args = last_call[1]
213 args = last_call[1]
209
214
210 # use last_call to remember the state of the previous call, but don't
215 # use last_call to remember the state of the previous call, but don't
211 # let it be clobbered by successive '-p' calls.
216 # let it be clobbered by successive '-p' calls.
212 try:
217 try:
213 last_call[0] = shell.displayhook.prompt_count
218 last_call[0] = shell.displayhook.prompt_count
214 if not opts_prev:
219 if not opts_prev:
215 last_call[1] = args
220 last_call[1] = args
216 except:
221 except:
217 pass
222 pass
218
223
219 # by default this is done with temp files, except when the given
224 # by default this is done with temp files, except when the given
220 # arg is a filename
225 # arg is a filename
221 use_temp = True
226 use_temp = True
222
227
223 data = ''
228 data = ''
224
229
225 # First, see if the arguments should be a filename.
230 # First, see if the arguments should be a filename.
226 filename = make_filename(args)
231 filename = make_filename(args)
227 if filename:
232 if filename:
228 use_temp = False
233 use_temp = False
229 elif args:
234 elif args:
230 # Mode where user specifies ranges of lines, like in %macro.
235 # Mode where user specifies ranges of lines, like in %macro.
231 data = shell.extract_input_lines(args, opts_raw)
236 data = shell.extract_input_lines(args, opts_raw)
232 if not data:
237 if not data:
233 try:
238 try:
234 # Load the parameter given as a variable. If not a string,
239 # Load the parameter given as a variable. If not a string,
235 # process it as an object instead (below)
240 # process it as an object instead (below)
236
241
237 #print '*** args',args,'type',type(args) # dbg
242 #print '*** args',args,'type',type(args) # dbg
238 data = eval(args, shell.user_ns)
243 data = eval(args, shell.user_ns)
239 if not isinstance(data, basestring):
244 if not isinstance(data, basestring):
240 raise DataIsObject
245 raise DataIsObject
241
246
242 except (NameError,SyntaxError):
247 except (NameError,SyntaxError):
243 # given argument is not a variable, try as a filename
248 # given argument is not a variable, try as a filename
244 filename = make_filename(args)
249 filename = make_filename(args)
245 if filename is None:
250 if filename is None:
246 warn("Argument given (%s) can't be found as a variable "
251 warn("Argument given (%s) can't be found as a variable "
247 "or as a filename." % args)
252 "or as a filename." % args)
248 return
253 return
249 use_temp = False
254 use_temp = False
250
255
251 except DataIsObject:
256 except DataIsObject:
252 # macros have a special edit function
257 # macros have a special edit function
253 if isinstance(data, Macro):
258 if isinstance(data, Macro):
254 raise MacroToEdit(data)
259 raise MacroToEdit(data)
255
260
256 # For objects, try to edit the file where they are defined
261 # For objects, try to edit the file where they are defined
257 try:
262 try:
258 filename = inspect.getabsfile(data)
263 filename = inspect.getabsfile(data)
259 if 'fakemodule' in filename.lower() and \
264 if 'fakemodule' in filename.lower() and \
260 inspect.isclass(data):
265 inspect.isclass(data):
261 # class created by %edit? Try to find source
266 # class created by %edit? Try to find source
262 # by looking for method definitions instead, the
267 # by looking for method definitions instead, the
263 # __module__ in those classes is FakeModule.
268 # __module__ in those classes is FakeModule.
264 attrs = [getattr(data, aname) for aname in dir(data)]
269 attrs = [getattr(data, aname) for aname in dir(data)]
265 for attr in attrs:
270 for attr in attrs:
266 if not inspect.ismethod(attr):
271 if not inspect.ismethod(attr):
267 continue
272 continue
268 filename = inspect.getabsfile(attr)
273 filename = inspect.getabsfile(attr)
269 if filename and \
274 if filename and \
270 'fakemodule' not in filename.lower():
275 'fakemodule' not in filename.lower():
271 # change the attribute to be the edit
276 # change the attribute to be the edit
272 # target instead
277 # target instead
273 data = attr
278 data = attr
274 break
279 break
275
280
276 datafile = 1
281 datafile = 1
277 except TypeError:
282 except TypeError:
278 filename = make_filename(args)
283 filename = make_filename(args)
279 datafile = 1
284 datafile = 1
280 warn('Could not find file where `%s` is defined.\n'
285 warn('Could not find file where `%s` is defined.\n'
281 'Opening a file named `%s`' % (args, filename))
286 'Opening a file named `%s`' % (args, filename))
282 # Now, make sure we can actually read the source (if it was
287 # Now, make sure we can actually read the source (if it was
283 # in a temp file it's gone by now).
288 # in a temp file it's gone by now).
284 if datafile:
289 if datafile:
285 try:
290 try:
286 if lineno is None:
291 if lineno is None:
287 lineno = inspect.getsourcelines(data)[1]
292 lineno = inspect.getsourcelines(data)[1]
288 except IOError:
293 except IOError:
289 filename = make_filename(args)
294 filename = make_filename(args)
290 if filename is None:
295 if filename is None:
291 warn('The file `%s` where `%s` was defined '
296 warn('The file `%s` where `%s` was defined '
292 'cannot be read.' % (filename, data))
297 'cannot be read.' % (filename, data))
293 return
298 return
294 use_temp = False
299 use_temp = False
295
300
296 if use_temp:
301 if use_temp:
297 filename = shell.mktempfile(data)
302 filename = shell.mktempfile(data)
298 print 'IPython will make a temporary file named:',filename
303 print 'IPython will make a temporary file named:',filename
299
304
300 return filename, lineno, use_temp
305 return filename, lineno, use_temp
301
306
302 def _edit_macro(self,mname,macro):
307 def _edit_macro(self,mname,macro):
303 """open an editor with the macro data in a file"""
308 """open an editor with the macro data in a file"""
304 filename = self.shell.mktempfile(macro.value)
309 filename = self.shell.mktempfile(macro.value)
305 self.shell.hooks.editor(filename)
310 self.shell.hooks.editor(filename)
306
311
307 # and make a new macro object, to replace the old one
312 # and make a new macro object, to replace the old one
308 mfile = open(filename)
313 mfile = open(filename)
309 mvalue = mfile.read()
314 mvalue = mfile.read()
310 mfile.close()
315 mfile.close()
311 self.shell.user_ns[mname] = Macro(mvalue)
316 self.shell.user_ns[mname] = Macro(mvalue)
312
317
313 @line_magic
318 @line_magic
314 def ed(self, parameter_s=''):
319 def ed(self, parameter_s=''):
315 """Alias to %edit."""
320 """Alias to %edit."""
316 return self.edit(parameter_s)
321 return self.edit(parameter_s)
317
322
318 @skip_doctest
323 @skip_doctest
319 @line_magic
324 @line_magic
320 def edit(self, parameter_s='',last_call=['','']):
325 def edit(self, parameter_s='',last_call=['','']):
321 """Bring up an editor and execute the resulting code.
326 """Bring up an editor and execute the resulting code.
322
327
323 Usage:
328 Usage:
324 %edit [options] [args]
329 %edit [options] [args]
325
330
326 %edit runs IPython's editor hook. The default version of this hook is
331 %edit runs IPython's editor hook. The default version of this hook is
327 set to call the editor specified by your $EDITOR environment variable.
332 set to call the editor specified by your $EDITOR environment variable.
328 If this isn't found, it will default to vi under Linux/Unix and to
333 If this isn't found, it will default to vi under Linux/Unix and to
329 notepad under Windows. See the end of this docstring for how to change
334 notepad under Windows. See the end of this docstring for how to change
330 the editor hook.
335 the editor hook.
331
336
332 You can also set the value of this editor via the
337 You can also set the value of this editor via the
333 ``TerminalInteractiveShell.editor`` option in your configuration file.
338 ``TerminalInteractiveShell.editor`` option in your configuration file.
334 This is useful if you wish to use a different editor from your typical
339 This is useful if you wish to use a different editor from your typical
335 default with IPython (and for Windows users who typically don't set
340 default with IPython (and for Windows users who typically don't set
336 environment variables).
341 environment variables).
337
342
338 This command allows you to conveniently edit multi-line code right in
343 This command allows you to conveniently edit multi-line code right in
339 your IPython session.
344 your IPython session.
340
345
341 If called without arguments, %edit opens up an empty editor with a
346 If called without arguments, %edit opens up an empty editor with a
342 temporary file and will execute the contents of this file when you
347 temporary file and will execute the contents of this file when you
343 close it (don't forget to save it!).
348 close it (don't forget to save it!).
344
349
345
350
346 Options:
351 Options:
347
352
348 -n <number>: open the editor at a specified line number. By default,
353 -n <number>: open the editor at a specified line number. By default,
349 the IPython editor hook uses the unix syntax 'editor +N filename', but
354 the IPython editor hook uses the unix syntax 'editor +N filename', but
350 you can configure this by providing your own modified hook if your
355 you can configure this by providing your own modified hook if your
351 favorite editor supports line-number specifications with a different
356 favorite editor supports line-number specifications with a different
352 syntax.
357 syntax.
353
358
354 -p: this will call the editor with the same data as the previous time
359 -p: this will call the editor with the same data as the previous time
355 it was used, regardless of how long ago (in your current session) it
360 it was used, regardless of how long ago (in your current session) it
356 was.
361 was.
357
362
358 -r: use 'raw' input. This option only applies to input taken from the
363 -r: use 'raw' input. This option only applies to input taken from the
359 user's history. By default, the 'processed' history is used, so that
364 user's history. By default, the 'processed' history is used, so that
360 magics are loaded in their transformed version to valid Python. If
365 magics are loaded in their transformed version to valid Python. If
361 this option is given, the raw input as typed as the command line is
366 this option is given, the raw input as typed as the command line is
362 used instead. When you exit the editor, it will be executed by
367 used instead. When you exit the editor, it will be executed by
363 IPython's own processor.
368 IPython's own processor.
364
369
365 -x: do not execute the edited code immediately upon exit. This is
370 -x: do not execute the edited code immediately upon exit. This is
366 mainly useful if you are editing programs which need to be called with
371 mainly useful if you are editing programs which need to be called with
367 command line arguments, which you can then do using %run.
372 command line arguments, which you can then do using %run.
368
373
369
374
370 Arguments:
375 Arguments:
371
376
372 If arguments are given, the following possibilities exist:
377 If arguments are given, the following possibilities exist:
373
378
374 - If the argument is a filename, IPython will load that into the
379 - If the argument is a filename, IPython will load that into the
375 editor. It will execute its contents with execfile() when you exit,
380 editor. It will execute its contents with execfile() when you exit,
376 loading any code in the file into your interactive namespace.
381 loading any code in the file into your interactive namespace.
377
382
378 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
383 - The arguments are ranges of input history, e.g. "7 ~1/4-6".
379 The syntax is the same as in the %history magic.
384 The syntax is the same as in the %history magic.
380
385
381 - If the argument is a string variable, its contents are loaded
386 - If the argument is a string variable, its contents are loaded
382 into the editor. You can thus edit any string which contains
387 into the editor. You can thus edit any string which contains
383 python code (including the result of previous edits).
388 python code (including the result of previous edits).
384
389
385 - If the argument is the name of an object (other than a string),
390 - If the argument is the name of an object (other than a string),
386 IPython will try to locate the file where it was defined and open the
391 IPython will try to locate the file where it was defined and open the
387 editor at the point where it is defined. You can use `%edit function`
392 editor at the point where it is defined. You can use `%edit function`
388 to load an editor exactly at the point where 'function' is defined,
393 to load an editor exactly at the point where 'function' is defined,
389 edit it and have the file be executed automatically.
394 edit it and have the file be executed automatically.
390
395
391 - If the object is a macro (see %macro for details), this opens up your
396 - If the object is a macro (see %macro for details), this opens up your
392 specified editor with a temporary file containing the macro's data.
397 specified editor with a temporary file containing the macro's data.
393 Upon exit, the macro is reloaded with the contents of the file.
398 Upon exit, the macro is reloaded with the contents of the file.
394
399
395 Note: opening at an exact line is only supported under Unix, and some
400 Note: opening at an exact line is only supported under Unix, and some
396 editors (like kedit and gedit up to Gnome 2.8) do not understand the
401 editors (like kedit and gedit up to Gnome 2.8) do not understand the
397 '+NUMBER' parameter necessary for this feature. Good editors like
402 '+NUMBER' parameter necessary for this feature. Good editors like
398 (X)Emacs, vi, jed, pico and joe all do.
403 (X)Emacs, vi, jed, pico and joe all do.
399
404
400 After executing your code, %edit will return as output the code you
405 After executing your code, %edit will return as output the code you
401 typed in the editor (except when it was an existing file). This way
406 typed in the editor (except when it was an existing file). This way
402 you can reload the code in further invocations of %edit as a variable,
407 you can reload the code in further invocations of %edit as a variable,
403 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
408 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
404 the output.
409 the output.
405
410
406 Note that %edit is also available through the alias %ed.
411 Note that %edit is also available through the alias %ed.
407
412
408 This is an example of creating a simple function inside the editor and
413 This is an example of creating a simple function inside the editor and
409 then modifying it. First, start up the editor::
414 then modifying it. First, start up the editor::
410
415
411 In [1]: ed
416 In [1]: ed
412 Editing... done. Executing edited code...
417 Editing... done. Executing edited code...
413 Out[1]: 'def foo():\\n print "foo() was defined in an editing
418 Out[1]: 'def foo():\\n print "foo() was defined in an editing
414 session"\\n'
419 session"\\n'
415
420
416 We can then call the function foo()::
421 We can then call the function foo()::
417
422
418 In [2]: foo()
423 In [2]: foo()
419 foo() was defined in an editing session
424 foo() was defined in an editing session
420
425
421 Now we edit foo. IPython automatically loads the editor with the
426 Now we edit foo. IPython automatically loads the editor with the
422 (temporary) file where foo() was previously defined::
427 (temporary) file where foo() was previously defined::
423
428
424 In [3]: ed foo
429 In [3]: ed foo
425 Editing... done. Executing edited code...
430 Editing... done. Executing edited code...
426
431
427 And if we call foo() again we get the modified version::
432 And if we call foo() again we get the modified version::
428
433
429 In [4]: foo()
434 In [4]: foo()
430 foo() has now been changed!
435 foo() has now been changed!
431
436
432 Here is an example of how to edit a code snippet successive
437 Here is an example of how to edit a code snippet successive
433 times. First we call the editor::
438 times. First we call the editor::
434
439
435 In [5]: ed
440 In [5]: ed
436 Editing... done. Executing edited code...
441 Editing... done. Executing edited code...
437 hello
442 hello
438 Out[5]: "print 'hello'\\n"
443 Out[5]: "print 'hello'\\n"
439
444
440 Now we call it again with the previous output (stored in _)::
445 Now we call it again with the previous output (stored in _)::
441
446
442 In [6]: ed _
447 In [6]: ed _
443 Editing... done. Executing edited code...
448 Editing... done. Executing edited code...
444 hello world
449 hello world
445 Out[6]: "print 'hello world'\\n"
450 Out[6]: "print 'hello world'\\n"
446
451
447 Now we call it with the output #8 (stored in _8, also as Out[8])::
452 Now we call it with the output #8 (stored in _8, also as Out[8])::
448
453
449 In [7]: ed _8
454 In [7]: ed _8
450 Editing... done. Executing edited code...
455 Editing... done. Executing edited code...
451 hello again
456 hello again
452 Out[7]: "print 'hello again'\\n"
457 Out[7]: "print 'hello again'\\n"
453
458
454
459
455 Changing the default editor hook:
460 Changing the default editor hook:
456
461
457 If you wish to write your own editor hook, you can put it in a
462 If you wish to write your own editor hook, you can put it in a
458 configuration file which you load at startup time. The default hook
463 configuration file which you load at startup time. The default hook
459 is defined in the IPython.core.hooks module, and you can use that as a
464 is defined in the IPython.core.hooks module, and you can use that as a
460 starting example for further modifications. That file also has
465 starting example for further modifications. That file also has
461 general instructions on how to set a new hook for use once you've
466 general instructions on how to set a new hook for use once you've
462 defined it."""
467 defined it."""
463 opts,args = self.parse_options(parameter_s,'prxn:')
468 opts,args = self.parse_options(parameter_s,'prxn:')
464
469
465 try:
470 try:
466 filename, lineno, is_temp = self._find_edit_target(args, opts, last_call)
471 filename, lineno, is_temp = self._find_edit_target(args, opts, last_call)
467 except MacroToEdit as e:
472 except MacroToEdit as e:
468 self._edit_macro(args, e.args[0])
473 self._edit_macro(args, e.args[0])
469 return
474 return
470
475
471 # do actual editing here
476 # do actual editing here
472 print 'Editing...',
477 print 'Editing...',
473 sys.stdout.flush()
478 sys.stdout.flush()
474 try:
479 try:
475 # Quote filenames that may have spaces in them
480 # Quote filenames that may have spaces in them
476 if ' ' in filename:
481 if ' ' in filename:
477 filename = "'%s'" % filename
482 filename = "'%s'" % filename
478 self.shell.hooks.editor(filename,lineno)
483 self.shell.hooks.editor(filename,lineno)
479 except TryNext:
484 except TryNext:
480 warn('Could not open editor')
485 warn('Could not open editor')
481 return
486 return
482
487
483 # XXX TODO: should this be generalized for all string vars?
488 # XXX TODO: should this be generalized for all string vars?
484 # For now, this is special-cased to blocks created by cpaste
489 # For now, this is special-cased to blocks created by cpaste
485 if args.strip() == 'pasted_block':
490 if args.strip() == 'pasted_block':
486 self.shell.user_ns['pasted_block'] = file_read(filename)
491 self.shell.user_ns['pasted_block'] = file_read(filename)
487
492
488 if 'x' in opts: # -x prevents actual execution
493 if 'x' in opts: # -x prevents actual execution
489 print
494 print
490 else:
495 else:
491 print 'done. Executing edited code...'
496 print 'done. Executing edited code...'
492 if 'r' in opts: # Untranslated IPython code
497 if 'r' in opts: # Untranslated IPython code
493 self.shell.run_cell(file_read(filename),
498 self.shell.run_cell(file_read(filename),
494 store_history=False)
499 store_history=False)
495 else:
500 else:
496 self.shell.safe_execfile(filename, self.shell.user_ns,
501 self.shell.safe_execfile(filename, self.shell.user_ns,
497 self.shell.user_ns)
502 self.shell.user_ns)
498
503
499 if is_temp:
504 if is_temp:
500 try:
505 try:
501 return open(filename).read()
506 return open(filename).read()
502 except IOError,msg:
507 except IOError,msg:
503 if msg.filename == filename:
508 if msg.filename == filename:
504 warn('File not found. Did you forget to save?')
509 warn('File not found. Did you forget to save?')
505 return
510 return
506 else:
511 else:
507 self.shell.showtraceback()
512 self.shell.showtraceback()
General Comments 0
You need to be logged in to leave comments. Login now