##// END OF EJS Templates
Separating %rep and %rerun magic commands. Trouble with tests.
Thomas Kluyver -
Show More
@@ -202,7 +202,8 b' class HistoryManager(Configurable):'
202 (n,), raw=raw, output=output)
202 (n,), raw=raw, output=output)
203 return reversed(list(cur))
203 return reversed(list(cur))
204
204
205 def get_hist_search(self, pattern="*", raw=True, output=False):
205 def get_hist_search(self, pattern="*", raw=True, search_raw=True,
206 output=False):
206 """Search the database using unix glob-style matching (wildcards * and
207 """Search the database using unix glob-style matching (wildcards * and
207 ?, escape using \).
208 ?, escape using \).
208
209
@@ -210,7 +211,7 b' class HistoryManager(Configurable):'
210 -------
211 -------
211 An iterator over tuples: (session, line_number, command)
212 An iterator over tuples: (session, line_number, command)
212 """
213 """
213 tosearch = "source_raw" if raw else "source"
214 tosearch = "source_raw" if search_raw else "source"
214 if output:
215 if output:
215 tosearch = "history." + tosearch
216 tosearch = "history." + tosearch
216 self.writeout_cache()
217 self.writeout_cache()
@@ -307,13 +308,15 b' class HistoryManager(Configurable):'
307 """
308 """
308 if source_raw is None:
309 if source_raw is None:
309 source_raw = source
310 source_raw = source
311 source = source.rstrip()
312 source_raw = source_raw.rstrip()
310
313
311 # do not store exit/quit commands
314 # do not store exit/quit commands
312 if source_raw.strip() in self._exit_commands:
315 if source_raw.strip() in self._exit_commands:
313 return
316 return
314
317
315 self.input_hist_parsed.append(source.rstrip())
318 self.input_hist_parsed.append(source)
316 self.input_hist_raw.append(source_raw.rstrip())
319 self.input_hist_raw.append(source_raw)
317
320
318 self.db_input_cache.append((self.session_number, line_num,
321 self.db_input_cache.append((self.session_number, line_num,
319 source, source_raw))
322 source, source_raw))
@@ -556,59 +559,95 b' def magic_rep(self, arg):'
556 variable) to the next input prompt. Allows you to create elaborate command
559 variable) to the next input prompt. Allows you to create elaborate command
557 lines without using copy-paste::
560 lines without using copy-paste::
558
561
559 $ l = ["hei", "vaan"]
562 In[1]: l = ["hei", "vaan"]
560 $ "".join(l)
563 In[2]: "".join(l)
561 ==> heivaan
564 Out[2]: heivaan
562 $ %rep
565 In[3]: %rep
563 $ heivaan_ <== cursor blinking
566 In[4]: heivaan_ <== cursor blinking
564
567
565 %rep 45
568 %rep 45
566
569
567 Place history line 45 to next input prompt. Use %hist to find out the
570 Place history line 45 on the next input prompt. Use %hist to find
568 number.
571 out the number.
569
572
570 %rep 1-4 6-7 3
573 %rep 1-4 6-7 3
571
574
572 Repeat the specified lines immediately. Input slice syntax is the same as
575 Combine the specified lines into one cell, and place it on the next
573 in %macro and %save.
576 input prompt. History slice syntax is the same as in %macro and %save.
574
577
575 %rep foo
578 %rep foo+bar
576
579
577 Place the most recent line that has the substring "foo" to next input.
580 If foo+bar can be evaluated in the user namespace, the result is
578 (e.g. 'svn ci -m foobar').
581 placed at the next input prompt. Otherwise, the history is searched
582 for lines which contain that substring, and the most recent one is
583 placed at the next input prompt.
579 """
584 """
580
585 if not arg: # Last output
581 opts,args = self.parse_options(arg,'',mode='list')
582 if not args: # Last output
583 self.set_next_input(str(self.shell.user_ns["_"]))
586 self.set_next_input(str(self.shell.user_ns["_"]))
584 return
587 return
588 # Get history range
589 histlines = self.history_manager.get_hist_from_rangestr(arg)
590 cmd = "\n".join(x[2] for x in histlines)
591 if cmd:
592 self.set_next_input(cmd.rstrip())
593 return
585
594
586 arg = " ".join(args)
595 try: # Variable in user namespace
587 histlines = self.history_manager.get_hist_from_rangestr(arg, raw=False)
596 cmd = str(eval(arg, self.shell.user_ns))
588 histlines = [x[2] for x in histlines]
597 except Exception: # Search for term in history
589
590 if len(histlines) > 1: # Execute immediately
591 histlines = "\n".join(histlines)
592 print("=== Executing: ===")
593 print(histlines)
594 print("=== Output: ===")
595 self.run_source(histlines, symbol="exec")
596
597 elif len(histlines) == 1: # Editable input
598 self.set_next_input(histlines[0].rstrip())
599
600 else: # Search for term - editable input
601 histlines = self.history_manager.get_hist_search("*"+arg+"*")
598 histlines = self.history_manager.get_hist_search("*"+arg+"*")
602 for h in reversed([x[2] for x in histlines]):
599 for h in reversed([x[2] for x in histlines]):
603 if 'rep' in h:
600 if 'rep' in h:
604 continue
601 continue
605 self.set_next_input(h.rstrip())
602 self.set_next_input(h.rstrip())
606 return
603 return
607 print("Not found in history:", arg)
604 else:
605 self.set_next_input(cmd.rstrip())
606 print("Couldn't evaluate or find in history:", arg)
607
608 def magic_rerun(self, parameter_s=''):
609 """Re-run previous input
610
611 By default, you can specify ranges of input history to be repeated
612 (as with %hist). With no arguments, it will repeat the last line.
613
614 Options:
615
616 -l <n> : Repeat the last n lines of input, not including the
617 current command.
618
619 -g foo : Repeat the most recent line which contains foo
620 """
621 opts, args = self.parse_options(parameter_s, 'l:g:', mode='string')
622 if "l" in opts: # Last n lines
623 n = int(opts['l']) + 1
624 hist = self.history_manager.get_hist_tail(n, raw=False)
625 elif "g" in opts: # Search
626 p = "*"+opts['g']+"*"
627 hist = self.history_manager.get_hist_search(p, raw=False)
628 hist = list(hist)[-2:]
629 elif args: # Specify history ranges
630 hist = self.history_manager.get_hist_from_rangestr(args)
631 else: # Last line
632 hist = self.history_manager.get_hist_tail(2, raw=False)
633 hist = [x[2] for x in hist]
634 if hist and parameter_s in hist[-1]:
635 hist = hist[:-1]
636 if not hist:
637 print("No lines in history match specification")
638 return
639 histlines = "\n".join(hist)
640 print("=== Executing: ===")
641 print(histlines)
642 print("=== Output: ===")
643 self.run_source("\n".join(hist), symbol="exec")
608
644
609
645
610 def init_ipython(ip):
646 def init_ipython(ip):
611 ip.define_magic("rep", magic_rep)
647 ip.define_magic("rep", magic_rep)
648 ip.define_magic("recall", magic_rep)
649 ip.define_magic("rerun", magic_rerun)
650 ip.define_magic("r", magic_rerun)
612 ip.define_magic("hist",magic_history) # Alternative name
651 ip.define_magic("hist",magic_history) # Alternative name
613 ip.define_magic("history",magic_history)
652 ip.define_magic("history",magic_history)
614
653
@@ -3029,38 +3029,6 b' Defaulting color scheme to \'NoColor\'"""'
3029 if parameter_s:
3029 if parameter_s:
3030 return self.shell.getoutput(parameter_s)
3030 return self.shell.getoutput(parameter_s)
3031
3031
3032 def magic_r(self, parameter_s=''):
3033 """Repeat previous input.
3034
3035 Note: Consider using the more powerfull %rep instead!
3036
3037 If given an argument, repeats the previous command which starts with
3038 the same string, otherwise it just repeats the previous input.
3039
3040 Shell escaped commands (with ! as first character) are not recognized
3041 by this system, only pure python code and magic commands.
3042 """
3043
3044 start = parameter_s.strip()
3045 esc_magic = ESC_MAGIC
3046 # Identify magic commands even if automagic is on (which means
3047 # the in-memory version is different from that typed by the user).
3048 if self.shell.automagic:
3049 start_magic = esc_magic+start
3050 else:
3051 start_magic = start
3052 # Look through the input history in reverse
3053 for n in range(len(self.shell.history_manager.input_hist_parsed)-2,0,-1):
3054 input = self.shell.history_manager.input_hist_parsed[n]
3055 # skip plain 'r' lines so we don't recurse to infinity
3056 if input != '_ip.magic("r")\n' and \
3057 (input.startswith(start) or input.startswith(start_magic)):
3058 #print 'match',`input` # dbg
3059 print 'Executing:',input,
3060 self.shell.run_cell(input)
3061 return
3062 print 'No previous input matching `%s` found.' % start
3063
3064
3032
3065 def magic_bookmark(self, parameter_s=''):
3033 def magic_bookmark(self, parameter_s=''):
3066 """Manage IPython's bookmark system.
3034 """Manage IPython's bookmark system.
General Comments 0
You need to be logged in to leave comments. Login now