Show More
@@ -27,7 +27,6 b' from IPython.core.oinspect import find_file, find_source_lines' | |||
|
27 | 27 | from IPython.testing.skipdoctest import skip_doctest |
|
28 | 28 | from IPython.utils import py3compat |
|
29 | 29 | from IPython.utils.contexts import preserve_keys |
|
30 | from IPython.utils.io import file_read | |
|
31 | 30 | from IPython.utils.path import get_py_filename, unquote_filename |
|
32 | 31 | from IPython.utils.warn import warn |
|
33 | 32 | |
@@ -531,7 +530,8 b' class CodeMagics(Magics):' | |||
|
531 | 530 | # XXX TODO: should this be generalized for all string vars? |
|
532 | 531 | # For now, this is special-cased to blocks created by cpaste |
|
533 | 532 | if args.strip() == 'pasted_block': |
|
534 | self.shell.user_ns['pasted_block'] = file_read(filename) | |
|
533 | with open(filename, 'r') as f: | |
|
534 | self.shell.user_ns['pasted_block'] = f.read() | |
|
535 | 535 | |
|
536 | 536 | if 'x' in opts: # -x prevents actual execution |
|
537 | 537 | |
@@ -541,8 +541,9 b' class CodeMagics(Magics):' | |||
|
541 | 541 | if not is_temp: |
|
542 | 542 | self.shell.user_ns['__file__'] = filename |
|
543 | 543 | if 'r' in opts: # Untranslated IPython code |
|
544 | self.shell.run_cell(file_read(filename), | |
|
545 | store_history=False) | |
|
544 | with open(filename, 'r') as f: | |
|
545 | source = f.read() | |
|
546 | self.shell.run_cell(source, store_history=False) | |
|
546 | 547 | else: |
|
547 | 548 | self.shell.safe_execfile(filename, self.shell.user_ns, |
|
548 | 549 | self.shell.user_ns) |
@@ -31,7 +31,6 b' from IPython.core.magic import (' | |||
|
31 | 31 | Magics, compress_dhist, magics_class, line_magic, cell_magic, line_cell_magic |
|
32 | 32 | ) |
|
33 | 33 | from IPython.testing.skipdoctest import skip_doctest |
|
34 | from IPython.utils.io import nlprint | |
|
35 | 34 | from IPython.utils.openpy import source_to_unicode |
|
36 | 35 | from IPython.utils.path import unquote_filename |
|
37 | 36 | from IPython.utils.process import abbrev_cwd |
@@ -403,7 +402,7 b' class OSMagics(Magics):' | |||
|
403 | 402 | |
|
404 | 403 | %dhist -> print full history\\ |
|
405 | 404 | %dhist n -> print last n entries only\\ |
|
406 |
%dhist n1 n2 -> print entries between n1 and n2 (n |
|
|
405 | %dhist n1 n2 -> print entries between n1 and n2 (n2 not included)\\ | |
|
407 | 406 | |
|
408 | 407 | This history is automatically maintained by the %cd command, and |
|
409 | 408 | always available as the global list variable _dh. You can use %cd -<n> |
@@ -425,14 +424,15 b' class OSMagics(Magics):' | |||
|
425 | 424 | ini,fin = max(len(dh)-(args[0]),0),len(dh) |
|
426 | 425 | elif len(args) == 2: |
|
427 | 426 | ini,fin = args |
|
427 | fin = min(fin, len(dh)) | |
|
428 | 428 | else: |
|
429 | 429 | self.arg_err(self.dhist) |
|
430 | 430 | return |
|
431 | 431 | else: |
|
432 | 432 | ini,fin = 0,len(dh) |
|
433 | nlprint(dh, | |
|
434 | header = 'Directory history (kept in _dh)', | |
|
435 | start=ini,stop=fin) | |
|
433 | print 'Directory history (kept in _dh)' | |
|
434 | for i in range(ini, fin): | |
|
435 | print "%d: %s" % (i, dh[i]) | |
|
436 | 436 | |
|
437 | 437 | @skip_doctest |
|
438 | 438 | @line_magic |
@@ -104,9 +104,9 b' from IPython.core.display_trap import DisplayTrap' | |||
|
104 | 104 | from IPython.core.excolors import exception_colors |
|
105 | 105 | from IPython.utils import PyColorize |
|
106 | 106 | from IPython.utils import io |
|
107 | from IPython.utils import openpy | |
|
107 | 108 | from IPython.utils import path as util_path |
|
108 | 109 | from IPython.utils import py3compat |
|
109 | from IPython.utils import pyfile | |
|
110 | 110 | from IPython.utils import ulinecache |
|
111 | 111 | from IPython.utils.data import uniq_stable |
|
112 | 112 | from IPython.utils.warn import info, error |
@@ -837,7 +837,7 b' class VerboseTB(TBTools):' | |||
|
837 | 837 | continue |
|
838 | 838 | elif file.endswith(('.pyc','.pyo')): |
|
839 | 839 | # Look up the corresponding source file. |
|
840 |
file = p |
|
|
840 | file = openpy.source_from_cache(file) | |
|
841 | 841 | |
|
842 | 842 | def linereader(file=file, lnum=[lnum], getline=ulinecache.getline): |
|
843 | 843 | line = getline(file, lnum[0]) |
@@ -119,7 +119,7 b' try:' | |||
|
119 | 119 | except NameError: |
|
120 | 120 | from imp import reload |
|
121 | 121 | |
|
122 |
from IPython.utils import p |
|
|
122 | from IPython.utils import openpy | |
|
123 | 123 | from IPython.utils.py3compat import PY3 |
|
124 | 124 | |
|
125 | 125 | #------------------------------------------------------------------------------ |
@@ -207,12 +207,12 b' class ModuleReloader(object):' | |||
|
207 | 207 | path, ext = os.path.splitext(filename) |
|
208 | 208 | |
|
209 | 209 | if ext.lower() == '.py': |
|
210 |
pyc_filename = p |
|
|
210 | pyc_filename = openpy.cache_from_source(filename) | |
|
211 | 211 | py_filename = filename |
|
212 | 212 | else: |
|
213 | 213 | pyc_filename = filename |
|
214 | 214 | try: |
|
215 |
py_filename = p |
|
|
215 | py_filename = openpy.source_from_cache(filename) | |
|
216 | 216 | except ValueError: |
|
217 | 217 | continue |
|
218 | 218 |
@@ -184,7 +184,6 b' import shlex' | |||
|
184 | 184 | import sys |
|
185 | 185 | |
|
186 | 186 | from IPython.utils import io |
|
187 | from IPython.utils.io import file_read | |
|
188 | 187 | from IPython.utils.text import marquee |
|
189 | 188 | from IPython.utils import openpy |
|
190 | 189 | __all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError'] |
@@ -380,7 +379,8 b' class Demo(object):' | |||
|
380 | 379 | |
|
381 | 380 | filename = self.shell.mktempfile(self.src_blocks[index]) |
|
382 | 381 | self.shell.hooks.editor(filename,1) |
|
383 | new_block = file_read(filename) | |
|
382 | with open(filename, 'r') as f: | |
|
383 | new_block = f.read() | |
|
384 | 384 | # update the source and colored block |
|
385 | 385 | self.src_blocks[index] = new_block |
|
386 | 386 | self.src_blocks_colored[index] = self.ip_colorize(new_block) |
@@ -22,7 +22,6 b' import sys' | |||
|
22 | 22 | from IPython.external import pexpect |
|
23 | 23 | |
|
24 | 24 | # Our own |
|
25 | from .autoattr import auto_attr | |
|
26 | 25 | from ._process_common import getoutput, arg_split |
|
27 | 26 | from IPython.utils import py3compat |
|
28 | 27 | from IPython.utils.encoding import DEFAULT_ENCODING |
@@ -55,14 +54,16 b' class ProcessHandler(object):' | |||
|
55 | 54 | logfile = None |
|
56 | 55 | |
|
57 | 56 | # Shell to call for subprocesses to execute |
|
58 | sh = None | |
|
57 | _sh = None | |
|
59 | 58 | |
|
60 | @auto_attr | |
|
59 | @property | |
|
61 | 60 | def sh(self): |
|
62 | sh = pexpect.which('sh') | |
|
63 | if sh is None: | |
|
64 | raise OSError('"sh" shell not found') | |
|
65 | return sh | |
|
61 | if self._sh is None: | |
|
62 | self._sh = pexpect.which('sh') | |
|
63 | if self._sh is None: | |
|
64 | raise OSError('"sh" shell not found') | |
|
65 | ||
|
66 | return self._sh | |
|
66 | 67 | |
|
67 | 68 | def __init__(self, logfile=None, read_timeout=None, terminate_timeout=None): |
|
68 | 69 | """Arguments are used for pexpect calls.""" |
@@ -9,16 +9,6 b'' | |||
|
9 | 9 | # the file COPYING, distributed as part of this software. |
|
10 | 10 | #----------------------------------------------------------------------------- |
|
11 | 11 | |
|
12 | #----------------------------------------------------------------------------- | |
|
13 | # Imports | |
|
14 | #----------------------------------------------------------------------------- | |
|
15 | ||
|
16 | import types | |
|
17 | ||
|
18 | #----------------------------------------------------------------------------- | |
|
19 | # Code | |
|
20 | #----------------------------------------------------------------------------- | |
|
21 | ||
|
22 | 12 | def uniq_stable(elems): |
|
23 | 13 | """uniq_stable(elems) -> list |
|
24 | 14 | |
@@ -32,65 +22,14 b' def uniq_stable(elems):' | |||
|
32 | 22 | return [x for x in elems if x not in seen and not seen.add(x)] |
|
33 | 23 | |
|
34 | 24 | |
|
35 | def sort_compare(lst1, lst2, inplace=1): | |
|
36 | """Sort and compare two lists. | |
|
37 | ||
|
38 | By default it does it in place, thus modifying the lists. Use inplace = 0 | |
|
39 | to avoid that (at the cost of temporary copy creation).""" | |
|
40 | if not inplace: | |
|
41 | lst1 = lst1[:] | |
|
42 | lst2 = lst2[:] | |
|
43 | lst1.sort(); lst2.sort() | |
|
44 | return lst1 == lst2 | |
|
45 | ||
|
46 | ||
|
47 | def list2dict(lst): | |
|
48 | """Takes a list of (key,value) pairs and turns it into a dict.""" | |
|
49 | ||
|
50 | dic = {} | |
|
51 | for k,v in lst: dic[k] = v | |
|
52 | return dic | |
|
53 | ||
|
54 | ||
|
55 | def list2dict2(lst, default=''): | |
|
56 | """Takes a list and turns it into a dict. | |
|
57 | Much slower than list2dict, but more versatile. This version can take | |
|
58 | lists with sublists of arbitrary length (including sclars).""" | |
|
59 | ||
|
60 | dic = {} | |
|
61 | for elem in lst: | |
|
62 | if type(elem) in (types.ListType,types.TupleType): | |
|
63 | size = len(elem) | |
|
64 | if size == 0: | |
|
65 | pass | |
|
66 | elif size == 1: | |
|
67 | dic[elem] = default | |
|
68 | else: | |
|
69 | k,v = elem[0], elem[1:] | |
|
70 | if len(v) == 1: v = v[0] | |
|
71 | dic[k] = v | |
|
72 | else: | |
|
73 | dic[elem] = default | |
|
74 | return dic | |
|
75 | ||
|
76 | ||
|
77 | 25 | def flatten(seq): |
|
78 | 26 | """Flatten a list of lists (NOT recursive, only works for 2d lists).""" |
|
79 | 27 | |
|
80 | 28 | return [x for subseq in seq for x in subseq] |
|
81 | ||
|
82 | ||
|
83 | def get_slice(seq, start=0, stop=None, step=1): | |
|
84 | """Get a slice of a sequence with variable step. Specify start,stop,step.""" | |
|
85 | if stop == None: | |
|
86 | stop = len(seq) | |
|
87 | item = lambda i: seq[i] | |
|
88 | return map(item,xrange(start,stop,step)) | |
|
89 | ||
|
29 | ||
|
90 | 30 | |
|
91 | 31 | def chop(seq, size): |
|
92 | 32 | """Chop a sequence into chunks of the given size.""" |
|
93 | chunk = lambda i: seq[i:i+size] | |
|
94 | return map(chunk,xrange(0,len(seq),size)) | |
|
33 | return [seq[i:i+size] for i in xrange(0,len(seq),size)] | |
|
95 | 34 | |
|
96 | 35 |
@@ -154,64 +154,6 b' class Tee(object):' | |||
|
154 | 154 | self.close() |
|
155 | 155 | |
|
156 | 156 | |
|
157 | def file_read(filename): | |
|
158 | """Read a file and close it. Returns the file source.""" | |
|
159 | fobj = open(filename,'r'); | |
|
160 | source = fobj.read(); | |
|
161 | fobj.close() | |
|
162 | return source | |
|
163 | ||
|
164 | ||
|
165 | def file_readlines(filename): | |
|
166 | """Read a file and close it. Returns the file source using readlines().""" | |
|
167 | fobj = open(filename,'r'); | |
|
168 | lines = fobj.readlines(); | |
|
169 | fobj.close() | |
|
170 | return lines | |
|
171 | ||
|
172 | ||
|
173 | def raw_input_multi(header='', ps1='==> ', ps2='..> ',terminate_str = '.'): | |
|
174 | """Take multiple lines of input. | |
|
175 | ||
|
176 | A list with each line of input as a separate element is returned when a | |
|
177 | termination string is entered (defaults to a single '.'). Input can also | |
|
178 | terminate via EOF (^D in Unix, ^Z-RET in Windows). | |
|
179 | ||
|
180 | Lines of input which end in \\ are joined into single entries (and a | |
|
181 | secondary continuation prompt is issued as long as the user terminates | |
|
182 | lines with \\). This allows entering very long strings which are still | |
|
183 | meant to be treated as single entities. | |
|
184 | """ | |
|
185 | ||
|
186 | try: | |
|
187 | if header: | |
|
188 | header += '\n' | |
|
189 | lines = [raw_input(header + ps1)] | |
|
190 | except EOFError: | |
|
191 | return [] | |
|
192 | terminate = [terminate_str] | |
|
193 | try: | |
|
194 | while lines[-1:] != terminate: | |
|
195 | new_line = raw_input(ps1) | |
|
196 | while new_line.endswith('\\'): | |
|
197 | new_line = new_line[:-1] + raw_input(ps2) | |
|
198 | lines.append(new_line) | |
|
199 | ||
|
200 | return lines[:-1] # don't return the termination command | |
|
201 | except EOFError: | |
|
202 | print() | |
|
203 | return lines | |
|
204 | ||
|
205 | ||
|
206 | def raw_input_ext(prompt='', ps2='... '): | |
|
207 | """Similar to raw_input(), but accepts extended lines if input ends with \\.""" | |
|
208 | ||
|
209 | line = raw_input(prompt) | |
|
210 | while line.endswith('\\'): | |
|
211 | line = line[:-1] + raw_input(ps2) | |
|
212 | return line | |
|
213 | ||
|
214 | ||
|
215 | 157 | def ask_yes_no(prompt,default=None): |
|
216 | 158 | """Asks a question and returns a boolean (y/n) answer. |
|
217 | 159 | |
@@ -242,44 +184,6 b' def ask_yes_no(prompt,default=None):' | |||
|
242 | 184 | return answers[ans] |
|
243 | 185 | |
|
244 | 186 | |
|
245 | class NLprinter: | |
|
246 | """Print an arbitrarily nested list, indicating index numbers. | |
|
247 | ||
|
248 | An instance of this class called nlprint is available and callable as a | |
|
249 | function. | |
|
250 | ||
|
251 | nlprint(list,indent=' ',sep=': ') -> prints indenting each level by 'indent' | |
|
252 | and using 'sep' to separate the index from the value. """ | |
|
253 | ||
|
254 | def __init__(self): | |
|
255 | self.depth = 0 | |
|
256 | ||
|
257 | def __call__(self,lst,pos='',**kw): | |
|
258 | """Prints the nested list numbering levels.""" | |
|
259 | kw.setdefault('indent',' ') | |
|
260 | kw.setdefault('sep',': ') | |
|
261 | kw.setdefault('start',0) | |
|
262 | kw.setdefault('stop',len(lst)) | |
|
263 | # we need to remove start and stop from kw so they don't propagate | |
|
264 | # into a recursive call for a nested list. | |
|
265 | start = kw['start']; del kw['start'] | |
|
266 | stop = kw['stop']; del kw['stop'] | |
|
267 | if self.depth == 0 and 'header' in kw.keys(): | |
|
268 | print(kw['header']) | |
|
269 | ||
|
270 | for idx in range(start,stop): | |
|
271 | elem = lst[idx] | |
|
272 | newpos = pos + str(idx) | |
|
273 | if type(elem)==type([]): | |
|
274 | self.depth += 1 | |
|
275 | self.__call__(elem, newpos+",", **kw) | |
|
276 | self.depth -= 1 | |
|
277 | else: | |
|
278 | print(kw['indent']*self.depth + newpos + kw["sep"] + repr(elem)) | |
|
279 | ||
|
280 | nlprint = NLprinter() | |
|
281 | ||
|
282 | ||
|
283 | 187 | def temp_pyfile(src, ext='.py'): |
|
284 | 188 | """Make a temporary python file, return filename and filehandle. |
|
285 | 189 |
@@ -18,8 +18,6 b' Authors:' | |||
|
18 | 18 | # Imports |
|
19 | 19 | #----------------------------------------------------------------------------- |
|
20 | 20 | |
|
21 | from IPython.utils.data import list2dict2 | |
|
22 | ||
|
23 | 21 | __all__ = ['Struct'] |
|
24 | 22 | |
|
25 | 23 | #----------------------------------------------------------------------------- |
@@ -370,7 +368,7 b' class Struct(dict):' | |||
|
370 | 368 | add_s = lambda old,new: old + ' ' + new |
|
371 | 369 | |
|
372 | 370 | # default policy is to keep current keys when there's a conflict |
|
373 |
conflict_solve = |
|
|
371 | conflict_solve = dict.fromkeys(self, preserve) | |
|
374 | 372 | |
|
375 | 373 | # the conflict_solve dictionary is given by the user 'inverted': we |
|
376 | 374 | # need a name-function mapping, it comes as a function -> names |
@@ -8,6 +8,7 b' from __future__ import absolute_import' | |||
|
8 | 8 | |
|
9 | 9 | import io |
|
10 | 10 | from io import TextIOWrapper, BytesIO |
|
11 | import os.path | |
|
11 | 12 | import re |
|
12 | 13 | |
|
13 | 14 | cookie_re = re.compile(ur"coding[:=]\s*([-\w.]+)", re.UNICODE) |
@@ -217,3 +218,22 b' def _list_readline(x):' | |||
|
217 | 218 | def readline(): |
|
218 | 219 | return next(x) |
|
219 | 220 | return readline |
|
221 | ||
|
222 | # Code for going between .py files and cached .pyc files ---------------------- | |
|
223 | ||
|
224 | try: # Python 3.2, see PEP 3147 | |
|
225 | from imp import source_from_cache, cache_from_source | |
|
226 | except ImportError: | |
|
227 | # Python <= 3.1: .pyc files go next to .py | |
|
228 | def source_from_cache(path): | |
|
229 | basename, ext = os.path.splitext(path) | |
|
230 | if ext not in ('.pyc', '.pyo'): | |
|
231 | raise ValueError('Not a cached Python file extension', ext) | |
|
232 | # Should we look for .pyw files? | |
|
233 | return basename + '.py' | |
|
234 | ||
|
235 | def cache_from_source(path, debug_override=None): | |
|
236 | if debug_override is None: | |
|
237 | debug_override = __debug__ | |
|
238 | basename, ext = os.path.splitext(path) | |
|
239 | return basename + '.pyc' if debug_override else '.pyo' |
@@ -30,25 +30,12 b' from string import Formatter' | |||
|
30 | 30 | from IPython.external.path import path |
|
31 | 31 | from IPython.testing.skipdoctest import skip_doctest_py3, skip_doctest |
|
32 | 32 | from IPython.utils import py3compat |
|
33 | from IPython.utils.io import nlprint | |
|
34 | 33 | from IPython.utils.data import flatten |
|
35 | 34 | |
|
36 | 35 | #----------------------------------------------------------------------------- |
|
37 | 36 | # Code |
|
38 | 37 | #----------------------------------------------------------------------------- |
|
39 | 38 | |
|
40 | def unquote_ends(istr): | |
|
41 | """Remove a single pair of quotes from the endpoints of a string.""" | |
|
42 | ||
|
43 | if not istr: | |
|
44 | return istr | |
|
45 | if (istr[0]=="'" and istr[-1]=="'") or \ | |
|
46 | (istr[0]=='"' and istr[-1]=='"'): | |
|
47 | return istr[1:-1] | |
|
48 | else: | |
|
49 | return istr | |
|
50 | ||
|
51 | ||
|
52 | 39 | class LSString(str): |
|
53 | 40 | """String derivative with a special access attributes. |
|
54 | 41 | |
@@ -265,105 +252,11 b' class SList(list):' | |||
|
265 | 252 | # arg.hideonce = False |
|
266 | 253 | # return |
|
267 | 254 | # |
|
268 | # nlprint(arg) | |
|
255 | # nlprint(arg) # This was a nested list printer, now removed. | |
|
269 | 256 | # |
|
270 | 257 | # print_slist = result_display.when_type(SList)(print_slist) |
|
271 | 258 | |
|
272 | 259 | |
|
273 | def esc_quotes(strng): | |
|
274 | """Return the input string with single and double quotes escaped out""" | |
|
275 | ||
|
276 | return strng.replace('"','\\"').replace("'","\\'") | |
|
277 | ||
|
278 | ||
|
279 | def qw(words,flat=0,sep=None,maxsplit=-1): | |
|
280 | """Similar to Perl's qw() operator, but with some more options. | |
|
281 | ||
|
282 | qw(words,flat=0,sep=' ',maxsplit=-1) -> words.split(sep,maxsplit) | |
|
283 | ||
|
284 | words can also be a list itself, and with flat=1, the output will be | |
|
285 | recursively flattened. | |
|
286 | ||
|
287 | Examples: | |
|
288 | ||
|
289 | >>> qw('1 2') | |
|
290 | ['1', '2'] | |
|
291 | ||
|
292 | >>> qw(['a b','1 2',['m n','p q']]) | |
|
293 | [['a', 'b'], ['1', '2'], [['m', 'n'], ['p', 'q']]] | |
|
294 | ||
|
295 | >>> qw(['a b','1 2',['m n','p q']],flat=1) | |
|
296 | ['a', 'b', '1', '2', 'm', 'n', 'p', 'q'] | |
|
297 | """ | |
|
298 | ||
|
299 | if isinstance(words, basestring): | |
|
300 | return [word.strip() for word in words.split(sep,maxsplit) | |
|
301 | if word and not word.isspace() ] | |
|
302 | if flat: | |
|
303 | return flatten(map(qw,words,[1]*len(words))) | |
|
304 | return map(qw,words) | |
|
305 | ||
|
306 | ||
|
307 | def qwflat(words,sep=None,maxsplit=-1): | |
|
308 | """Calls qw(words) in flat mode. It's just a convenient shorthand.""" | |
|
309 | return qw(words,1,sep,maxsplit) | |
|
310 | ||
|
311 | ||
|
312 | def qw_lol(indata): | |
|
313 | """qw_lol('a b') -> [['a','b']], | |
|
314 | otherwise it's just a call to qw(). | |
|
315 | ||
|
316 | We need this to make sure the modules_some keys *always* end up as a | |
|
317 | list of lists.""" | |
|
318 | ||
|
319 | if isinstance(indata, basestring): | |
|
320 | return [qw(indata)] | |
|
321 | else: | |
|
322 | return qw(indata) | |
|
323 | ||
|
324 | ||
|
325 | def grep(pat,list,case=1): | |
|
326 | """Simple minded grep-like function. | |
|
327 | grep(pat,list) returns occurrences of pat in list, None on failure. | |
|
328 | ||
|
329 | It only does simple string matching, with no support for regexps. Use the | |
|
330 | option case=0 for case-insensitive matching.""" | |
|
331 | ||
|
332 | # This is pretty crude. At least it should implement copying only references | |
|
333 | # to the original data in case it's big. Now it copies the data for output. | |
|
334 | out=[] | |
|
335 | if case: | |
|
336 | for term in list: | |
|
337 | if term.find(pat)>-1: out.append(term) | |
|
338 | else: | |
|
339 | lpat=pat.lower() | |
|
340 | for term in list: | |
|
341 | if term.lower().find(lpat)>-1: out.append(term) | |
|
342 | ||
|
343 | if len(out): return out | |
|
344 | else: return None | |
|
345 | ||
|
346 | ||
|
347 | def dgrep(pat,*opts): | |
|
348 | """Return grep() on dir()+dir(__builtins__). | |
|
349 | ||
|
350 | A very common use of grep() when working interactively.""" | |
|
351 | ||
|
352 | return grep(pat,dir(__main__)+dir(__main__.__builtins__),*opts) | |
|
353 | ||
|
354 | ||
|
355 | def idgrep(pat): | |
|
356 | """Case-insensitive dgrep()""" | |
|
357 | ||
|
358 | return dgrep(pat,0) | |
|
359 | ||
|
360 | ||
|
361 | def igrep(pat,list): | |
|
362 | """Synonym for case-insensitive grep.""" | |
|
363 | ||
|
364 | return grep(pat,list,case=0) | |
|
365 | ||
|
366 | ||
|
367 | 260 | def indent(instr,nspaces=4, ntabs=0, flatten=False): |
|
368 | 261 | """Indent a string a given number of spaces or tabstops. |
|
369 | 262 |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now