Show More
@@ -0,0 +1,75 b'' | |||||
|
1 | """ Greedy completer extension for IPython | |||
|
2 | ||||
|
3 | Normal tab completer refuses to evaluate nonsafe stuff. This will evaluate | |||
|
4 | everything, so you need to consider the consequences of pressing tab | |||
|
5 | yourself! | |||
|
6 | ||||
|
7 | Note that this extension simplifies readline interaction by setting | |||
|
8 | only whitespace as completer delimiter. If this works well, we will | |||
|
9 | do the same in default completer. | |||
|
10 | ||||
|
11 | """ | |||
|
12 | from IPython import generics,ipapi | |||
|
13 | from IPython.genutils import dir2 | |||
|
14 | ||||
|
15 | def attr_matches(self, text): | |||
|
16 | """Compute matches when text contains a dot. | |||
|
17 | ||||
|
18 | MONKEYPATCHED VERSION (ipy_greedycompleter.py) | |||
|
19 | ||||
|
20 | Assuming the text is of the form NAME.NAME....[NAME], and is | |||
|
21 | evaluatable in self.namespace or self.global_namespace, it will be | |||
|
22 | evaluated and its attributes (as revealed by dir()) are used as | |||
|
23 | possible completions. (For class instances, class members are are | |||
|
24 | also considered.) | |||
|
25 | ||||
|
26 | WARNING: this can still invoke arbitrary C code, if an object | |||
|
27 | with a __getattr__ hook is evaluated. | |||
|
28 | ||||
|
29 | """ | |||
|
30 | import re | |||
|
31 | ||||
|
32 | force_complete = 1 | |||
|
33 | # Another option, seems to work great. Catches things like ''.<tab> | |||
|
34 | m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text) | |||
|
35 | ||||
|
36 | if m: | |||
|
37 | expr, attr = m.group(1, 3) | |||
|
38 | else: | |||
|
39 | # force match - eval anything that ends with colon | |||
|
40 | if not force_complete: | |||
|
41 | return [] | |||
|
42 | ||||
|
43 | m2 = re.match(r"(.+)\.(\w*)$", self.lbuf) | |||
|
44 | if not m2: | |||
|
45 | return [] | |||
|
46 | expr, attr = m2.group(1,2) | |||
|
47 | ||||
|
48 | ||||
|
49 | try: | |||
|
50 | obj = eval(expr, self.namespace) | |||
|
51 | except: | |||
|
52 | try: | |||
|
53 | obj = eval(expr, self.global_namespace) | |||
|
54 | except: | |||
|
55 | return [] | |||
|
56 | ||||
|
57 | words = dir2(obj) | |||
|
58 | ||||
|
59 | try: | |||
|
60 | words = generics.complete_object(obj, words) | |||
|
61 | except ipapi.TryNext: | |||
|
62 | pass | |||
|
63 | # Build match list to return | |||
|
64 | n = len(attr) | |||
|
65 | res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ] | |||
|
66 | return res | |||
|
67 | ||||
|
68 | def main(): | |||
|
69 | import readline | |||
|
70 | readline.set_completer_delims(" \n\t") | |||
|
71 | # monkeypatch - the code will be folded to normal completer later on | |||
|
72 | import IPython.completer | |||
|
73 | IPython.completer.Completer.attr_matches = attr_matches | |||
|
74 | ||||
|
75 | main() No newline at end of file |
@@ -94,8 +94,16 b' def matchorfail(text, pos):' | |||||
94 | match = tokenprog.match(text, pos) |
|
94 | match = tokenprog.match(text, pos) | |
95 | if match is None: |
|
95 | if match is None: | |
96 | raise ItplError(text, pos) |
|
96 | raise ItplError(text, pos) | |
|
97 | ||||
97 | return match, match.end() |
|
98 | return match, match.end() | |
98 |
|
99 | |||
|
100 | try: | |||
|
101 | itpl_encoding = sys.stdin.encoding or 'ascii' | |||
|
102 | except AttributeError: | |||
|
103 | itpl_encoding = 'ascii' | |||
|
104 | ||||
|
105 | ||||
|
106 | ||||
99 | class Itpl: |
|
107 | class Itpl: | |
100 | """Class representing a string with interpolation abilities. |
|
108 | """Class representing a string with interpolation abilities. | |
101 |
|
109 | |||
@@ -104,7 +112,7 b' class Itpl:' | |||||
104 | evaluation and substitution happens in the namespace of the |
|
112 | evaluation and substitution happens in the namespace of the | |
105 | caller when str(instance) is called.""" |
|
113 | caller when str(instance) is called.""" | |
106 |
|
114 | |||
107 |
def __init__(self, format,codec= |
|
115 | def __init__(self, format,codec=itpl_encoding,encoding_errors='backslashreplace'): | |
108 | """The single mandatory argument to this constructor is a format |
|
116 | """The single mandatory argument to this constructor is a format | |
109 | string. |
|
117 | string. | |
110 |
|
118 |
@@ -87,6 +87,11 b' def main():' | |||||
87 | # For bzr completer, requires bzrlib (the python installation of bzr) |
|
87 | # For bzr completer, requires bzrlib (the python installation of bzr) | |
88 | #ip.load('ipy_bzr') |
|
88 | #ip.load('ipy_bzr') | |
89 |
|
89 | |||
|
90 | # Tab completer that is not quite so picky (i.e. | |||
|
91 | # "foo".<TAB> and str(2).<TAB> will work). Complete | |||
|
92 | # at your own risk! | |||
|
93 | #import ipy_greedycompleter | |||
|
94 | ||||
90 |
|
95 | |||
91 |
|
96 | |||
92 | # some config helper functions you can use |
|
97 | # some config helper functions you can use |
@@ -1,3 +1,10 b'' | |||||
|
1 | 2008-05-14 Ville Vainio <vivainio@gmail.com> | |||
|
2 | ||||
|
3 | * Extensions/ipy_greedycompleter.py: | |||
|
4 | New extension that enables a bit more "relaxed" tab | |||
|
5 | completer that evaluates code without safety checks | |||
|
6 | (i.e. there can be side effects like function calls) | |||
|
7 | ||||
1 | 2008-04-20 Ville Vainio <vivainio@gmail.com> |
|
8 | 2008-04-20 Ville Vainio <vivainio@gmail.com> | |
2 |
|
9 | |||
3 | * Extensions/ipy_lookfor.py: add %lookfor magic command |
|
10 | * Extensions/ipy_lookfor.py: add %lookfor magic command |
@@ -13,9 +13,43 b" if sys.platform != 'win32':" | |||||
13 | # Produce pdf. |
|
13 | # Produce pdf. | |
14 | os.chdir('build/latex') |
|
14 | os.chdir('build/latex') | |
15 |
|
15 | |||
16 |
# Change chapter style to section style: allows chapters to start on |
|
16 | # Change chapter style to section style: allows chapters to start on | |
|
17 | # the current page. Works much better for the short chapters we have. | |||
|
18 | # This must go in the class file rather than the preamble, so we modify | |||
|
19 | # manual.cls at runtime. | |||
|
20 | chapter_cmds=r''' | |||
|
21 | % Local changes. | |||
|
22 | \renewcommand\chapter{ | |||
|
23 | \thispagestyle{plain} | |||
|
24 | \global\@topnum\z@ | |||
|
25 | \@afterindentfalse | |||
|
26 | \secdef\@chapter\@schapter | |||
|
27 | } | |||
|
28 | \def\@makechapterhead#1{ | |||
|
29 | \vspace*{10\p@} | |||
|
30 | {\raggedright \reset@font \Huge \bfseries \thechapter \quad #1} | |||
|
31 | \par\nobreak | |||
|
32 | \hrulefill | |||
|
33 | \par\nobreak | |||
|
34 | \vspace*{10\p@} | |||
|
35 | } | |||
|
36 | \def\@makeschapterhead#1{ | |||
|
37 | \vspace*{10\p@} | |||
|
38 | {\raggedright \reset@font \Huge \bfseries #1} | |||
|
39 | \par\nobreak | |||
|
40 | \hrulefill | |||
|
41 | \par\nobreak | |||
|
42 | \vspace*{10\p@} | |||
|
43 | } | |||
|
44 | ''' | |||
|
45 | ||||
|
46 | unmodified=True | |||
17 | for line in fileinput.FileInput('manual.cls',inplace=1): |
|
47 | for line in fileinput.FileInput('manual.cls',inplace=1): | |
18 | line=line.replace('py@OldChapter=\chapter','py@OldChapter=\section') |
|
48 | if 'Support for module synopsis' in line and unmodified: | |
|
49 | line=chapter_cmds+line | |||
|
50 | elif 'makechapterhead' in line: | |||
|
51 | # Already have altered manual.cls: don't need to again. | |||
|
52 | unmodified=False | |||
19 | print line, |
|
53 | print line, | |
20 |
|
54 | |||
21 | # Copying the makefile produced by sphinx... |
|
55 | # Copying the makefile produced by sphinx... |
@@ -123,7 +123,7 b" latex_font_size = '10pt'" | |||||
123 | latex_documents = [('ipython','ipython.tex','IPython Documentation','IPython developers','manual')] |
|
123 | latex_documents = [('ipython','ipython.tex','IPython Documentation','IPython developers','manual')] | |
124 |
|
124 | |||
125 | # Additional stuff for the LaTeX preamble. |
|
125 | # Additional stuff for the LaTeX preamble. | |
126 | latex_preamble = '\\def\\thesection{\\arabic{section}}' |
|
126 | #latex_preamble = '' | |
127 |
|
127 | |||
128 | # Documents to append as an appendix to all manuals. |
|
128 | # Documents to append as an appendix to all manuals. | |
129 | #latex_appendices = [] |
|
129 | #latex_appendices = [] |
General Comments 0
You need to be logged in to leave comments.
Login now