##// END OF EJS Templates
Allow getting help mid-way through a command (e.g. a = abc.def?).
Thomas Kluyver -
Show More
@@ -658,6 +658,34 b' def transform_ipy_prompt(line):'
658 return line
658 return line
659
659
660
660
661 def _make_help_call(target, esc, lspace):
662 """Prepares a pinfo(2)/psearch call from a target name and the escape
663 (i.e. ? or ??)"""
664 method = 'pinfo2' if esc == '??' \
665 else 'psearch' if '*' in target \
666 else 'pinfo'
667
668 tpl = '%sget_ipython().magic(u"%s %s")'
669 return tpl % (lspace, method, target)
670
671 _initial_space_re = re.compile(r'\s*')
672 _help_end_re = re.compile(r"""(%?
673 [a-zA-Z_*][a-zA-Z0-9_*]* # Variable name
674 (.[a-zA-Z_*][a-zA-Z0-9_*]*)* # .etc.etc
675 )
676 (\?\??)$ # ? or ??""",
677 re.VERBOSE)
678 def transform_help_end(line):
679 """Translate lines with ?/?? at the end"""
680 m = _help_end_re.search(line)
681 if m is None:
682 return line
683 target = m.group(1)
684 esc = m.group(3)
685 lspace = _initial_space_re.match(line).group(0)
686 return _make_help_call(target, esc, lspace)
687
688
661 class EscapedTransformer(object):
689 class EscapedTransformer(object):
662 """Class to transform lines that are explicitly escaped out."""
690 """Class to transform lines that are explicitly escaped out."""
663
691
@@ -694,28 +722,8 b' class EscapedTransformer(object):'
694 # A naked help line should just fire the intro help screen
722 # A naked help line should just fire the intro help screen
695 if not line_info.line[1:]:
723 if not line_info.line[1:]:
696 return 'get_ipython().show_usage()'
724 return 'get_ipython().show_usage()'
697
725
698 # There may be one or two '?' at the end, move them to the front so that
726 return _make_help_call(line_info.fpart, line_info.esc, line_info.lspace)
699 # the rest of the logic can assume escapes are at the start
700 l_ori = line_info
701 line = line_info.line
702 if line.endswith('?'):
703 line = line[-1] + line[:-1]
704 if line.endswith('?'):
705 line = line[-1] + line[:-1]
706 line_info = LineInfo(line)
707
708 # From here on, simply choose which level of detail to get, and
709 # special-case the psearch syntax
710 pinfo = 'pinfo' # default
711 if '*' in line_info.line:
712 pinfo = 'psearch'
713 elif line_info.esc == '??':
714 pinfo = 'pinfo2'
715
716 tpl = '%sget_ipython().magic(u"%s %s")'
717 return tpl % (line_info.lspace, pinfo,
718 ' '.join([line_info.fpart, line_info.rest]).strip())
719
727
720 @staticmethod
728 @staticmethod
721 def _tr_magic(line_info):
729 def _tr_magic(line_info):
@@ -756,14 +764,9 b' class EscapedTransformer(object):'
756 # Get line endpoints, where the escapes can be
764 # Get line endpoints, where the escapes can be
757 line_info = LineInfo(line)
765 line_info = LineInfo(line)
758
766
759 # If the escape is not at the start, only '?' needs to be special-cased.
760 # All other escapes are only valid at the start
761 if not line_info.esc in self.tr:
767 if not line_info.esc in self.tr:
762 if line.endswith(ESC_HELP):
768 # If we don't recognize the escape, don't modify the line
763 return self._tr_help(line_info)
769 return line
764 else:
765 # If we don't recognize the escape, don't modify the line
766 return line
767
770
768 return self.tr[line_info.esc](line_info)
771 return self.tr[line_info.esc](line_info)
769
772
@@ -815,9 +818,9 b' class IPythonInputSplitter(InputSplitter):'
815
818
816 lines_list = lines.splitlines()
819 lines_list = lines.splitlines()
817
820
818 transforms = [transform_escaped, transform_assign_system,
821 transforms = [transform_escaped, transform_help_end,
819 transform_assign_magic, transform_ipy_prompt,
822 transform_assign_system, transform_assign_magic,
820 transform_classic_prompt]
823 transform_ipy_prompt, transform_classic_prompt]
821
824
822 # Transform logic
825 # Transform logic
823 #
826 #
@@ -434,12 +434,21 b' syntax = \\'
434 [ ('?', 'get_ipython().show_usage()'),
434 [ ('?', 'get_ipython().show_usage()'),
435 ('?x1', 'get_ipython().magic(u"pinfo x1")'),
435 ('?x1', 'get_ipython().magic(u"pinfo x1")'),
436 ('??x2', 'get_ipython().magic(u"pinfo2 x2")'),
436 ('??x2', 'get_ipython().magic(u"pinfo2 x2")'),
437 ('x3?', 'get_ipython().magic(u"pinfo x3")'),
437 ('?a.*s', 'get_ipython().magic(u"psearch a.*s")'),
438 ('x4??', 'get_ipython().magic(u"pinfo2 x4")'),
438 ('?%hist', 'get_ipython().magic(u"pinfo %hist")'),
439 ('%hist?', 'get_ipython().magic(u"pinfo %hist")'),
439 ('?abc = qwe', 'get_ipython().magic(u"pinfo abc")'),
440 ('f*?', 'get_ipython().magic(u"psearch f*")'),
441 ('ax.*aspe*?', 'get_ipython().magic(u"psearch ax.*aspe*")'),
442 ],
440 ],
441
442 end_help =
443 [ ('x3?', 'get_ipython().magic(u"pinfo x3")'),
444 ('x4??', 'get_ipython().magic(u"pinfo2 x4")'),
445 ('%hist?', 'get_ipython().magic(u"pinfo %hist")'),
446 ('f*?', 'get_ipython().magic(u"psearch f*")'),
447 ('ax.*aspe*?', 'get_ipython().magic(u"psearch ax.*aspe*")'),
448 ('a = abc?', 'get_ipython().magic(u"pinfo abc")'),
449 ('a = abc.qe??', 'get_ipython().magic(u"pinfo2 abc.qe")'),
450 ('a = *.items?', 'get_ipython().magic(u"psearch *.items")'),
451 ],
443
452
444 # Explicit magic calls
453 # Explicit magic calls
445 escaped_magic =
454 escaped_magic =
@@ -513,7 +522,9 b' def test_ipy_prompt():'
513 transform_checker(syntax['ipy_prompt'], isp.transform_ipy_prompt)
522 transform_checker(syntax['ipy_prompt'], isp.transform_ipy_prompt)
514 for example in syntax_ml['ipy_prompt']:
523 for example in syntax_ml['ipy_prompt']:
515 transform_checker(example, isp.transform_ipy_prompt)
524 transform_checker(example, isp.transform_ipy_prompt)
516
525
526 def test_end_help():
527 transform_checker(syntax['end_help'], isp.transform_help_end)
517
528
518 def test_escaped_noesc():
529 def test_escaped_noesc():
519 transform_checker(syntax['escaped_noesc'], isp.transform_escaped)
530 transform_checker(syntax['escaped_noesc'], isp.transform_escaped)
General Comments 0
You need to be logged in to leave comments. Login now