Show More
@@ -0,0 +1,21 b'' | |||
|
1 | """ Tests for various magic functions | |
|
2 | ||
|
3 | Needs to be run by nose (to make ipython session available) | |
|
4 | ||
|
5 | """ | |
|
6 | def test_rehashx(): | |
|
7 | # clear up everything | |
|
8 | _ip.IP.alias_table.clear() | |
|
9 | del _ip.db['syscmdlist'] | |
|
10 | ||
|
11 | _ip.magic('rehashx') | |
|
12 | # Practically ALL ipython development systems will have more than 10 aliases | |
|
13 | ||
|
14 | assert len(_ip.IP.alias_table) > 10 | |
|
15 | for key, val in _ip.IP.alias_table.items(): | |
|
16 | # we must strip dots from alias names | |
|
17 | assert '.' not in key | |
|
18 | ||
|
19 | # rehashx must fill up syscmdlist | |
|
20 | scoms = _ip.db['syscmdlist'] | |
|
21 | assert len(scoms) > 10 |
@@ -335,6 +335,12 b' def cd_completer(self, event):' | |||
|
335 | 335 | if not found: |
|
336 | 336 | if os.path.isdir(relpath): |
|
337 | 337 | return [relpath] |
|
338 | # if no completions so far, try bookmarks | |
|
339 | bks = self.db.get('bookmarks',{}).keys() | |
|
340 | bkmatches = [s for s in bks if s.startswith(event.symbol)] | |
|
341 | if bkmatches: | |
|
342 | return bkmatches | |
|
343 | ||
|
338 | 344 | raise IPython.ipapi.TryNext |
|
339 | 345 | |
|
340 | 346 |
@@ -50,9 +50,15 b' def main():' | |||
|
50 | 50 | ip.ex('import os') |
|
51 | 51 | ip.ex("def up(): os.chdir('..')") |
|
52 | 52 | ip.user_ns['LA'] = LastArgFinder() |
|
53 | # Nice prompt | |
|
54 | 53 | |
|
55 | o.prompt_in1= r'\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Green|\#> ' | |
|
54 | # You can assign to _prompt_title variable | |
|
55 | # to provide some extra information for prompt | |
|
56 | # (e.g. the current mode, host/username...) | |
|
57 | ||
|
58 | ip.user_ns['_prompt_title'] = '' | |
|
59 | ||
|
60 | # Nice prompt | |
|
61 | o.prompt_in1= r'\C_Green${_prompt_title}\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Green|\#> ' | |
|
56 | 62 | o.prompt_in2= r'\C_Green|\C_LightGreen\D\C_Green> ' |
|
57 | 63 | o.prompt_out= '<\#> ' |
|
58 | 64 | |
@@ -98,9 +104,15 b' def main():' | |||
|
98 | 104 | for cmd in syscmds: |
|
99 | 105 | # print "sys",cmd #dbg |
|
100 | 106 | noext, ext = os.path.splitext(cmd) |
|
101 | key = mapper(noext) | |
|
107 | if ext.lower() == '.exe': | |
|
108 | cmd = noext | |
|
109 | ||
|
110 | key = mapper(cmd) | |
|
102 | 111 | if key not in ip.IP.alias_table: |
|
103 | ip.defalias(key, cmd) | |
|
112 | # Dots will be removed from alias names, since ipython | |
|
113 | # assumes names with dots to be python code | |
|
114 | ||
|
115 | ip.defalias(key.replace('.',''), cmd) | |
|
104 | 116 | |
|
105 | 117 | # mglob combines 'find', recursion, exclusion... '%mglob?' to learn more |
|
106 | 118 | ip.load("IPython.external.mglob") |
@@ -2329,6 +2329,12 b' Currently the magic system has the following functions:\\n"""' | |||
|
2329 | 2329 | print 'Editing...', |
|
2330 | 2330 | sys.stdout.flush() |
|
2331 | 2331 | self.shell.hooks.editor(filename,lineno) |
|
2332 | ||
|
2333 | # XXX TODO: should this be generalized for all string vars? | |
|
2334 | # For now, this is special-cased to blocks created by cpaste | |
|
2335 | if args.strip() == 'pasted_block': | |
|
2336 | self.shell.user_ns['pasted_block'] = file_read(filename) | |
|
2337 | ||
|
2332 | 2338 | if opts.has_key('x'): # -x prevents actual execution |
|
2333 | 2339 | |
|
2334 | 2340 | else: |
@@ -2338,6 +2344,8 b' Currently the magic system has the following functions:\\n"""' | |||
|
2338 | 2344 | else: |
|
2339 | 2345 | self.shell.safe_execfile(filename,self.shell.user_ns, |
|
2340 | 2346 | self.shell.user_ns) |
|
2347 | ||
|
2348 | ||
|
2341 | 2349 | if use_temp: |
|
2342 | 2350 | try: |
|
2343 | 2351 | return open(filename).read() |
@@ -2647,8 +2655,10 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
2647 | 2655 | if isexec(ff) and ff not in self.shell.no_alias: |
|
2648 | 2656 | # each entry in the alias table must be (N,name), |
|
2649 | 2657 | # where N is the number of positional arguments of the |
|
2650 | # alias. | |
|
2651 | alias_table[ff] = (0,ff) | |
|
2658 | # alias. | |
|
2659 | # Dots will be removed from alias names, since ipython | |
|
2660 | # assumes names with dots to be python code | |
|
2661 | alias_table[ff.replace('.','')] = (0,ff) | |
|
2652 | 2662 | syscmdlist.append(ff) |
|
2653 | 2663 | else: |
|
2654 | 2664 | for pdir in path: |
@@ -2658,7 +2668,7 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
2658 | 2668 | if isexec(ff) and base.lower() not in self.shell.no_alias: |
|
2659 | 2669 | if ext.lower() == '.exe': |
|
2660 | 2670 | ff = base |
|
2661 | alias_table[base.lower()] = (0,ff) | |
|
2671 | alias_table[base.lower().replace('.','')] = (0,ff) | |
|
2662 | 2672 | syscmdlist.append(ff) |
|
2663 | 2673 | # Make sure the alias table doesn't contain keywords or builtins |
|
2664 | 2674 | self.shell.alias_table_validate() |
@@ -3210,14 +3220,24 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
3210 | 3220 | This assigns the pasted block to variable 'foo' as string, without |
|
3211 | 3221 | dedenting or executing it (preceding >>> and + is still stripped) |
|
3212 | 3222 | |
|
3223 | '%cpaste -r' re-executes the block previously entered by cpaste. | |
|
3224 | ||
|
3213 | 3225 | Do not be alarmed by garbled output on Windows (it's a readline bug). |
|
3214 | 3226 | Just press enter and type -- (and press enter again) and the block |
|
3215 | 3227 | will be what was just pasted. |
|
3216 | 3228 | |
|
3217 | 3229 | IPython statements (magics, shell escapes) are not supported (yet). |
|
3218 | 3230 | """ |
|
3219 | opts,args = self.parse_options(parameter_s,'s:',mode='string') | |
|
3231 | opts,args = self.parse_options(parameter_s,'rs:',mode='string') | |
|
3220 | 3232 | par = args.strip() |
|
3233 | if opts.has_key('r'): | |
|
3234 | b = self.user_ns.get('pasted_block', None) | |
|
3235 | if b is None: | |
|
3236 | raise UsageError('No previous pasted block available') | |
|
3237 | print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b)) | |
|
3238 | exec b in self.user_ns | |
|
3239 | return | |
|
3240 | ||
|
3221 | 3241 | sentinel = opts.get('s','--') |
|
3222 | 3242 | |
|
3223 | 3243 | # Regular expressions that declare text we strip from the input: |
@@ -3245,8 +3265,8 b' Defaulting color scheme to \'NoColor\'"""' | |||
|
3245 | 3265 | #print "block:\n",block |
|
3246 | 3266 | if not par: |
|
3247 | 3267 | b = textwrap.dedent(block) |
|
3248 | exec b in self.user_ns | |
|
3249 | 3268 | self.user_ns['pasted_block'] = b |
|
3269 | exec b in self.user_ns | |
|
3250 | 3270 | else: |
|
3251 | 3271 | self.user_ns[par] = SList(block.splitlines()) |
|
3252 | 3272 | print "Block assigned to '%s'" % par |
@@ -8,6 +8,7 b' import os' | |||
|
8 | 8 | |
|
9 | 9 | # IPython imports |
|
10 | 10 | from IPython.genutils import Term, ask_yes_no |
|
11 | import IPython.ipapi | |
|
11 | 12 | |
|
12 | 13 | def magic_history(self, parameter_s = ''): |
|
13 | 14 | """Print input history (_i<n> variables), with most recent last. |
@@ -222,6 +223,7 b' class ShadowHist:' | |||
|
222 | 223 | # cmd => idx mapping |
|
223 | 224 | self.curidx = 0 |
|
224 | 225 | self.db = db |
|
226 | self.disabled = False | |
|
225 | 227 | |
|
226 | 228 | def inc_idx(self): |
|
227 | 229 | idx = self.db.get('shadowhist_idx', 1) |
@@ -229,12 +231,19 b' class ShadowHist:' | |||
|
229 | 231 | return idx |
|
230 | 232 | |
|
231 | 233 | def add(self, ent): |
|
232 | old = self.db.hget('shadowhist', ent, _sentinel) | |
|
233 | if old is not _sentinel: | |
|
234 | if self.disabled: | |
|
234 | 235 | return |
|
235 | newidx = self.inc_idx() | |
|
236 | #print "new",newidx # dbg | |
|
237 | self.db.hset('shadowhist',ent, newidx) | |
|
236 | try: | |
|
237 | old = self.db.hget('shadowhist', ent, _sentinel) | |
|
238 | if old is not _sentinel: | |
|
239 | return | |
|
240 | newidx = self.inc_idx() | |
|
241 | #print "new",newidx # dbg | |
|
242 | self.db.hset('shadowhist',ent, newidx) | |
|
243 | except: | |
|
244 | IPython.ipapi.get().IP.showtraceback() | |
|
245 | print "WARNING: disabling shadow history" | |
|
246 | self.disabled = True | |
|
238 | 247 | |
|
239 | 248 | def all(self): |
|
240 | 249 | d = self.db.hdict('shadowhist') |
@@ -21,6 +21,32 b" What's new" | |||
|
21 | 21 | 6 Older releases |
|
22 | 22 | .. |
|
23 | 23 | |
|
24 | Release DEV | |
|
25 | =========== | |
|
26 | ||
|
27 | * cd completer: show bookmarks if no other completions are available. | |
|
28 | ||
|
29 | * Remove ipy_leo.py. "easy_install ipython-extension" to get it. | |
|
30 | (done to decouple it from ipython release cycle) | |
|
31 | ||
|
32 | * sh profile: easy way to give 'title' to prompt: assign to variable | |
|
33 | '_prompt_title'. It looks like this:: | |
|
34 | ||
|
35 | [~]|1> _prompt_title = 'sudo!' | |
|
36 | sudo![~]|2> | |
|
37 | ||
|
38 | * %rehashx: Aliases no longer contain dots. python3.0 binary | |
|
39 | will create alias python30. Fixes: | |
|
40 | #259716 "commands with dots in them don't work" | |
|
41 | ||
|
42 | * %cpaste: %cpaste -r repeats the last pasted block. | |
|
43 | The block is assigned to pasted_block even if code | |
|
44 | raises exception. | |
|
45 | ||
|
46 | * %edit: If you do '%edit pasted_block', pasted_block | |
|
47 | variable gets updated with new data (so repeated | |
|
48 | editing makes sense) | |
|
49 | ||
|
24 | 50 | |
|
25 | 51 | Release 0.9.1 |
|
26 | 52 | ============= |
General Comments 0
You need to be logged in to leave comments.
Login now