|
@@
-1,3085
+1,3096
|
|
1
|
# -*- coding: utf-8 -*-
|
|
1
|
# -*- coding: utf-8 -*-
|
|
2
|
"""Magic functions for InteractiveShell.
|
|
2
|
"""Magic functions for InteractiveShell.
|
|
3
|
|
|
3
|
|
|
4
|
$Id: Magic.py 2122 2007-03-01 02:27:11Z fperez $"""
|
|
4
|
$Id: Magic.py 2153 2007-03-18 22:53:18Z 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
|
|
8
|
# Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
|
|
8
|
# Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
|
|
9
|
#
|
|
9
|
#
|
|
10
|
# Distributed under the terms of the BSD License. The full license is in
|
|
10
|
# Distributed under the terms of the BSD License. The full license is in
|
|
11
|
# the file COPYING, distributed as part of this software.
|
|
11
|
# the file COPYING, distributed as part of this software.
|
|
12
|
#*****************************************************************************
|
|
12
|
#*****************************************************************************
|
|
13
|
|
|
13
|
|
|
14
|
#****************************************************************************
|
|
14
|
#****************************************************************************
|
|
15
|
# Modules and globals
|
|
15
|
# Modules and globals
|
|
16
|
|
|
16
|
|
|
17
|
from IPython import Release
|
|
17
|
from IPython import Release
|
|
18
|
__author__ = '%s <%s>\n%s <%s>' % \
|
|
18
|
__author__ = '%s <%s>\n%s <%s>' % \
|
|
19
|
( Release.authors['Janko'] + Release.authors['Fernando'] )
|
|
19
|
( Release.authors['Janko'] + Release.authors['Fernando'] )
|
|
20
|
__license__ = Release.license
|
|
20
|
__license__ = Release.license
|
|
21
|
|
|
21
|
|
|
22
|
# Python standard modules
|
|
22
|
# Python standard modules
|
|
23
|
import __builtin__
|
|
23
|
import __builtin__
|
|
24
|
import bdb
|
|
24
|
import bdb
|
|
25
|
import inspect
|
|
25
|
import inspect
|
|
26
|
import os
|
|
26
|
import os
|
|
27
|
import pdb
|
|
27
|
import pdb
|
|
28
|
import pydoc
|
|
28
|
import pydoc
|
|
29
|
import sys
|
|
29
|
import sys
|
|
30
|
import re
|
|
30
|
import re
|
|
31
|
import tempfile
|
|
31
|
import tempfile
|
|
32
|
import time
|
|
32
|
import time
|
|
33
|
import cPickle as pickle
|
|
33
|
import cPickle as pickle
|
|
34
|
import textwrap
|
|
34
|
import textwrap
|
|
35
|
from cStringIO import StringIO
|
|
35
|
from cStringIO import StringIO
|
|
36
|
from getopt import getopt,GetoptError
|
|
36
|
from getopt import getopt,GetoptError
|
|
37
|
from pprint import pprint, pformat
|
|
37
|
from pprint import pprint, pformat
|
|
38
|
|
|
38
|
|
|
39
|
# cProfile was added in Python2.5
|
|
39
|
# cProfile was added in Python2.5
|
|
40
|
try:
|
|
40
|
try:
|
|
41
|
import cProfile as profile
|
|
41
|
import cProfile as profile
|
|
42
|
import pstats
|
|
42
|
import pstats
|
|
43
|
except ImportError:
|
|
43
|
except ImportError:
|
|
44
|
# profile isn't bundled by default in Debian for license reasons
|
|
44
|
# profile isn't bundled by default in Debian for license reasons
|
|
45
|
try:
|
|
45
|
try:
|
|
46
|
import profile,pstats
|
|
46
|
import profile,pstats
|
|
47
|
except ImportError:
|
|
47
|
except ImportError:
|
|
48
|
profile = pstats = None
|
|
48
|
profile = pstats = None
|
|
49
|
|
|
49
|
|
|
50
|
# Homebrewed
|
|
50
|
# Homebrewed
|
|
51
|
import IPython
|
|
51
|
import IPython
|
|
52
|
from IPython import Debugger, OInspect, wildcard
|
|
52
|
from IPython import Debugger, OInspect, wildcard
|
|
53
|
from IPython.FakeModule import FakeModule
|
|
53
|
from IPython.FakeModule import FakeModule
|
|
54
|
from IPython.Itpl import Itpl, itpl, printpl,itplns
|
|
54
|
from IPython.Itpl import Itpl, itpl, printpl,itplns
|
|
55
|
from IPython.PyColorize import Parser
|
|
55
|
from IPython.PyColorize import Parser
|
|
56
|
from IPython.ipstruct import Struct
|
|
56
|
from IPython.ipstruct import Struct
|
|
57
|
from IPython.macro import Macro
|
|
57
|
from IPython.macro import Macro
|
|
58
|
from IPython.genutils import *
|
|
58
|
from IPython.genutils import *
|
|
59
|
from IPython import platutils
|
|
59
|
from IPython import platutils
|
|
60
|
|
|
60
|
|
|
61
|
#***************************************************************************
|
|
61
|
#***************************************************************************
|
|
62
|
# Utility functions
|
|
62
|
# Utility functions
|
|
63
|
def on_off(tag):
|
|
63
|
def on_off(tag):
|
|
64
|
"""Return an ON/OFF string for a 1/0 input. Simple utility function."""
|
|
64
|
"""Return an ON/OFF string for a 1/0 input. Simple utility function."""
|
|
65
|
return ['OFF','ON'][tag]
|
|
65
|
return ['OFF','ON'][tag]
|
|
66
|
|
|
66
|
|
|
67
|
class Bunch: pass
|
|
67
|
class Bunch: pass
|
|
68
|
|
|
68
|
|
|
69
|
#***************************************************************************
|
|
69
|
#***************************************************************************
|
|
70
|
# Main class implementing Magic functionality
|
|
70
|
# Main class implementing Magic functionality
|
|
71
|
class Magic:
|
|
71
|
class Magic:
|
|
72
|
"""Magic functions for InteractiveShell.
|
|
72
|
"""Magic functions for InteractiveShell.
|
|
73
|
|
|
73
|
|
|
74
|
Shell functions which can be reached as %function_name. All magic
|
|
74
|
Shell functions which can be reached as %function_name. All magic
|
|
75
|
functions should accept a string, which they can parse for their own
|
|
75
|
functions should accept a string, which they can parse for their own
|
|
76
|
needs. This can make some functions easier to type, eg `%cd ../`
|
|
76
|
needs. This can make some functions easier to type, eg `%cd ../`
|
|
77
|
vs. `%cd("../")`
|
|
77
|
vs. `%cd("../")`
|
|
78
|
|
|
78
|
|
|
79
|
ALL definitions MUST begin with the prefix magic_. The user won't need it
|
|
79
|
ALL definitions MUST begin with the prefix magic_. The user won't need it
|
|
80
|
at the command line, but it is is needed in the definition. """
|
|
80
|
at the command line, but it is is needed in the definition. """
|
|
81
|
|
|
81
|
|
|
82
|
# class globals
|
|
82
|
# class globals
|
|
83
|
auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
|
|
83
|
auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
|
|
84
|
'Automagic is ON, % prefix NOT needed for magic functions.']
|
|
84
|
'Automagic is ON, % prefix NOT needed for magic functions.']
|
|
85
|
|
|
85
|
|
|
86
|
#......................................................................
|
|
86
|
#......................................................................
|
|
87
|
# some utility functions
|
|
87
|
# some utility functions
|
|
88
|
|
|
88
|
|
|
89
|
def __init__(self,shell):
|
|
89
|
def __init__(self,shell):
|
|
90
|
|
|
90
|
|
|
91
|
self.options_table = {}
|
|
91
|
self.options_table = {}
|
|
92
|
if profile is None:
|
|
92
|
if profile is None:
|
|
93
|
self.magic_prun = self.profile_missing_notice
|
|
93
|
self.magic_prun = self.profile_missing_notice
|
|
94
|
self.shell = shell
|
|
94
|
self.shell = shell
|
|
95
|
|
|
95
|
|
|
96
|
# namespace for holding state we may need
|
|
96
|
# namespace for holding state we may need
|
|
97
|
self._magic_state = Bunch()
|
|
97
|
self._magic_state = Bunch()
|
|
98
|
|
|
98
|
|
|
99
|
def profile_missing_notice(self, *args, **kwargs):
|
|
99
|
def profile_missing_notice(self, *args, **kwargs):
|
|
100
|
error("""\
|
|
100
|
error("""\
|
|
101
|
The profile module could not be found. If you are a Debian user,
|
|
101
|
The profile module could not be found. If you are a Debian user,
|
|
102
|
it has been removed from the standard Debian package because of its non-free
|
|
102
|
it has been removed from the standard Debian package because of its non-free
|
|
103
|
license. To use profiling, please install"python2.3-profiler" from non-free.""")
|
|
103
|
license. To use profiling, please install"python2.3-profiler" from non-free.""")
|
|
104
|
|
|
104
|
|
|
105
|
def default_option(self,fn,optstr):
|
|
105
|
def default_option(self,fn,optstr):
|
|
106
|
"""Make an entry in the options_table for fn, with value optstr"""
|
|
106
|
"""Make an entry in the options_table for fn, with value optstr"""
|
|
107
|
|
|
107
|
|
|
108
|
if fn not in self.lsmagic():
|
|
108
|
if fn not in self.lsmagic():
|
|
109
|
error("%s is not a magic function" % fn)
|
|
109
|
error("%s is not a magic function" % fn)
|
|
110
|
self.options_table[fn] = optstr
|
|
110
|
self.options_table[fn] = optstr
|
|
111
|
|
|
111
|
|
|
112
|
def lsmagic(self):
|
|
112
|
def lsmagic(self):
|
|
113
|
"""Return a list of currently available magic functions.
|
|
113
|
"""Return a list of currently available magic functions.
|
|
114
|
|
|
114
|
|
|
115
|
Gives a list of the bare names after mangling (['ls','cd', ...], not
|
|
115
|
Gives a list of the bare names after mangling (['ls','cd', ...], not
|
|
116
|
['magic_ls','magic_cd',...]"""
|
|
116
|
['magic_ls','magic_cd',...]"""
|
|
117
|
|
|
117
|
|
|
118
|
# FIXME. This needs a cleanup, in the way the magics list is built.
|
|
118
|
# FIXME. This needs a cleanup, in the way the magics list is built.
|
|
119
|
|
|
119
|
|
|
120
|
# magics in class definition
|
|
120
|
# magics in class definition
|
|
121
|
class_magic = lambda fn: fn.startswith('magic_') and \
|
|
121
|
class_magic = lambda fn: fn.startswith('magic_') and \
|
|
122
|
callable(Magic.__dict__[fn])
|
|
122
|
callable(Magic.__dict__[fn])
|
|
123
|
# in instance namespace (run-time user additions)
|
|
123
|
# in instance namespace (run-time user additions)
|
|
124
|
inst_magic = lambda fn: fn.startswith('magic_') and \
|
|
124
|
inst_magic = lambda fn: fn.startswith('magic_') and \
|
|
125
|
callable(self.__dict__[fn])
|
|
125
|
callable(self.__dict__[fn])
|
|
126
|
# and bound magics by user (so they can access self):
|
|
126
|
# and bound magics by user (so they can access self):
|
|
127
|
inst_bound_magic = lambda fn: fn.startswith('magic_') and \
|
|
127
|
inst_bound_magic = lambda fn: fn.startswith('magic_') and \
|
|
128
|
callable(self.__class__.__dict__[fn])
|
|
128
|
callable(self.__class__.__dict__[fn])
|
|
129
|
magics = filter(class_magic,Magic.__dict__.keys()) + \
|
|
129
|
magics = filter(class_magic,Magic.__dict__.keys()) + \
|
|
130
|
filter(inst_magic,self.__dict__.keys()) + \
|
|
130
|
filter(inst_magic,self.__dict__.keys()) + \
|
|
131
|
filter(inst_bound_magic,self.__class__.__dict__.keys())
|
|
131
|
filter(inst_bound_magic,self.__class__.__dict__.keys())
|
|
132
|
out = []
|
|
132
|
out = []
|
|
133
|
for fn in magics:
|
|
133
|
for fn in magics:
|
|
134
|
out.append(fn.replace('magic_','',1))
|
|
134
|
out.append(fn.replace('magic_','',1))
|
|
135
|
out.sort()
|
|
135
|
out.sort()
|
|
136
|
return out
|
|
136
|
return out
|
|
137
|
|
|
137
|
|
|
138
|
def extract_input_slices(self,slices,raw=False):
|
|
138
|
def extract_input_slices(self,slices,raw=False):
|
|
139
|
"""Return as a string a set of input history slices.
|
|
139
|
"""Return as a string a set of input history slices.
|
|
140
|
|
|
140
|
|
|
141
|
Inputs:
|
|
141
|
Inputs:
|
|
142
|
|
|
142
|
|
|
143
|
- slices: the set of slices is given as a list of strings (like
|
|
143
|
- slices: the set of slices is given as a list of strings (like
|
|
144
|
['1','4:8','9'], since this function is for use by magic functions
|
|
144
|
['1','4:8','9'], since this function is for use by magic functions
|
|
145
|
which get their arguments as strings.
|
|
145
|
which get their arguments as strings.
|
|
146
|
|
|
146
|
|
|
147
|
Optional inputs:
|
|
147
|
Optional inputs:
|
|
148
|
|
|
148
|
|
|
149
|
- raw(False): by default, the processed input is used. If this is
|
|
149
|
- raw(False): by default, the processed input is used. If this is
|
|
150
|
true, the raw input history is used instead.
|
|
150
|
true, the raw input history is used instead.
|
|
151
|
|
|
151
|
|
|
152
|
Note that slices can be called with two notations:
|
|
152
|
Note that slices can be called with two notations:
|
|
153
|
|
|
153
|
|
|
154
|
N:M -> standard python form, means including items N...(M-1).
|
|
154
|
N:M -> standard python form, means including items N...(M-1).
|
|
155
|
|
|
155
|
|
|
156
|
N-M -> include items N..M (closed endpoint)."""
|
|
156
|
N-M -> include items N..M (closed endpoint)."""
|
|
157
|
|
|
157
|
|
|
158
|
if raw:
|
|
158
|
if raw:
|
|
159
|
hist = self.shell.input_hist_raw
|
|
159
|
hist = self.shell.input_hist_raw
|
|
160
|
else:
|
|
160
|
else:
|
|
161
|
hist = self.shell.input_hist
|
|
161
|
hist = self.shell.input_hist
|
|
162
|
|
|
162
|
|
|
163
|
cmds = []
|
|
163
|
cmds = []
|
|
164
|
for chunk in slices:
|
|
164
|
for chunk in slices:
|
|
165
|
if ':' in chunk:
|
|
165
|
if ':' in chunk:
|
|
166
|
ini,fin = map(int,chunk.split(':'))
|
|
166
|
ini,fin = map(int,chunk.split(':'))
|
|
167
|
elif '-' in chunk:
|
|
167
|
elif '-' in chunk:
|
|
168
|
ini,fin = map(int,chunk.split('-'))
|
|
168
|
ini,fin = map(int,chunk.split('-'))
|
|
169
|
fin += 1
|
|
169
|
fin += 1
|
|
170
|
else:
|
|
170
|
else:
|
|
171
|
ini = int(chunk)
|
|
171
|
ini = int(chunk)
|
|
172
|
fin = ini+1
|
|
172
|
fin = ini+1
|
|
173
|
cmds.append(hist[ini:fin])
|
|
173
|
cmds.append(hist[ini:fin])
|
|
174
|
return cmds
|
|
174
|
return cmds
|
|
175
|
|
|
175
|
|
|
176
|
def _ofind(self, oname, namespaces=None):
|
|
176
|
def _ofind(self, oname, namespaces=None):
|
|
177
|
"""Find an object in the available namespaces.
|
|
177
|
"""Find an object in the available namespaces.
|
|
178
|
|
|
178
|
|
|
179
|
self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
|
|
179
|
self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
|
|
180
|
|
|
180
|
|
|
181
|
Has special code to detect magic functions.
|
|
181
|
Has special code to detect magic functions.
|
|
182
|
"""
|
|
182
|
"""
|
|
183
|
|
|
183
|
|
|
184
|
oname = oname.strip()
|
|
184
|
oname = oname.strip()
|
|
185
|
|
|
185
|
|
|
186
|
alias_ns = None
|
|
186
|
alias_ns = None
|
|
187
|
if namespaces is None:
|
|
187
|
if namespaces is None:
|
|
188
|
# Namespaces to search in:
|
|
188
|
# Namespaces to search in:
|
|
189
|
# Put them in a list. The order is important so that we
|
|
189
|
# Put them in a list. The order is important so that we
|
|
190
|
# find things in the same order that Python finds them.
|
|
190
|
# find things in the same order that Python finds them.
|
|
191
|
namespaces = [ ('Interactive', self.shell.user_ns),
|
|
191
|
namespaces = [ ('Interactive', self.shell.user_ns),
|
|
192
|
('IPython internal', self.shell.internal_ns),
|
|
192
|
('IPython internal', self.shell.internal_ns),
|
|
193
|
('Python builtin', __builtin__.__dict__),
|
|
193
|
('Python builtin', __builtin__.__dict__),
|
|
194
|
('Alias', self.shell.alias_table),
|
|
194
|
('Alias', self.shell.alias_table),
|
|
195
|
]
|
|
195
|
]
|
|
196
|
alias_ns = self.shell.alias_table
|
|
196
|
alias_ns = self.shell.alias_table
|
|
197
|
|
|
197
|
|
|
198
|
# initialize results to 'null'
|
|
198
|
# initialize results to 'null'
|
|
199
|
found = 0; obj = None; ospace = None; ds = None;
|
|
199
|
found = 0; obj = None; ospace = None; ds = None;
|
|
200
|
ismagic = 0; isalias = 0; parent = None
|
|
200
|
ismagic = 0; isalias = 0; parent = None
|
|
201
|
|
|
201
|
|
|
202
|
# Look for the given name by splitting it in parts. If the head is
|
|
202
|
# Look for the given name by splitting it in parts. If the head is
|
|
203
|
# found, then we look for all the remaining parts as members, and only
|
|
203
|
# found, then we look for all the remaining parts as members, and only
|
|
204
|
# declare success if we can find them all.
|
|
204
|
# declare success if we can find them all.
|
|
205
|
oname_parts = oname.split('.')
|
|
205
|
oname_parts = oname.split('.')
|
|
206
|
oname_head, oname_rest = oname_parts[0],oname_parts[1:]
|
|
206
|
oname_head, oname_rest = oname_parts[0],oname_parts[1:]
|
|
207
|
for nsname,ns in namespaces:
|
|
207
|
for nsname,ns in namespaces:
|
|
208
|
try:
|
|
208
|
try:
|
|
209
|
obj = ns[oname_head]
|
|
209
|
obj = ns[oname_head]
|
|
210
|
except KeyError:
|
|
210
|
except KeyError:
|
|
211
|
continue
|
|
211
|
continue
|
|
212
|
else:
|
|
212
|
else:
|
|
213
|
#print 'oname_rest:', oname_rest # dbg
|
|
213
|
#print 'oname_rest:', oname_rest # dbg
|
|
214
|
for part in oname_rest:
|
|
214
|
for part in oname_rest:
|
|
215
|
try:
|
|
215
|
try:
|
|
216
|
parent = obj
|
|
216
|
parent = obj
|
|
217
|
obj = getattr(obj,part)
|
|
217
|
obj = getattr(obj,part)
|
|
218
|
except:
|
|
218
|
except:
|
|
219
|
# Blanket except b/c some badly implemented objects
|
|
219
|
# Blanket except b/c some badly implemented objects
|
|
220
|
# allow __getattr__ to raise exceptions other than
|
|
220
|
# allow __getattr__ to raise exceptions other than
|
|
221
|
# AttributeError, which then crashes IPython.
|
|
221
|
# AttributeError, which then crashes IPython.
|
|
222
|
break
|
|
222
|
break
|
|
223
|
else:
|
|
223
|
else:
|
|
224
|
# If we finish the for loop (no break), we got all members
|
|
224
|
# If we finish the for loop (no break), we got all members
|
|
225
|
found = 1
|
|
225
|
found = 1
|
|
226
|
ospace = nsname
|
|
226
|
ospace = nsname
|
|
227
|
if ns == alias_ns:
|
|
227
|
if ns == alias_ns:
|
|
228
|
isalias = 1
|
|
228
|
isalias = 1
|
|
229
|
break # namespace loop
|
|
229
|
break # namespace loop
|
|
230
|
|
|
230
|
|
|
231
|
# Try to see if it's magic
|
|
231
|
# Try to see if it's magic
|
|
232
|
if not found:
|
|
232
|
if not found:
|
|
233
|
if oname.startswith(self.shell.ESC_MAGIC):
|
|
233
|
if oname.startswith(self.shell.ESC_MAGIC):
|
|
234
|
oname = oname[1:]
|
|
234
|
oname = oname[1:]
|
|
235
|
obj = getattr(self,'magic_'+oname,None)
|
|
235
|
obj = getattr(self,'magic_'+oname,None)
|
|
236
|
if obj is not None:
|
|
236
|
if obj is not None:
|
|
237
|
found = 1
|
|
237
|
found = 1
|
|
238
|
ospace = 'IPython internal'
|
|
238
|
ospace = 'IPython internal'
|
|
239
|
ismagic = 1
|
|
239
|
ismagic = 1
|
|
240
|
|
|
240
|
|
|
241
|
# Last try: special-case some literals like '', [], {}, etc:
|
|
241
|
# Last try: special-case some literals like '', [], {}, etc:
|
|
242
|
if not found and oname_head in ["''",'""','[]','{}','()']:
|
|
242
|
if not found and oname_head in ["''",'""','[]','{}','()']:
|
|
243
|
obj = eval(oname_head)
|
|
243
|
obj = eval(oname_head)
|
|
244
|
found = 1
|
|
244
|
found = 1
|
|
245
|
ospace = 'Interactive'
|
|
245
|
ospace = 'Interactive'
|
|
246
|
|
|
246
|
|
|
247
|
return {'found':found, 'obj':obj, 'namespace':ospace,
|
|
247
|
return {'found':found, 'obj':obj, 'namespace':ospace,
|
|
248
|
'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
|
|
248
|
'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
|
|
249
|
|
|
249
|
|
|
250
|
def arg_err(self,func):
|
|
250
|
def arg_err(self,func):
|
|
251
|
"""Print docstring if incorrect arguments were passed"""
|
|
251
|
"""Print docstring if incorrect arguments were passed"""
|
|
252
|
print 'Error in arguments:'
|
|
252
|
print 'Error in arguments:'
|
|
253
|
print OInspect.getdoc(func)
|
|
253
|
print OInspect.getdoc(func)
|
|
254
|
|
|
254
|
|
|
255
|
def format_latex(self,strng):
|
|
255
|
def format_latex(self,strng):
|
|
256
|
"""Format a string for latex inclusion."""
|
|
256
|
"""Format a string for latex inclusion."""
|
|
257
|
|
|
257
|
|
|
258
|
# Characters that need to be escaped for latex:
|
|
258
|
# Characters that need to be escaped for latex:
|
|
259
|
escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
|
|
259
|
escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
|
|
260
|
# Magic command names as headers:
|
|
260
|
# Magic command names as headers:
|
|
261
|
cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
|
|
261
|
cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
|
|
262
|
re.MULTILINE)
|
|
262
|
re.MULTILINE)
|
|
263
|
# Magic commands
|
|
263
|
# Magic commands
|
|
264
|
cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
|
|
264
|
cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
|
|
265
|
re.MULTILINE)
|
|
265
|
re.MULTILINE)
|
|
266
|
# Paragraph continue
|
|
266
|
# Paragraph continue
|
|
267
|
par_re = re.compile(r'\\$',re.MULTILINE)
|
|
267
|
par_re = re.compile(r'\\$',re.MULTILINE)
|
|
268
|
|
|
268
|
|
|
269
|
# The "\n" symbol
|
|
269
|
# The "\n" symbol
|
|
270
|
newline_re = re.compile(r'\\n')
|
|
270
|
newline_re = re.compile(r'\\n')
|
|
271
|
|
|
271
|
|
|
272
|
# Now build the string for output:
|
|
272
|
# Now build the string for output:
|
|
273
|
#strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
|
|
273
|
#strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
|
|
274
|
strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
|
|
274
|
strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
|
|
275
|
strng)
|
|
275
|
strng)
|
|
276
|
strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
|
|
276
|
strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
|
|
277
|
strng = par_re.sub(r'\\\\',strng)
|
|
277
|
strng = par_re.sub(r'\\\\',strng)
|
|
278
|
strng = escape_re.sub(r'\\\1',strng)
|
|
278
|
strng = escape_re.sub(r'\\\1',strng)
|
|
279
|
strng = newline_re.sub(r'\\textbackslash{}n',strng)
|
|
279
|
strng = newline_re.sub(r'\\textbackslash{}n',strng)
|
|
280
|
return strng
|
|
280
|
return strng
|
|
281
|
|
|
281
|
|
|
282
|
def format_screen(self,strng):
|
|
282
|
def format_screen(self,strng):
|
|
283
|
"""Format a string for screen printing.
|
|
283
|
"""Format a string for screen printing.
|
|
284
|
|
|
284
|
|
|
285
|
This removes some latex-type format codes."""
|
|
285
|
This removes some latex-type format codes."""
|
|
286
|
# Paragraph continue
|
|
286
|
# Paragraph continue
|
|
287
|
par_re = re.compile(r'\\$',re.MULTILINE)
|
|
287
|
par_re = re.compile(r'\\$',re.MULTILINE)
|
|
288
|
strng = par_re.sub('',strng)
|
|
288
|
strng = par_re.sub('',strng)
|
|
289
|
return strng
|
|
289
|
return strng
|
|
290
|
|
|
290
|
|
|
291
|
def parse_options(self,arg_str,opt_str,*long_opts,**kw):
|
|
291
|
def parse_options(self,arg_str,opt_str,*long_opts,**kw):
|
|
292
|
"""Parse options passed to an argument string.
|
|
292
|
"""Parse options passed to an argument string.
|
|
293
|
|
|
293
|
|
|
294
|
The interface is similar to that of getopt(), but it returns back a
|
|
294
|
The interface is similar to that of getopt(), but it returns back a
|
|
295
|
Struct with the options as keys and the stripped argument string still
|
|
295
|
Struct with the options as keys and the stripped argument string still
|
|
296
|
as a string.
|
|
296
|
as a string.
|
|
297
|
|
|
297
|
|
|
298
|
arg_str is quoted as a true sys.argv vector by using shlex.split.
|
|
298
|
arg_str is quoted as a true sys.argv vector by using shlex.split.
|
|
299
|
This allows us to easily expand variables, glob files, quote
|
|
299
|
This allows us to easily expand variables, glob files, quote
|
|
300
|
arguments, etc.
|
|
300
|
arguments, etc.
|
|
301
|
|
|
301
|
|
|
302
|
Options:
|
|
302
|
Options:
|
|
303
|
-mode: default 'string'. If given as 'list', the argument string is
|
|
303
|
-mode: default 'string'. If given as 'list', the argument string is
|
|
304
|
returned as a list (split on whitespace) instead of a string.
|
|
304
|
returned as a list (split on whitespace) instead of a string.
|
|
305
|
|
|
305
|
|
|
306
|
-list_all: put all option values in lists. Normally only options
|
|
306
|
-list_all: put all option values in lists. Normally only options
|
|
307
|
appearing more than once are put in a list.
|
|
307
|
appearing more than once are put in a list.
|
|
308
|
|
|
308
|
|
|
309
|
-posix (True): whether to split the input line in POSIX mode or not,
|
|
309
|
-posix (True): whether to split the input line in POSIX mode or not,
|
|
310
|
as per the conventions outlined in the shlex module from the
|
|
310
|
as per the conventions outlined in the shlex module from the
|
|
311
|
standard library."""
|
|
311
|
standard library."""
|
|
312
|
|
|
312
|
|
|
313
|
# inject default options at the beginning of the input line
|
|
313
|
# inject default options at the beginning of the input line
|
|
314
|
caller = sys._getframe(1).f_code.co_name.replace('magic_','')
|
|
314
|
caller = sys._getframe(1).f_code.co_name.replace('magic_','')
|
|
315
|
arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
|
|
315
|
arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
|
|
316
|
|
|
316
|
|
|
317
|
mode = kw.get('mode','string')
|
|
317
|
mode = kw.get('mode','string')
|
|
318
|
if mode not in ['string','list']:
|
|
318
|
if mode not in ['string','list']:
|
|
319
|
raise ValueError,'incorrect mode given: %s' % mode
|
|
319
|
raise ValueError,'incorrect mode given: %s' % mode
|
|
320
|
# Get options
|
|
320
|
# Get options
|
|
321
|
list_all = kw.get('list_all',0)
|
|
321
|
list_all = kw.get('list_all',0)
|
|
322
|
posix = kw.get('posix',True)
|
|
322
|
posix = kw.get('posix',True)
|
|
323
|
|
|
323
|
|
|
324
|
# Check if we have more than one argument to warrant extra processing:
|
|
324
|
# Check if we have more than one argument to warrant extra processing:
|
|
325
|
odict = {} # Dictionary with options
|
|
325
|
odict = {} # Dictionary with options
|
|
326
|
args = arg_str.split()
|
|
326
|
args = arg_str.split()
|
|
327
|
if len(args) >= 1:
|
|
327
|
if len(args) >= 1:
|
|
328
|
# If the list of inputs only has 0 or 1 thing in it, there's no
|
|
328
|
# If the list of inputs only has 0 or 1 thing in it, there's no
|
|
329
|
# need to look for options
|
|
329
|
# need to look for options
|
|
330
|
argv = arg_split(arg_str,posix)
|
|
330
|
argv = arg_split(arg_str,posix)
|
|
331
|
# Do regular option processing
|
|
331
|
# Do regular option processing
|
|
332
|
try:
|
|
332
|
try:
|
|
333
|
opts,args = getopt(argv,opt_str,*long_opts)
|
|
333
|
opts,args = getopt(argv,opt_str,*long_opts)
|
|
334
|
except GetoptError,e:
|
|
334
|
except GetoptError,e:
|
|
335
|
raise GetoptError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
|
|
335
|
raise GetoptError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
|
|
336
|
" ".join(long_opts)))
|
|
336
|
" ".join(long_opts)))
|
|
337
|
for o,a in opts:
|
|
337
|
for o,a in opts:
|
|
338
|
if o.startswith('--'):
|
|
338
|
if o.startswith('--'):
|
|
339
|
o = o[2:]
|
|
339
|
o = o[2:]
|
|
340
|
else:
|
|
340
|
else:
|
|
341
|
o = o[1:]
|
|
341
|
o = o[1:]
|
|
342
|
try:
|
|
342
|
try:
|
|
343
|
odict[o].append(a)
|
|
343
|
odict[o].append(a)
|
|
344
|
except AttributeError:
|
|
344
|
except AttributeError:
|
|
345
|
odict[o] = [odict[o],a]
|
|
345
|
odict[o] = [odict[o],a]
|
|
346
|
except KeyError:
|
|
346
|
except KeyError:
|
|
347
|
if list_all:
|
|
347
|
if list_all:
|
|
348
|
odict[o] = [a]
|
|
348
|
odict[o] = [a]
|
|
349
|
else:
|
|
349
|
else:
|
|
350
|
odict[o] = a
|
|
350
|
odict[o] = a
|
|
351
|
|
|
351
|
|
|
352
|
# Prepare opts,args for return
|
|
352
|
# Prepare opts,args for return
|
|
353
|
opts = Struct(odict)
|
|
353
|
opts = Struct(odict)
|
|
354
|
if mode == 'string':
|
|
354
|
if mode == 'string':
|
|
355
|
args = ' '.join(args)
|
|
355
|
args = ' '.join(args)
|
|
356
|
|
|
356
|
|
|
357
|
return opts,args
|
|
357
|
return opts,args
|
|
358
|
|
|
358
|
|
|
359
|
#......................................................................
|
|
359
|
#......................................................................
|
|
360
|
# And now the actual magic functions
|
|
360
|
# And now the actual magic functions
|
|
361
|
|
|
361
|
|
|
362
|
# Functions for IPython shell work (vars,funcs, config, etc)
|
|
362
|
# Functions for IPython shell work (vars,funcs, config, etc)
|
|
363
|
def magic_lsmagic(self, parameter_s = ''):
|
|
363
|
def magic_lsmagic(self, parameter_s = ''):
|
|
364
|
"""List currently available magic functions."""
|
|
364
|
"""List currently available magic functions."""
|
|
365
|
mesc = self.shell.ESC_MAGIC
|
|
365
|
mesc = self.shell.ESC_MAGIC
|
|
366
|
print 'Available magic functions:\n'+mesc+\
|
|
366
|
print 'Available magic functions:\n'+mesc+\
|
|
367
|
(' '+mesc).join(self.lsmagic())
|
|
367
|
(' '+mesc).join(self.lsmagic())
|
|
368
|
print '\n' + Magic.auto_status[self.shell.rc.automagic]
|
|
368
|
print '\n' + Magic.auto_status[self.shell.rc.automagic]
|
|
369
|
return None
|
|
369
|
return None
|
|
370
|
|
|
370
|
|
|
371
|
def magic_magic(self, parameter_s = ''):
|
|
371
|
def magic_magic(self, parameter_s = ''):
|
|
372
|
"""Print information about the magic function system."""
|
|
372
|
"""Print information about the magic function system."""
|
|
373
|
|
|
373
|
|
|
374
|
mode = ''
|
|
374
|
mode = ''
|
|
375
|
try:
|
|
375
|
try:
|
|
376
|
if parameter_s.split()[0] == '-latex':
|
|
376
|
if parameter_s.split()[0] == '-latex':
|
|
377
|
mode = 'latex'
|
|
377
|
mode = 'latex'
|
|
378
|
if parameter_s.split()[0] == '-brief':
|
|
378
|
if parameter_s.split()[0] == '-brief':
|
|
379
|
mode = 'brief'
|
|
379
|
mode = 'brief'
|
|
380
|
except:
|
|
380
|
except:
|
|
381
|
pass
|
|
381
|
pass
|
|
382
|
|
|
382
|
|
|
383
|
magic_docs = []
|
|
383
|
magic_docs = []
|
|
384
|
for fname in self.lsmagic():
|
|
384
|
for fname in self.lsmagic():
|
|
385
|
mname = 'magic_' + fname
|
|
385
|
mname = 'magic_' + fname
|
|
386
|
for space in (Magic,self,self.__class__):
|
|
386
|
for space in (Magic,self,self.__class__):
|
|
387
|
try:
|
|
387
|
try:
|
|
388
|
fn = space.__dict__[mname]
|
|
388
|
fn = space.__dict__[mname]
|
|
389
|
except KeyError:
|
|
389
|
except KeyError:
|
|
390
|
pass
|
|
390
|
pass
|
|
391
|
else:
|
|
391
|
else:
|
|
392
|
break
|
|
392
|
break
|
|
393
|
if mode == 'brief':
|
|
393
|
if mode == 'brief':
|
|
394
|
# only first line
|
|
394
|
# only first line
|
|
395
|
fndoc = fn.__doc__.split('\n',1)[0]
|
|
395
|
fndoc = fn.__doc__.split('\n',1)[0]
|
|
396
|
else:
|
|
396
|
else:
|
|
397
|
fndoc = fn.__doc__
|
|
397
|
fndoc = fn.__doc__
|
|
398
|
|
|
398
|
|
|
399
|
magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
|
|
399
|
magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
|
|
400
|
fname,fndoc))
|
|
400
|
fname,fndoc))
|
|
401
|
magic_docs = ''.join(magic_docs)
|
|
401
|
magic_docs = ''.join(magic_docs)
|
|
402
|
|
|
402
|
|
|
403
|
if mode == 'latex':
|
|
403
|
if mode == 'latex':
|
|
404
|
print self.format_latex(magic_docs)
|
|
404
|
print self.format_latex(magic_docs)
|
|
405
|
return
|
|
405
|
return
|
|
406
|
else:
|
|
406
|
else:
|
|
407
|
magic_docs = self.format_screen(magic_docs)
|
|
407
|
magic_docs = self.format_screen(magic_docs)
|
|
408
|
if mode == 'brief':
|
|
408
|
if mode == 'brief':
|
|
409
|
return magic_docs
|
|
409
|
return magic_docs
|
|
410
|
|
|
410
|
|
|
411
|
outmsg = """
|
|
411
|
outmsg = """
|
|
412
|
IPython's 'magic' functions
|
|
412
|
IPython's 'magic' functions
|
|
413
|
===========================
|
|
413
|
===========================
|
|
414
|
|
|
414
|
|
|
415
|
The magic function system provides a series of functions which allow you to
|
|
415
|
The magic function system provides a series of functions which allow you to
|
|
416
|
control the behavior of IPython itself, plus a lot of system-type
|
|
416
|
control the behavior of IPython itself, plus a lot of system-type
|
|
417
|
features. All these functions are prefixed with a % character, but parameters
|
|
417
|
features. All these functions are prefixed with a % character, but parameters
|
|
418
|
are given without parentheses or quotes.
|
|
418
|
are given without parentheses or quotes.
|
|
419
|
|
|
419
|
|
|
420
|
NOTE: If you have 'automagic' enabled (via the command line option or with the
|
|
420
|
NOTE: If you have 'automagic' enabled (via the command line option or with the
|
|
421
|
%automagic function), you don't need to type in the % explicitly. By default,
|
|
421
|
%automagic function), you don't need to type in the % explicitly. By default,
|
|
422
|
IPython ships with automagic on, so you should only rarely need the % escape.
|
|
422
|
IPython ships with automagic on, so you should only rarely need the % escape.
|
|
423
|
|
|
423
|
|
|
424
|
Example: typing '%cd mydir' (without the quotes) changes you working directory
|
|
424
|
Example: typing '%cd mydir' (without the quotes) changes you working directory
|
|
425
|
to 'mydir', if it exists.
|
|
425
|
to 'mydir', if it exists.
|
|
426
|
|
|
426
|
|
|
427
|
You can define your own magic functions to extend the system. See the supplied
|
|
427
|
You can define your own magic functions to extend the system. See the supplied
|
|
428
|
ipythonrc and example-magic.py files for details (in your ipython
|
|
428
|
ipythonrc and example-magic.py files for details (in your ipython
|
|
429
|
configuration directory, typically $HOME/.ipython/).
|
|
429
|
configuration directory, typically $HOME/.ipython/).
|
|
430
|
|
|
430
|
|
|
431
|
You can also define your own aliased names for magic functions. In your
|
|
431
|
You can also define your own aliased names for magic functions. In your
|
|
432
|
ipythonrc file, placing a line like:
|
|
432
|
ipythonrc file, placing a line like:
|
|
433
|
|
|
433
|
|
|
434
|
execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
|
|
434
|
execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
|
|
435
|
|
|
435
|
|
|
436
|
will define %pf as a new name for %profile.
|
|
436
|
will define %pf as a new name for %profile.
|
|
437
|
|
|
437
|
|
|
438
|
You can also call magics in code using the ipmagic() function, which IPython
|
|
438
|
You can also call magics in code using the ipmagic() function, which IPython
|
|
439
|
automatically adds to the builtin namespace. Type 'ipmagic?' for details.
|
|
439
|
automatically adds to the builtin namespace. Type 'ipmagic?' for details.
|
|
440
|
|
|
440
|
|
|
441
|
For a list of the available magic functions, use %lsmagic. For a description
|
|
441
|
For a list of the available magic functions, use %lsmagic. For a description
|
|
442
|
of any of them, type %magic_name?, e.g. '%cd?'.
|
|
442
|
of any of them, type %magic_name?, e.g. '%cd?'.
|
|
443
|
|
|
443
|
|
|
444
|
Currently the magic system has the following functions:\n"""
|
|
444
|
Currently the magic system has the following functions:\n"""
|
|
445
|
|
|
445
|
|
|
446
|
mesc = self.shell.ESC_MAGIC
|
|
446
|
mesc = self.shell.ESC_MAGIC
|
|
447
|
outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
|
|
447
|
outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
|
|
448
|
"\n\n%s%s\n\n%s" % (outmsg,
|
|
448
|
"\n\n%s%s\n\n%s" % (outmsg,
|
|
449
|
magic_docs,mesc,mesc,
|
|
449
|
magic_docs,mesc,mesc,
|
|
450
|
(' '+mesc).join(self.lsmagic()),
|
|
450
|
(' '+mesc).join(self.lsmagic()),
|
|
451
|
Magic.auto_status[self.shell.rc.automagic] ) )
|
|
451
|
Magic.auto_status[self.shell.rc.automagic] ) )
|
|
452
|
|
|
452
|
|
|
453
|
page(outmsg,screen_lines=self.shell.rc.screen_length)
|
|
453
|
page(outmsg,screen_lines=self.shell.rc.screen_length)
|
|
454
|
|
|
454
|
|
|
455
|
def magic_automagic(self, parameter_s = ''):
|
|
455
|
def magic_automagic(self, parameter_s = ''):
|
|
456
|
"""Make magic functions callable without having to type the initial %.
|
|
456
|
"""Make magic functions callable without having to type the initial %.
|
|
457
|
|
|
457
|
|
|
458
|
Without argumentsl toggles on/off (when off, you must call it as
|
|
458
|
Without argumentsl toggles on/off (when off, you must call it as
|
|
459
|
%automagic, of course). With arguments it sets the value, and you can
|
|
459
|
%automagic, of course). With arguments it sets the value, and you can
|
|
460
|
use any of (case insensitive):
|
|
460
|
use any of (case insensitive):
|
|
461
|
|
|
461
|
|
|
462
|
- on,1,True: to activate
|
|
462
|
- on,1,True: to activate
|
|
463
|
|
|
463
|
|
|
464
|
- off,0,False: to deactivate.
|
|
464
|
- off,0,False: to deactivate.
|
|
465
|
|
|
465
|
|
|
466
|
Note that magic functions have lowest priority, so if there's a
|
|
466
|
Note that magic functions have lowest priority, so if there's a
|
|
467
|
variable whose name collides with that of a magic fn, automagic won't
|
|
467
|
variable whose name collides with that of a magic fn, automagic won't
|
|
468
|
work for that function (you get the variable instead). However, if you
|
|
468
|
work for that function (you get the variable instead). However, if you
|
|
469
|
delete the variable (del var), the previously shadowed magic function
|
|
469
|
delete the variable (del var), the previously shadowed magic function
|
|
470
|
becomes visible to automagic again."""
|
|
470
|
becomes visible to automagic again."""
|
|
471
|
|
|
471
|
|
|
472
|
rc = self.shell.rc
|
|
472
|
rc = self.shell.rc
|
|
473
|
arg = parameter_s.lower()
|
|
473
|
arg = parameter_s.lower()
|
|
474
|
if parameter_s in ('on','1','true'):
|
|
474
|
if parameter_s in ('on','1','true'):
|
|
475
|
rc.automagic = True
|
|
475
|
rc.automagic = True
|
|
476
|
elif parameter_s in ('off','0','false'):
|
|
476
|
elif parameter_s in ('off','0','false'):
|
|
477
|
rc.automagic = False
|
|
477
|
rc.automagic = False
|
|
478
|
else:
|
|
478
|
else:
|
|
479
|
rc.automagic = not rc.automagic
|
|
479
|
rc.automagic = not rc.automagic
|
|
480
|
print '\n' + Magic.auto_status[rc.automagic]
|
|
480
|
print '\n' + Magic.auto_status[rc.automagic]
|
|
481
|
|
|
481
|
|
|
482
|
def magic_autocall(self, parameter_s = ''):
|
|
482
|
def magic_autocall(self, parameter_s = ''):
|
|
483
|
"""Make functions callable without having to type parentheses.
|
|
483
|
"""Make functions callable without having to type parentheses.
|
|
484
|
|
|
484
|
|
|
485
|
Usage:
|
|
485
|
Usage:
|
|
486
|
|
|
486
|
|
|
487
|
%autocall [mode]
|
|
487
|
%autocall [mode]
|
|
488
|
|
|
488
|
|
|
489
|
The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
|
|
489
|
The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
|
|
490
|
value is toggled on and off (remembering the previous state)."""
|
|
490
|
value is toggled on and off (remembering the previous state)."""
|
|
491
|
|
|
491
|
|
|
492
|
rc = self.shell.rc
|
|
492
|
rc = self.shell.rc
|
|
493
|
|
|
493
|
|
|
494
|
if parameter_s:
|
|
494
|
if parameter_s:
|
|
495
|
arg = int(parameter_s)
|
|
495
|
arg = int(parameter_s)
|
|
496
|
else:
|
|
496
|
else:
|
|
497
|
arg = 'toggle'
|
|
497
|
arg = 'toggle'
|
|
498
|
|
|
498
|
|
|
499
|
if not arg in (0,1,2,'toggle'):
|
|
499
|
if not arg in (0,1,2,'toggle'):
|
|
500
|
error('Valid modes: (0->Off, 1->Smart, 2->Full')
|
|
500
|
error('Valid modes: (0->Off, 1->Smart, 2->Full')
|
|
501
|
return
|
|
501
|
return
|
|
502
|
|
|
502
|
|
|
503
|
if arg in (0,1,2):
|
|
503
|
if arg in (0,1,2):
|
|
504
|
rc.autocall = arg
|
|
504
|
rc.autocall = arg
|
|
505
|
else: # toggle
|
|
505
|
else: # toggle
|
|
506
|
if rc.autocall:
|
|
506
|
if rc.autocall:
|
|
507
|
self._magic_state.autocall_save = rc.autocall
|
|
507
|
self._magic_state.autocall_save = rc.autocall
|
|
508
|
rc.autocall = 0
|
|
508
|
rc.autocall = 0
|
|
509
|
else:
|
|
509
|
else:
|
|
510
|
try:
|
|
510
|
try:
|
|
511
|
rc.autocall = self._magic_state.autocall_save
|
|
511
|
rc.autocall = self._magic_state.autocall_save
|
|
512
|
except AttributeError:
|
|
512
|
except AttributeError:
|
|
513
|
rc.autocall = self._magic_state.autocall_save = 1
|
|
513
|
rc.autocall = self._magic_state.autocall_save = 1
|
|
514
|
|
|
514
|
|
|
515
|
print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
|
|
515
|
print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
|
|
516
|
|
|
516
|
|
|
517
|
def magic_autoindent(self, parameter_s = ''):
|
|
517
|
def magic_autoindent(self, parameter_s = ''):
|
|
518
|
"""Toggle autoindent on/off (if available)."""
|
|
518
|
"""Toggle autoindent on/off (if available)."""
|
|
519
|
|
|
519
|
|
|
520
|
self.shell.set_autoindent()
|
|
520
|
self.shell.set_autoindent()
|
|
521
|
print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
|
|
521
|
print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
|
|
522
|
|
|
522
|
|
|
523
|
def magic_system_verbose(self, parameter_s = ''):
|
|
523
|
def magic_system_verbose(self, parameter_s = ''):
|
|
524
|
"""Set verbose printing of system calls.
|
|
524
|
"""Set verbose printing of system calls.
|
|
525
|
|
|
525
|
|
|
526
|
If called without an argument, act as a toggle"""
|
|
526
|
If called without an argument, act as a toggle"""
|
|
527
|
|
|
527
|
|
|
528
|
if parameter_s:
|
|
528
|
if parameter_s:
|
|
529
|
val = bool(eval(parameter_s))
|
|
529
|
val = bool(eval(parameter_s))
|
|
530
|
else:
|
|
530
|
else:
|
|
531
|
val = None
|
|
531
|
val = None
|
|
532
|
|
|
532
|
|
|
533
|
self.shell.rc_set_toggle('system_verbose',val)
|
|
533
|
self.shell.rc_set_toggle('system_verbose',val)
|
|
534
|
print "System verbose printing is:",\
|
|
534
|
print "System verbose printing is:",\
|
|
535
|
['OFF','ON'][self.shell.rc.system_verbose]
|
|
535
|
['OFF','ON'][self.shell.rc.system_verbose]
|
|
536
|
|
|
536
|
|
|
537
|
def magic_history(self, parameter_s = ''):
|
|
537
|
def magic_history(self, parameter_s = ''):
|
|
538
|
"""Print input history (_i<n> variables), with most recent last.
|
|
538
|
"""Print input history (_i<n> variables), with most recent last.
|
|
539
|
|
|
539
|
|
|
540
|
%history -> print at most 40 inputs (some may be multi-line)\\
|
|
540
|
%history -> print at most 40 inputs (some may be multi-line)\\
|
|
541
|
%history n -> print at most n inputs\\
|
|
541
|
%history n -> print at most n inputs\\
|
|
542
|
%history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
|
|
542
|
%history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
|
|
543
|
|
|
543
|
|
|
544
|
Each input's number <n> is shown, and is accessible as the
|
|
544
|
Each input's number <n> is shown, and is accessible as the
|
|
545
|
automatically generated variable _i<n>. Multi-line statements are
|
|
545
|
automatically generated variable _i<n>. Multi-line statements are
|
|
546
|
printed starting at a new line for easy copy/paste.
|
|
546
|
printed starting at a new line for easy copy/paste.
|
|
547
|
|
|
547
|
|
|
548
|
|
|
548
|
|
|
549
|
Options:
|
|
549
|
Options:
|
|
550
|
|
|
550
|
|
|
551
|
-n: do NOT print line numbers. This is useful if you want to get a
|
|
551
|
-n: do NOT print line numbers. This is useful if you want to get a
|
|
552
|
printout of many lines which can be directly pasted into a text
|
|
552
|
printout of many lines which can be directly pasted into a text
|
|
553
|
editor.
|
|
553
|
editor.
|
|
554
|
|
|
554
|
|
|
555
|
This feature is only available if numbered prompts are in use.
|
|
555
|
This feature is only available if numbered prompts are in use.
|
|
556
|
|
|
556
|
|
|
557
|
-r: print the 'raw' history. IPython filters your input and
|
|
557
|
-r: print the 'raw' history. IPython filters your input and
|
|
558
|
converts it all into valid Python source before executing it (things
|
|
558
|
converts it all into valid Python source before executing it (things
|
|
559
|
like magics or aliases are turned into function calls, for
|
|
559
|
like magics or aliases are turned into function calls, for
|
|
560
|
example). With this option, you'll see the unfiltered history
|
|
560
|
example). With this option, you'll see the unfiltered history
|
|
561
|
instead of the filtered version: '%cd /' will be seen as '%cd /'
|
|
561
|
instead of the filtered version: '%cd /' will be seen as '%cd /'
|
|
562
|
instead of '_ip.magic("%cd /")'.
|
|
562
|
instead of '_ip.magic("%cd /")'.
|
|
563
|
"""
|
|
563
|
"""
|
|
564
|
|
|
564
|
|
|
565
|
shell = self.shell
|
|
565
|
shell = self.shell
|
|
566
|
if not shell.outputcache.do_full_cache:
|
|
566
|
if not shell.outputcache.do_full_cache:
|
|
567
|
print 'This feature is only available if numbered prompts are in use.'
|
|
567
|
print 'This feature is only available if numbered prompts are in use.'
|
|
568
|
return
|
|
568
|
return
|
|
569
|
opts,args = self.parse_options(parameter_s,'nr',mode='list')
|
|
569
|
opts,args = self.parse_options(parameter_s,'nr',mode='list')
|
|
570
|
|
|
570
|
|
|
571
|
if opts.has_key('r'):
|
|
571
|
if opts.has_key('r'):
|
|
572
|
input_hist = shell.input_hist_raw
|
|
572
|
input_hist = shell.input_hist_raw
|
|
573
|
else:
|
|
573
|
else:
|
|
574
|
input_hist = shell.input_hist
|
|
574
|
input_hist = shell.input_hist
|
|
575
|
|
|
575
|
|
|
576
|
default_length = 40
|
|
576
|
default_length = 40
|
|
577
|
if len(args) == 0:
|
|
577
|
if len(args) == 0:
|
|
578
|
final = len(input_hist)
|
|
578
|
final = len(input_hist)
|
|
579
|
init = max(1,final-default_length)
|
|
579
|
init = max(1,final-default_length)
|
|
580
|
elif len(args) == 1:
|
|
580
|
elif len(args) == 1:
|
|
581
|
final = len(input_hist)
|
|
581
|
final = len(input_hist)
|
|
582
|
init = max(1,final-int(args[0]))
|
|
582
|
init = max(1,final-int(args[0]))
|
|
583
|
elif len(args) == 2:
|
|
583
|
elif len(args) == 2:
|
|
584
|
init,final = map(int,args)
|
|
584
|
init,final = map(int,args)
|
|
585
|
else:
|
|
585
|
else:
|
|
586
|
warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
|
|
586
|
warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
|
|
587
|
print self.magic_hist.__doc__
|
|
587
|
print self.magic_hist.__doc__
|
|
588
|
return
|
|
588
|
return
|
|
589
|
width = len(str(final))
|
|
589
|
width = len(str(final))
|
|
590
|
line_sep = ['','\n']
|
|
590
|
line_sep = ['','\n']
|
|
591
|
print_nums = not opts.has_key('n')
|
|
591
|
print_nums = not opts.has_key('n')
|
|
592
|
for in_num in range(init,final):
|
|
592
|
for in_num in range(init,final):
|
|
593
|
inline = input_hist[in_num]
|
|
593
|
inline = input_hist[in_num]
|
|
594
|
multiline = int(inline.count('\n') > 1)
|
|
594
|
multiline = int(inline.count('\n') > 1)
|
|
595
|
if print_nums:
|
|
595
|
if print_nums:
|
|
596
|
print '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
|
|
596
|
print '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
|
|
597
|
print inline,
|
|
597
|
print inline,
|
|
598
|
|
|
598
|
|
|
599
|
def magic_hist(self, parameter_s=''):
|
|
599
|
def magic_hist(self, parameter_s=''):
|
|
600
|
"""Alternate name for %history."""
|
|
600
|
"""Alternate name for %history."""
|
|
601
|
return self.magic_history(parameter_s)
|
|
601
|
return self.magic_history(parameter_s)
|
|
602
|
|
|
602
|
|
|
603
|
def magic_p(self, parameter_s=''):
|
|
603
|
def magic_p(self, parameter_s=''):
|
|
604
|
"""Just a short alias for Python's 'print'."""
|
|
604
|
"""Just a short alias for Python's 'print'."""
|
|
605
|
exec 'print ' + parameter_s in self.shell.user_ns
|
|
605
|
exec 'print ' + parameter_s in self.shell.user_ns
|
|
606
|
|
|
606
|
|
|
607
|
def magic_r(self, parameter_s= |