##// END OF EJS Templates
Fix indentation of help text in %magic.
Bradley M. Froehle -
Show More
@@ -1,608 +1,610 b''
1 """Implementation of basic magic functions.
1 """Implementation of basic 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 from __future__ import print_function
14 from __future__ import print_function
15
15
16 # Stdlib
16 # Stdlib
17 import io
17 import io
18 import sys
18 import sys
19 from pprint import pformat
19 from pprint import pformat
20
20
21 # Our own packages
21 # Our own packages
22 from IPython.core import magic_arguments
22 from IPython.core import magic_arguments
23 from IPython.core.error import UsageError
23 from IPython.core.error import UsageError
24 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
24 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
25 from IPython.utils.text import format_screen
25 from IPython.utils.text import format_screen, dedent, indent
26 from IPython.core import magic_arguments, page
26 from IPython.core import magic_arguments, page
27 from IPython.testing.skipdoctest import skip_doctest
27 from IPython.testing.skipdoctest import skip_doctest
28 from IPython.utils.ipstruct import Struct
28 from IPython.utils.ipstruct import Struct
29 from IPython.utils.path import unquote_filename
29 from IPython.utils.path import unquote_filename
30 from IPython.utils.warn import warn, error
30 from IPython.utils.warn import warn, error
31
31
32 #-----------------------------------------------------------------------------
32 #-----------------------------------------------------------------------------
33 # Magics class implementation
33 # Magics class implementation
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35
35
36 @magics_class
36 @magics_class
37 class BasicMagics(Magics):
37 class BasicMagics(Magics):
38 """Magics that provide central IPython functionality.
38 """Magics that provide central IPython functionality.
39
39
40 These are various magics that don't fit into specific categories but that
40 These are various magics that don't fit into specific categories but that
41 are all part of the base 'IPython experience'."""
41 are all part of the base 'IPython experience'."""
42
42
43 @magic_arguments.magic_arguments()
43 @magic_arguments.magic_arguments()
44 @magic_arguments.argument(
44 @magic_arguments.argument(
45 '-l', '--line', action='store_true',
45 '-l', '--line', action='store_true',
46 help="""Create a line magic alias."""
46 help="""Create a line magic alias."""
47 )
47 )
48 @magic_arguments.argument(
48 @magic_arguments.argument(
49 '-c', '--cell', action='store_true',
49 '-c', '--cell', action='store_true',
50 help="""Create a cell magic alias."""
50 help="""Create a cell magic alias."""
51 )
51 )
52 @magic_arguments.argument(
52 @magic_arguments.argument(
53 'name',
53 'name',
54 help="""Name of the magic to be created."""
54 help="""Name of the magic to be created."""
55 )
55 )
56 @magic_arguments.argument(
56 @magic_arguments.argument(
57 'target',
57 'target',
58 help="""Name of the existing line or cell magic."""
58 help="""Name of the existing line or cell magic."""
59 )
59 )
60 @line_magic
60 @line_magic
61 def alias_magic(self, line=''):
61 def alias_magic(self, line=''):
62 """Create an alias for an existing line or cell magic.
62 """Create an alias for an existing line or cell magic.
63
63
64 Examples
64 Examples
65 --------
65 --------
66 ::
66 ::
67 In [1]: %alias_magic t timeit
67 In [1]: %alias_magic t timeit
68
68
69 In [2]: %t -n1 pass
69 In [2]: %t -n1 pass
70 1 loops, best of 3: 954 ns per loop
70 1 loops, best of 3: 954 ns per loop
71
71
72 In [3]: %%t -n1
72 In [3]: %%t -n1
73 ...: pass
73 ...: pass
74 ...:
74 ...:
75 1 loops, best of 3: 954 ns per loop
75 1 loops, best of 3: 954 ns per loop
76
76
77 In [4]: %alias_magic --cell whereami pwd
77 In [4]: %alias_magic --cell whereami pwd
78 UsageError: Cell magic function `%%pwd` not found.
78 UsageError: Cell magic function `%%pwd` not found.
79 In [5]: %alias_magic --line whereami pwd
79 In [5]: %alias_magic --line whereami pwd
80
80
81 In [6]: %whereami
81 In [6]: %whereami
82 Out[6]: u'/home/testuser'
82 Out[6]: u'/home/testuser'
83 """
83 """
84 args = magic_arguments.parse_argstring(self.alias_magic, line)
84 args = magic_arguments.parse_argstring(self.alias_magic, line)
85 shell = self.shell
85 shell = self.shell
86 escs = ''.join(magic_escapes.values())
86 escs = ''.join(magic_escapes.values())
87
87
88 target = args.target.lstrip(escs)
88 target = args.target.lstrip(escs)
89 name = args.name.lstrip(escs)
89 name = args.name.lstrip(escs)
90
90
91 # Find the requested magics.
91 # Find the requested magics.
92 m_line = shell.find_magic(target, 'line')
92 m_line = shell.find_magic(target, 'line')
93 m_cell = shell.find_magic(target, 'cell')
93 m_cell = shell.find_magic(target, 'cell')
94 if args.line and m_line is None:
94 if args.line and m_line is None:
95 raise UsageError('Line magic function `%s%s` not found.' %
95 raise UsageError('Line magic function `%s%s` not found.' %
96 (magic_escapes['line'], target))
96 (magic_escapes['line'], target))
97 if args.cell and m_cell is None:
97 if args.cell and m_cell is None:
98 raise UsageError('Cell magic function `%s%s` not found.' %
98 raise UsageError('Cell magic function `%s%s` not found.' %
99 (magic_escapes['cell'], target))
99 (magic_escapes['cell'], target))
100
100
101 # If --line and --cell are not specified, default to the ones
101 # If --line and --cell are not specified, default to the ones
102 # that are available.
102 # that are available.
103 if not args.line and not args.cell:
103 if not args.line and not args.cell:
104 if not m_line and not m_cell:
104 if not m_line and not m_cell:
105 raise UsageError(
105 raise UsageError(
106 'No line or cell magic with name `%s` found.' % target
106 'No line or cell magic with name `%s` found.' % target
107 )
107 )
108 args.line = bool(m_line)
108 args.line = bool(m_line)
109 args.cell = bool(m_cell)
109 args.cell = bool(m_cell)
110
110
111 if args.line:
111 if args.line:
112 def wrapper(line): return m_line(line)
112 def wrapper(line): return m_line(line)
113 wrapper.__name__ = str(name)
113 wrapper.__name__ = str(name)
114 wrapper.__doc__ = "Alias for `%s%s`." % \
114 wrapper.__doc__ = "Alias for `%s%s`." % \
115 (magic_escapes['line'], target)
115 (magic_escapes['line'], target)
116 shell.register_magic_function(wrapper, 'line', name)
116 shell.register_magic_function(wrapper, 'line', name)
117
117
118 if args.cell:
118 if args.cell:
119 def wrapper(line, cell): return m_cell(line, cell)
119 def wrapper(line, cell): return m_cell(line, cell)
120 wrapper.__name__ = str(name)
120 wrapper.__name__ = str(name)
121 wrapper.__doc__ = "Alias for `%s%s`." % \
121 wrapper.__doc__ = "Alias for `%s%s`." % \
122 (magic_escapes['cell'], target)
122 (magic_escapes['cell'], target)
123 shell.register_magic_function(wrapper, 'cell', name)
123 shell.register_magic_function(wrapper, 'cell', name)
124
124
125 def _lsmagic(self):
125 def _lsmagic(self):
126 mesc = magic_escapes['line']
126 mesc = magic_escapes['line']
127 cesc = magic_escapes['cell']
127 cesc = magic_escapes['cell']
128 mman = self.shell.magics_manager
128 mman = self.shell.magics_manager
129 magics = mman.lsmagic()
129 magics = mman.lsmagic()
130 out = ['Available line magics:',
130 out = ['Available line magics:',
131 mesc + (' '+mesc).join(sorted(magics['line'])),
131 mesc + (' '+mesc).join(sorted(magics['line'])),
132 '',
132 '',
133 'Available cell magics:',
133 'Available cell magics:',
134 cesc + (' '+cesc).join(sorted(magics['cell'])),
134 cesc + (' '+cesc).join(sorted(magics['cell'])),
135 '',
135 '',
136 mman.auto_status()]
136 mman.auto_status()]
137 return '\n'.join(out)
137 return '\n'.join(out)
138
138
139 @line_magic
139 @line_magic
140 def lsmagic(self, parameter_s=''):
140 def lsmagic(self, parameter_s=''):
141 """List currently available magic functions."""
141 """List currently available magic functions."""
142 print(self._lsmagic())
142 print(self._lsmagic())
143
143
144 def _magic_docs(self, brief=False, rest=False):
144 def _magic_docs(self, brief=False, rest=False):
145 """Return docstrings from magic functions."""
145 """Return docstrings from magic functions."""
146 mman = self.shell.magics_manager
146 mman = self.shell.magics_manager
147 docs = mman.lsmagic_docs(brief, missing='No documentation')
147 docs = mman.lsmagic_docs(brief, missing='No documentation')
148
148
149 if rest:
149 if rest:
150 format_string = '**%s%s**::\n\n\t%s\n\n'
150 format_string = '**%s%s**::\n\n%s\n\n'
151 else:
151 else:
152 format_string = '%s%s:\n\t%s\n'
152 format_string = '%s%s:\n%s\n'
153
153
154 return ''.join(
154 return ''.join(
155 [format_string % (magic_escapes['line'], fname, fndoc)
155 [format_string % (magic_escapes['line'], fname,
156 indent(dedent(fndoc)))
156 for fname, fndoc in sorted(docs['line'].items())]
157 for fname, fndoc in sorted(docs['line'].items())]
157 +
158 +
158 [format_string % (magic_escapes['cell'], fname, fndoc)
159 [format_string % (magic_escapes['cell'], fname,
160 indent(dedent(fndoc)))
159 for fname, fndoc in sorted(docs['cell'].items())]
161 for fname, fndoc in sorted(docs['cell'].items())]
160 )
162 )
161
163
162 @line_magic
164 @line_magic
163 def magic(self, parameter_s=''):
165 def magic(self, parameter_s=''):
164 """Print information about the magic function system.
166 """Print information about the magic function system.
165
167
166 Supported formats: -latex, -brief, -rest
168 Supported formats: -latex, -brief, -rest
167 """
169 """
168
170
169 mode = ''
171 mode = ''
170 try:
172 try:
171 mode = parameter_s.split()[0][1:]
173 mode = parameter_s.split()[0][1:]
172 if mode == 'rest':
174 if mode == 'rest':
173 rest_docs = []
175 rest_docs = []
174 except IndexError:
176 except IndexError:
175 pass
177 pass
176
178
177 brief = (mode == 'brief')
179 brief = (mode == 'brief')
178 rest = (mode == 'rest')
180 rest = (mode == 'rest')
179 magic_docs = self._magic_docs(brief, rest)
181 magic_docs = self._magic_docs(brief, rest)
180
182
181 if mode == 'latex':
183 if mode == 'latex':
182 print(self.format_latex(magic_docs))
184 print(self.format_latex(magic_docs))
183 return
185 return
184 else:
186 else:
185 magic_docs = format_screen(magic_docs)
187 magic_docs = format_screen(magic_docs)
186
188
187 out = ["""
189 out = ["""
188 IPython's 'magic' functions
190 IPython's 'magic' functions
189 ===========================
191 ===========================
190
192
191 The magic function system provides a series of functions which allow you to
193 The magic function system provides a series of functions which allow you to
192 control the behavior of IPython itself, plus a lot of system-type
194 control the behavior of IPython itself, plus a lot of system-type
193 features. There are two kinds of magics, line-oriented and cell-oriented.
195 features. There are two kinds of magics, line-oriented and cell-oriented.
194
196
195 Line magics are prefixed with the % character and work much like OS
197 Line magics are prefixed with the % character and work much like OS
196 command-line calls: they get as an argument the rest of the line, where
198 command-line calls: they get as an argument the rest of the line, where
197 arguments are passed without parentheses or quotes. For example, this will
199 arguments are passed without parentheses or quotes. For example, this will
198 time the given statement::
200 time the given statement::
199
201
200 %timeit range(1000)
202 %timeit range(1000)
201
203
202 Cell magics are prefixed with a double %%, and they are functions that get as
204 Cell magics are prefixed with a double %%, and they are functions that get as
203 an argument not only the rest of the line, but also the lines below it in a
205 an argument not only the rest of the line, but also the lines below it in a
204 separate argument. These magics are called with two arguments: the rest of the
206 separate argument. These magics are called with two arguments: the rest of the
205 call line and the body of the cell, consisting of the lines below the first.
207 call line and the body of the cell, consisting of the lines below the first.
206 For example::
208 For example::
207
209
208 %%timeit x = numpy.random.randn((100, 100))
210 %%timeit x = numpy.random.randn((100, 100))
209 numpy.linalg.svd(x)
211 numpy.linalg.svd(x)
210
212
211 will time the execution of the numpy svd routine, running the assignment of x
213 will time the execution of the numpy svd routine, running the assignment of x
212 as part of the setup phase, which is not timed.
214 as part of the setup phase, which is not timed.
213
215
214 In a line-oriented client (the terminal or Qt console IPython), starting a new
216 In a line-oriented client (the terminal or Qt console IPython), starting a new
215 input with %% will automatically enter cell mode, and IPython will continue
217 input with %% will automatically enter cell mode, and IPython will continue
216 reading input until a blank line is given. In the notebook, simply type the
218 reading input until a blank line is given. In the notebook, simply type the
217 whole cell as one entity, but keep in mind that the %% escape can only be at
219 whole cell as one entity, but keep in mind that the %% escape can only be at
218 the very start of the cell.
220 the very start of the cell.
219
221
220 NOTE: If you have 'automagic' enabled (via the command line option or with the
222 NOTE: If you have 'automagic' enabled (via the command line option or with the
221 %automagic function), you don't need to type in the % explicitly for line
223 %automagic function), you don't need to type in the % explicitly for line
222 magics; cell magics always require an explicit '%%' escape. By default,
224 magics; cell magics always require an explicit '%%' escape. By default,
223 IPython ships with automagic on, so you should only rarely need the % escape.
225 IPython ships with automagic on, so you should only rarely need the % escape.
224
226
225 Example: typing '%cd mydir' (without the quotes) changes you working directory
227 Example: typing '%cd mydir' (without the quotes) changes you working directory
226 to 'mydir', if it exists.
228 to 'mydir', if it exists.
227
229
228 For a list of the available magic functions, use %lsmagic. For a description
230 For a list of the available magic functions, use %lsmagic. For a description
229 of any of them, type %magic_name?, e.g. '%cd?'.
231 of any of them, type %magic_name?, e.g. '%cd?'.
230
232
231 Currently the magic system has the following functions:""",
233 Currently the magic system has the following functions:""",
232 magic_docs,
234 magic_docs,
233 "Summary of magic functions (from %slsmagic):",
235 "Summary of magic functions (from %slsmagic):",
234 self._lsmagic(),
236 self._lsmagic(),
235 ]
237 ]
236 page.page('\n'.join(out))
238 page.page('\n'.join(out))
237
239
238
240
239 @line_magic
241 @line_magic
240 def page(self, parameter_s=''):
242 def page(self, parameter_s=''):
241 """Pretty print the object and display it through a pager.
243 """Pretty print the object and display it through a pager.
242
244
243 %page [options] OBJECT
245 %page [options] OBJECT
244
246
245 If no object is given, use _ (last output).
247 If no object is given, use _ (last output).
246
248
247 Options:
249 Options:
248
250
249 -r: page str(object), don't pretty-print it."""
251 -r: page str(object), don't pretty-print it."""
250
252
251 # After a function contributed by Olivier Aubert, slightly modified.
253 # After a function contributed by Olivier Aubert, slightly modified.
252
254
253 # Process options/args
255 # Process options/args
254 opts, args = self.parse_options(parameter_s, 'r')
256 opts, args = self.parse_options(parameter_s, 'r')
255 raw = 'r' in opts
257 raw = 'r' in opts
256
258
257 oname = args and args or '_'
259 oname = args and args or '_'
258 info = self.shell._ofind(oname)
260 info = self.shell._ofind(oname)
259 if info['found']:
261 if info['found']:
260 txt = (raw and str or pformat)( info['obj'] )
262 txt = (raw and str or pformat)( info['obj'] )
261 page.page(txt)
263 page.page(txt)
262 else:
264 else:
263 print('Object `%s` not found' % oname)
265 print('Object `%s` not found' % oname)
264
266
265 @line_magic
267 @line_magic
266 def profile(self, parameter_s=''):
268 def profile(self, parameter_s=''):
267 """Print your currently active IPython profile."""
269 """Print your currently active IPython profile."""
268 from IPython.core.application import BaseIPythonApplication
270 from IPython.core.application import BaseIPythonApplication
269 if BaseIPythonApplication.initialized():
271 if BaseIPythonApplication.initialized():
270 print(BaseIPythonApplication.instance().profile)
272 print(BaseIPythonApplication.instance().profile)
271 else:
273 else:
272 error("profile is an application-level value, but you don't appear to be in an IPython application")
274 error("profile is an application-level value, but you don't appear to be in an IPython application")
273
275
274 @line_magic
276 @line_magic
275 def pprint(self, parameter_s=''):
277 def pprint(self, parameter_s=''):
276 """Toggle pretty printing on/off."""
278 """Toggle pretty printing on/off."""
277 ptformatter = self.shell.display_formatter.formatters['text/plain']
279 ptformatter = self.shell.display_formatter.formatters['text/plain']
278 ptformatter.pprint = bool(1 - ptformatter.pprint)
280 ptformatter.pprint = bool(1 - ptformatter.pprint)
279 print('Pretty printing has been turned',
281 print('Pretty printing has been turned',
280 ['OFF','ON'][ptformatter.pprint])
282 ['OFF','ON'][ptformatter.pprint])
281
283
282 @line_magic
284 @line_magic
283 def colors(self, parameter_s=''):
285 def colors(self, parameter_s=''):
284 """Switch color scheme for prompts, info system and exception handlers.
286 """Switch color scheme for prompts, info system and exception handlers.
285
287
286 Currently implemented schemes: NoColor, Linux, LightBG.
288 Currently implemented schemes: NoColor, Linux, LightBG.
287
289
288 Color scheme names are not case-sensitive.
290 Color scheme names are not case-sensitive.
289
291
290 Examples
292 Examples
291 --------
293 --------
292 To get a plain black and white terminal::
294 To get a plain black and white terminal::
293
295
294 %colors nocolor
296 %colors nocolor
295 """
297 """
296 def color_switch_err(name):
298 def color_switch_err(name):
297 warn('Error changing %s color schemes.\n%s' %
299 warn('Error changing %s color schemes.\n%s' %
298 (name, sys.exc_info()[1]))
300 (name, sys.exc_info()[1]))
299
301
300
302
301 new_scheme = parameter_s.strip()
303 new_scheme = parameter_s.strip()
302 if not new_scheme:
304 if not new_scheme:
303 raise UsageError(
305 raise UsageError(
304 "%colors: you must specify a color scheme. See '%colors?'")
306 "%colors: you must specify a color scheme. See '%colors?'")
305 return
307 return
306 # local shortcut
308 # local shortcut
307 shell = self.shell
309 shell = self.shell
308
310
309 import IPython.utils.rlineimpl as readline
311 import IPython.utils.rlineimpl as readline
310
312
311 if not shell.colors_force and \
313 if not shell.colors_force and \
312 not readline.have_readline and sys.platform == "win32":
314 not readline.have_readline and sys.platform == "win32":
313 msg = """\
315 msg = """\
314 Proper color support under MS Windows requires the pyreadline library.
316 Proper color support under MS Windows requires the pyreadline library.
315 You can find it at:
317 You can find it at:
316 http://ipython.org/pyreadline.html
318 http://ipython.org/pyreadline.html
317 Gary's readline needs the ctypes module, from:
319 Gary's readline needs the ctypes module, from:
318 http://starship.python.net/crew/theller/ctypes
320 http://starship.python.net/crew/theller/ctypes
319 (Note that ctypes is already part of Python versions 2.5 and newer).
321 (Note that ctypes is already part of Python versions 2.5 and newer).
320
322
321 Defaulting color scheme to 'NoColor'"""
323 Defaulting color scheme to 'NoColor'"""
322 new_scheme = 'NoColor'
324 new_scheme = 'NoColor'
323 warn(msg)
325 warn(msg)
324
326
325 # readline option is 0
327 # readline option is 0
326 if not shell.colors_force and not shell.has_readline:
328 if not shell.colors_force and not shell.has_readline:
327 new_scheme = 'NoColor'
329 new_scheme = 'NoColor'
328
330
329 # Set prompt colors
331 # Set prompt colors
330 try:
332 try:
331 shell.prompt_manager.color_scheme = new_scheme
333 shell.prompt_manager.color_scheme = new_scheme
332 except:
334 except:
333 color_switch_err('prompt')
335 color_switch_err('prompt')
334 else:
336 else:
335 shell.colors = \
337 shell.colors = \
336 shell.prompt_manager.color_scheme_table.active_scheme_name
338 shell.prompt_manager.color_scheme_table.active_scheme_name
337 # Set exception colors
339 # Set exception colors
338 try:
340 try:
339 shell.InteractiveTB.set_colors(scheme = new_scheme)
341 shell.InteractiveTB.set_colors(scheme = new_scheme)
340 shell.SyntaxTB.set_colors(scheme = new_scheme)
342 shell.SyntaxTB.set_colors(scheme = new_scheme)
341 except:
343 except:
342 color_switch_err('exception')
344 color_switch_err('exception')
343
345
344 # Set info (for 'object?') colors
346 # Set info (for 'object?') colors
345 if shell.color_info:
347 if shell.color_info:
346 try:
348 try:
347 shell.inspector.set_active_scheme(new_scheme)
349 shell.inspector.set_active_scheme(new_scheme)
348 except:
350 except:
349 color_switch_err('object inspector')
351 color_switch_err('object inspector')
350 else:
352 else:
351 shell.inspector.set_active_scheme('NoColor')
353 shell.inspector.set_active_scheme('NoColor')
352
354
353 @line_magic
355 @line_magic
354 def xmode(self, parameter_s=''):
356 def xmode(self, parameter_s=''):
355 """Switch modes for the exception handlers.
357 """Switch modes for the exception handlers.
356
358
357 Valid modes: Plain, Context and Verbose.
359 Valid modes: Plain, Context and Verbose.
358
360
359 If called without arguments, acts as a toggle."""
361 If called without arguments, acts as a toggle."""
360
362
361 def xmode_switch_err(name):
363 def xmode_switch_err(name):
362 warn('Error changing %s exception modes.\n%s' %
364 warn('Error changing %s exception modes.\n%s' %
363 (name,sys.exc_info()[1]))
365 (name,sys.exc_info()[1]))
364
366
365 shell = self.shell
367 shell = self.shell
366 new_mode = parameter_s.strip().capitalize()
368 new_mode = parameter_s.strip().capitalize()
367 try:
369 try:
368 shell.InteractiveTB.set_mode(mode=new_mode)
370 shell.InteractiveTB.set_mode(mode=new_mode)
369 print('Exception reporting mode:',shell.InteractiveTB.mode)
371 print('Exception reporting mode:',shell.InteractiveTB.mode)
370 except:
372 except:
371 xmode_switch_err('user')
373 xmode_switch_err('user')
372
374
373 @line_magic
375 @line_magic
374 def quickref(self,arg):
376 def quickref(self,arg):
375 """ Show a quick reference sheet """
377 """ Show a quick reference sheet """
376 from IPython.core.usage import quick_reference
378 from IPython.core.usage import quick_reference
377 qr = quick_reference + self._magic_docs(brief=True)
379 qr = quick_reference + self._magic_docs(brief=True)
378 page.page(qr)
380 page.page(qr)
379
381
380 @line_magic
382 @line_magic
381 def doctest_mode(self, parameter_s=''):
383 def doctest_mode(self, parameter_s=''):
382 """Toggle doctest mode on and off.
384 """Toggle doctest mode on and off.
383
385
384 This mode is intended to make IPython behave as much as possible like a
386 This mode is intended to make IPython behave as much as possible like a
385 plain Python shell, from the perspective of how its prompts, exceptions
387 plain Python shell, from the perspective of how its prompts, exceptions
386 and output look. This makes it easy to copy and paste parts of a
388 and output look. This makes it easy to copy and paste parts of a
387 session into doctests. It does so by:
389 session into doctests. It does so by:
388
390
389 - Changing the prompts to the classic ``>>>`` ones.
391 - Changing the prompts to the classic ``>>>`` ones.
390 - Changing the exception reporting mode to 'Plain'.
392 - Changing the exception reporting mode to 'Plain'.
391 - Disabling pretty-printing of output.
393 - Disabling pretty-printing of output.
392
394
393 Note that IPython also supports the pasting of code snippets that have
395 Note that IPython also supports the pasting of code snippets that have
394 leading '>>>' and '...' prompts in them. This means that you can paste
396 leading '>>>' and '...' prompts in them. This means that you can paste
395 doctests from files or docstrings (even if they have leading
397 doctests from files or docstrings (even if they have leading
396 whitespace), and the code will execute correctly. You can then use
398 whitespace), and the code will execute correctly. You can then use
397 '%history -t' to see the translated history; this will give you the
399 '%history -t' to see the translated history; this will give you the
398 input after removal of all the leading prompts and whitespace, which
400 input after removal of all the leading prompts and whitespace, which
399 can be pasted back into an editor.
401 can be pasted back into an editor.
400
402
401 With these features, you can switch into this mode easily whenever you
403 With these features, you can switch into this mode easily whenever you
402 need to do testing and changes to doctests, without having to leave
404 need to do testing and changes to doctests, without having to leave
403 your existing IPython session.
405 your existing IPython session.
404 """
406 """
405
407
406 # Shorthands
408 # Shorthands
407 shell = self.shell
409 shell = self.shell
408 pm = shell.prompt_manager
410 pm = shell.prompt_manager
409 meta = shell.meta
411 meta = shell.meta
410 disp_formatter = self.shell.display_formatter
412 disp_formatter = self.shell.display_formatter
411 ptformatter = disp_formatter.formatters['text/plain']
413 ptformatter = disp_formatter.formatters['text/plain']
412 # dstore is a data store kept in the instance metadata bag to track any
414 # dstore is a data store kept in the instance metadata bag to track any
413 # changes we make, so we can undo them later.
415 # changes we make, so we can undo them later.
414 dstore = meta.setdefault('doctest_mode',Struct())
416 dstore = meta.setdefault('doctest_mode',Struct())
415 save_dstore = dstore.setdefault
417 save_dstore = dstore.setdefault
416
418
417 # save a few values we'll need to recover later
419 # save a few values we'll need to recover later
418 mode = save_dstore('mode',False)
420 mode = save_dstore('mode',False)
419 save_dstore('rc_pprint',ptformatter.pprint)
421 save_dstore('rc_pprint',ptformatter.pprint)
420 save_dstore('xmode',shell.InteractiveTB.mode)
422 save_dstore('xmode',shell.InteractiveTB.mode)
421 save_dstore('rc_separate_out',shell.separate_out)
423 save_dstore('rc_separate_out',shell.separate_out)
422 save_dstore('rc_separate_out2',shell.separate_out2)
424 save_dstore('rc_separate_out2',shell.separate_out2)
423 save_dstore('rc_prompts_pad_left',pm.justify)
425 save_dstore('rc_prompts_pad_left',pm.justify)
424 save_dstore('rc_separate_in',shell.separate_in)
426 save_dstore('rc_separate_in',shell.separate_in)
425 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
427 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
426 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
428 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
427
429
428 if mode == False:
430 if mode == False:
429 # turn on
431 # turn on
430 pm.in_template = '>>> '
432 pm.in_template = '>>> '
431 pm.in2_template = '... '
433 pm.in2_template = '... '
432 pm.out_template = ''
434 pm.out_template = ''
433
435
434 # Prompt separators like plain python
436 # Prompt separators like plain python
435 shell.separate_in = ''
437 shell.separate_in = ''
436 shell.separate_out = ''
438 shell.separate_out = ''
437 shell.separate_out2 = ''
439 shell.separate_out2 = ''
438
440
439 pm.justify = False
441 pm.justify = False
440
442
441 ptformatter.pprint = False
443 ptformatter.pprint = False
442 disp_formatter.plain_text_only = True
444 disp_formatter.plain_text_only = True
443
445
444 shell.magic('xmode Plain')
446 shell.magic('xmode Plain')
445 else:
447 else:
446 # turn off
448 # turn off
447 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
449 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
448
450
449 shell.separate_in = dstore.rc_separate_in
451 shell.separate_in = dstore.rc_separate_in
450
452
451 shell.separate_out = dstore.rc_separate_out
453 shell.separate_out = dstore.rc_separate_out
452 shell.separate_out2 = dstore.rc_separate_out2
454 shell.separate_out2 = dstore.rc_separate_out2
453
455
454 pm.justify = dstore.rc_prompts_pad_left
456 pm.justify = dstore.rc_prompts_pad_left
455
457
456 ptformatter.pprint = dstore.rc_pprint
458 ptformatter.pprint = dstore.rc_pprint
457 disp_formatter.plain_text_only = dstore.rc_plain_text_only
459 disp_formatter.plain_text_only = dstore.rc_plain_text_only
458
460
459 shell.magic('xmode ' + dstore.xmode)
461 shell.magic('xmode ' + dstore.xmode)
460
462
461 # Store new mode and inform
463 # Store new mode and inform
462 dstore.mode = bool(1-int(mode))
464 dstore.mode = bool(1-int(mode))
463 mode_label = ['OFF','ON'][dstore.mode]
465 mode_label = ['OFF','ON'][dstore.mode]
464 print('Doctest mode is:', mode_label)
466 print('Doctest mode is:', mode_label)
465
467
466 @line_magic
468 @line_magic
467 def gui(self, parameter_s=''):
469 def gui(self, parameter_s=''):
468 """Enable or disable IPython GUI event loop integration.
470 """Enable or disable IPython GUI event loop integration.
469
471
470 %gui [GUINAME]
472 %gui [GUINAME]
471
473
472 This magic replaces IPython's threaded shells that were activated
474 This magic replaces IPython's threaded shells that were activated
473 using the (pylab/wthread/etc.) command line flags. GUI toolkits
475 using the (pylab/wthread/etc.) command line flags. GUI toolkits
474 can now be enabled at runtime and keyboard
476 can now be enabled at runtime and keyboard
475 interrupts should work without any problems. The following toolkits
477 interrupts should work without any problems. The following toolkits
476 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
478 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
477
479
478 %gui wx # enable wxPython event loop integration
480 %gui wx # enable wxPython event loop integration
479 %gui qt4|qt # enable PyQt4 event loop integration
481 %gui qt4|qt # enable PyQt4 event loop integration
480 %gui gtk # enable PyGTK event loop integration
482 %gui gtk # enable PyGTK event loop integration
481 %gui gtk3 # enable Gtk3 event loop integration
483 %gui gtk3 # enable Gtk3 event loop integration
482 %gui tk # enable Tk event loop integration
484 %gui tk # enable Tk event loop integration
483 %gui osx # enable Cocoa event loop integration
485 %gui osx # enable Cocoa event loop integration
484 # (requires %matplotlib 1.1)
486 # (requires %matplotlib 1.1)
485 %gui # disable all event loop integration
487 %gui # disable all event loop integration
486
488
487 WARNING: after any of these has been called you can simply create
489 WARNING: after any of these has been called you can simply create
488 an application object, but DO NOT start the event loop yourself, as
490 an application object, but DO NOT start the event loop yourself, as
489 we have already handled that.
491 we have already handled that.
490 """
492 """
491 opts, arg = self.parse_options(parameter_s, '')
493 opts, arg = self.parse_options(parameter_s, '')
492 if arg=='': arg = None
494 if arg=='': arg = None
493 try:
495 try:
494 return self.shell.enable_gui(arg)
496 return self.shell.enable_gui(arg)
495 except Exception as e:
497 except Exception as e:
496 # print simple error message, rather than traceback if we can't
498 # print simple error message, rather than traceback if we can't
497 # hook up the GUI
499 # hook up the GUI
498 error(str(e))
500 error(str(e))
499
501
500 @skip_doctest
502 @skip_doctest
501 @line_magic
503 @line_magic
502 def precision(self, s=''):
504 def precision(self, s=''):
503 """Set floating point precision for pretty printing.
505 """Set floating point precision for pretty printing.
504
506
505 Can set either integer precision or a format string.
507 Can set either integer precision or a format string.
506
508
507 If numpy has been imported and precision is an int,
509 If numpy has been imported and precision is an int,
508 numpy display precision will also be set, via ``numpy.set_printoptions``.
510 numpy display precision will also be set, via ``numpy.set_printoptions``.
509
511
510 If no argument is given, defaults will be restored.
512 If no argument is given, defaults will be restored.
511
513
512 Examples
514 Examples
513 --------
515 --------
514 ::
516 ::
515
517
516 In [1]: from math import pi
518 In [1]: from math import pi
517
519
518 In [2]: %precision 3
520 In [2]: %precision 3
519 Out[2]: u'%.3f'
521 Out[2]: u'%.3f'
520
522
521 In [3]: pi
523 In [3]: pi
522 Out[3]: 3.142
524 Out[3]: 3.142
523
525
524 In [4]: %precision %i
526 In [4]: %precision %i
525 Out[4]: u'%i'
527 Out[4]: u'%i'
526
528
527 In [5]: pi
529 In [5]: pi
528 Out[5]: 3
530 Out[5]: 3
529
531
530 In [6]: %precision %e
532 In [6]: %precision %e
531 Out[6]: u'%e'
533 Out[6]: u'%e'
532
534
533 In [7]: pi**10
535 In [7]: pi**10
534 Out[7]: 9.364805e+04
536 Out[7]: 9.364805e+04
535
537
536 In [8]: %precision
538 In [8]: %precision
537 Out[8]: u'%r'
539 Out[8]: u'%r'
538
540
539 In [9]: pi**10
541 In [9]: pi**10
540 Out[9]: 93648.047476082982
542 Out[9]: 93648.047476082982
541 """
543 """
542 ptformatter = self.shell.display_formatter.formatters['text/plain']
544 ptformatter = self.shell.display_formatter.formatters['text/plain']
543 ptformatter.float_precision = s
545 ptformatter.float_precision = s
544 return ptformatter.float_format
546 return ptformatter.float_format
545
547
546 @magic_arguments.magic_arguments()
548 @magic_arguments.magic_arguments()
547 @magic_arguments.argument(
549 @magic_arguments.argument(
548 '-e', '--export', action='store_true', default=False,
550 '-e', '--export', action='store_true', default=False,
549 help='Export IPython history as a notebook. The filename argument '
551 help='Export IPython history as a notebook. The filename argument '
550 'is used to specify the notebook name and format. For example '
552 'is used to specify the notebook name and format. For example '
551 'a filename of notebook.ipynb will result in a notebook name '
553 'a filename of notebook.ipynb will result in a notebook name '
552 'of "notebook" and a format of "xml". Likewise using a ".json" '
554 'of "notebook" and a format of "xml". Likewise using a ".json" '
553 'or ".py" file extension will write the notebook in the json '
555 'or ".py" file extension will write the notebook in the json '
554 'or py formats.'
556 'or py formats.'
555 )
557 )
556 @magic_arguments.argument(
558 @magic_arguments.argument(
557 '-f', '--format',
559 '-f', '--format',
558 help='Convert an existing IPython notebook to a new format. This option '
560 help='Convert an existing IPython notebook to a new format. This option '
559 'specifies the new format and can have the values: xml, json, py. '
561 'specifies the new format and can have the values: xml, json, py. '
560 'The target filename is chosen automatically based on the new '
562 'The target filename is chosen automatically based on the new '
561 'format. The filename argument gives the name of the source file.'
563 'format. The filename argument gives the name of the source file.'
562 )
564 )
563 @magic_arguments.argument(
565 @magic_arguments.argument(
564 'filename', type=unicode,
566 'filename', type=unicode,
565 help='Notebook name or filename'
567 help='Notebook name or filename'
566 )
568 )
567 @line_magic
569 @line_magic
568 def notebook(self, s):
570 def notebook(self, s):
569 """Export and convert IPython notebooks.
571 """Export and convert IPython notebooks.
570
572
571 This function can export the current IPython history to a notebook file
573 This function can export the current IPython history to a notebook file
572 or can convert an existing notebook file into a different format. For
574 or can convert an existing notebook file into a different format. For
573 example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
575 example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
574 To export the history to "foo.py" do "%notebook -e foo.py". To convert
576 To export the history to "foo.py" do "%notebook -e foo.py". To convert
575 "foo.ipynb" to "foo.json" do "%notebook -f json foo.ipynb". Possible
577 "foo.ipynb" to "foo.json" do "%notebook -f json foo.ipynb". Possible
576 formats include (json/ipynb, py).
578 formats include (json/ipynb, py).
577 """
579 """
578 args = magic_arguments.parse_argstring(self.notebook, s)
580 args = magic_arguments.parse_argstring(self.notebook, s)
579
581
580 from IPython.nbformat import current
582 from IPython.nbformat import current
581 args.filename = unquote_filename(args.filename)
583 args.filename = unquote_filename(args.filename)
582 if args.export:
584 if args.export:
583 fname, name, format = current.parse_filename(args.filename)
585 fname, name, format = current.parse_filename(args.filename)
584 cells = []
586 cells = []
585 hist = list(self.shell.history_manager.get_range())
587 hist = list(self.shell.history_manager.get_range())
586 for session, prompt_number, input in hist[:-1]:
588 for session, prompt_number, input in hist[:-1]:
587 cells.append(current.new_code_cell(prompt_number=prompt_number,
589 cells.append(current.new_code_cell(prompt_number=prompt_number,
588 input=input))
590 input=input))
589 worksheet = current.new_worksheet(cells=cells)
591 worksheet = current.new_worksheet(cells=cells)
590 nb = current.new_notebook(name=name,worksheets=[worksheet])
592 nb = current.new_notebook(name=name,worksheets=[worksheet])
591 with io.open(fname, 'w', encoding='utf-8') as f:
593 with io.open(fname, 'w', encoding='utf-8') as f:
592 current.write(nb, f, format);
594 current.write(nb, f, format);
593 elif args.format is not None:
595 elif args.format is not None:
594 old_fname, old_name, old_format = current.parse_filename(args.filename)
596 old_fname, old_name, old_format = current.parse_filename(args.filename)
595 new_format = args.format
597 new_format = args.format
596 if new_format == u'xml':
598 if new_format == u'xml':
597 raise ValueError('Notebooks cannot be written as xml.')
599 raise ValueError('Notebooks cannot be written as xml.')
598 elif new_format == u'ipynb' or new_format == u'json':
600 elif new_format == u'ipynb' or new_format == u'json':
599 new_fname = old_name + u'.ipynb'
601 new_fname = old_name + u'.ipynb'
600 new_format = u'json'
602 new_format = u'json'
601 elif new_format == u'py':
603 elif new_format == u'py':
602 new_fname = old_name + u'.py'
604 new_fname = old_name + u'.py'
603 else:
605 else:
604 raise ValueError('Invalid notebook format: %s' % new_format)
606 raise ValueError('Invalid notebook format: %s' % new_format)
605 with io.open(old_fname, 'r', encoding='utf-8') as f:
607 with io.open(old_fname, 'r', encoding='utf-8') as f:
606 nb = current.read(f, old_format)
608 nb = current.read(f, old_format)
607 with io.open(new_fname, 'w', encoding='utf-8') as f:
609 with io.open(new_fname, 'w', encoding='utf-8') as f:
608 current.write(nb, f, new_format)
610 current.write(nb, f, new_format)
General Comments 0
You need to be logged in to leave comments. Login now