##// END OF EJS Templates
Fix issue #880 - initialize TryNext with args and kwargs....
Matt Cottingham -
Show More
@@ -1,235 +1,235 b''
1 1 """hooks for IPython.
2 2
3 3 In Python, it is possible to overwrite any method of any object if you really
4 4 want to. But IPython exposes a few 'hooks', methods which are _designed_ to
5 5 be overwritten by users for customization purposes. This module defines the
6 6 default versions of all such hooks, which get used by IPython if not
7 7 overridden by the user.
8 8
9 9 hooks are simple functions, but they should be declared with 'self' as their
10 10 first argument, because when activated they are registered into IPython as
11 11 instance methods. The self argument will be the IPython running instance
12 12 itself, so hooks have full access to the entire IPython object.
13 13
14 14 If you wish to define a new hook and activate it, you need to put the
15 15 necessary code into a python file which can be either imported or execfile()'d
16 16 from within your profile's ipython_config.py configuration.
17 17
18 18 For example, suppose that you have a module called 'myiphooks' in your
19 19 PYTHONPATH, which contains the following definition:
20 20
21 21 import os
22 22 from IPython.core import ipapi
23 23 ip = ipapi.get()
24 24
25 25 def calljed(self,filename, linenum):
26 26 "My editor hook calls the jed editor directly."
27 27 print "Calling my own editor, jed ..."
28 28 if os.system('jed +%d %s' % (linenum,filename)) != 0:
29 29 raise TryNext()
30 30
31 31 ip.set_hook('editor', calljed)
32 32
33 33 You can then enable the functionality by doing 'import myiphooks'
34 34 somewhere in your configuration files or ipython command line.
35 35 """
36 36
37 37 #*****************************************************************************
38 38 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
39 39 #
40 40 # Distributed under the terms of the BSD License. The full license is in
41 41 # the file COPYING, distributed as part of this software.
42 42 #*****************************************************************************
43 43
44 44 import os, bisect
45 45 import sys
46 46
47 47 from IPython.core.error import TryNext
48 48
49 49 # List here all the default hooks. For now it's just the editor functions
50 50 # but over time we'll move here all the public API for user-accessible things.
51 51
52 52 __all__ = ['editor', 'fix_error_editor', 'synchronize_with_editor',
53 53 'input_prefilter', 'shutdown_hook', 'late_startup_hook',
54 54 'generate_prompt', 'show_in_pager','pre_prompt_hook',
55 55 'pre_run_code_hook', 'clipboard_get']
56 56
57 57 def editor(self,filename, linenum=None):
58 58 """Open the default editor at the given filename and linenumber.
59 59
60 60 This is IPython's default editor hook, you can use it as an example to
61 61 write your own modified one. To set your own editor function as the
62 62 new editor hook, call ip.set_hook('editor',yourfunc)."""
63 63
64 64 # IPython configures a default editor at startup by reading $EDITOR from
65 65 # the environment, and falling back on vi (unix) or notepad (win32).
66 66 editor = self.editor
67 67
68 68 # marker for at which line to open the file (for existing objects)
69 69 if linenum is None or editor=='notepad':
70 70 linemark = ''
71 71 else:
72 72 linemark = '+%d' % int(linenum)
73 73
74 74 # Enclose in quotes if necessary and legal
75 75 if ' ' in editor and os.path.isfile(editor) and editor[0] != '"':
76 76 editor = '"%s"' % editor
77 77
78 78 # Call the actual editor
79 79 if os.system('%s %s %s' % (editor,linemark,filename)) != 0:
80 80 raise TryNext()
81 81
82 82 import tempfile
83 83 def fix_error_editor(self,filename,linenum,column,msg):
84 84 """Open the editor at the given filename, linenumber, column and
85 85 show an error message. This is used for correcting syntax errors.
86 86 The current implementation only has special support for the VIM editor,
87 87 and falls back on the 'editor' hook if VIM is not used.
88 88
89 89 Call ip.set_hook('fix_error_editor',youfunc) to use your own function,
90 90 """
91 91 def vim_quickfix_file():
92 92 t = tempfile.NamedTemporaryFile()
93 93 t.write('%s:%d:%d:%s\n' % (filename,linenum,column,msg))
94 94 t.flush()
95 95 return t
96 96 if os.path.basename(self.editor) != 'vim':
97 97 self.hooks.editor(filename,linenum)
98 98 return
99 99 t = vim_quickfix_file()
100 100 try:
101 101 if os.system('vim --cmd "set errorformat=%f:%l:%c:%m" -q ' + t.name):
102 102 raise TryNext()
103 103 finally:
104 104 t.close()
105 105
106 106
107 107 def synchronize_with_editor(self, filename, linenum, column):
108 108 pass
109 109
110 110
111 111 class CommandChainDispatcher:
112 112 """ Dispatch calls to a chain of commands until some func can handle it
113 113
114 114 Usage: instantiate, execute "add" to add commands (with optional
115 115 priority), execute normally via f() calling mechanism.
116 116
117 117 """
118 118 def __init__(self,commands=None):
119 119 if commands is None:
120 120 self.chain = []
121 121 else:
122 122 self.chain = commands
123 123
124 124
125 125 def __call__(self,*args, **kw):
126 126 """ Command chain is called just like normal func.
127 127
128 128 This will call all funcs in chain with the same args as were given to this
129 129 function, and return the result of first func that didn't raise
130 130 TryNext """
131 131
132 132 for prio,cmd in self.chain:
133 133 #print "prio",prio,"cmd",cmd #dbg
134 134 try:
135 135 return cmd(*args, **kw)
136 136 except TryNext, exc:
137 137 if exc.args or exc.kwargs:
138 138 args = exc.args
139 139 kw = exc.kwargs
140 140 # if no function will accept it, raise TryNext up to the caller
141 raise TryNext
141 raise TryNext(*args, **kw)
142 142
143 143 def __str__(self):
144 144 return str(self.chain)
145 145
146 146 def add(self, func, priority=0):
147 147 """ Add a func to the cmd chain with given priority """
148 148 bisect.insort(self.chain,(priority,func))
149 149
150 150 def __iter__(self):
151 151 """ Return all objects in chain.
152 152
153 153 Handy if the objects are not callable.
154 154 """
155 155 return iter(self.chain)
156 156
157 157
158 158 def input_prefilter(self,line):
159 159 """ Default input prefilter
160 160
161 161 This returns the line as unchanged, so that the interpreter
162 162 knows that nothing was done and proceeds with "classic" prefiltering
163 163 (%magics, !shell commands etc.).
164 164
165 165 Note that leading whitespace is not passed to this hook. Prefilter
166 166 can't alter indentation.
167 167
168 168 """
169 169 #print "attempt to rewrite",line #dbg
170 170 return line
171 171
172 172
173 173 def shutdown_hook(self):
174 174 """ default shutdown hook
175 175
176 176 Typically, shotdown hooks should raise TryNext so all shutdown ops are done
177 177 """
178 178
179 179 #print "default shutdown hook ok" # dbg
180 180 return
181 181
182 182
183 183 def late_startup_hook(self):
184 184 """ Executed after ipython has been constructed and configured
185 185
186 186 """
187 187 #print "default startup hook ok" # dbg
188 188
189 189
190 190 def generate_prompt(self, is_continuation):
191 191 """ calculate and return a string with the prompt to display """
192 192 if is_continuation:
193 193 return str(self.displayhook.prompt2)
194 194 return str(self.displayhook.prompt1)
195 195
196 196
197 197 def show_in_pager(self,s):
198 198 """ Run a string through pager """
199 199 # raising TryNext here will use the default paging functionality
200 200 raise TryNext
201 201
202 202
203 203 def pre_prompt_hook(self):
204 204 """ Run before displaying the next prompt
205 205
206 206 Use this e.g. to display output from asynchronous operations (in order
207 207 to not mess up text entry)
208 208 """
209 209
210 210 return None
211 211
212 212
213 213 def pre_run_code_hook(self):
214 214 """ Executed before running the (prefiltered) code in IPython """
215 215 return None
216 216
217 217
218 218 def clipboard_get(self):
219 219 """ Get text from the clipboard.
220 220 """
221 221 from IPython.lib.clipboard import (
222 222 osx_clipboard_get, tkinter_clipboard_get,
223 223 win32_clipboard_get
224 224 )
225 225 if sys.platform == 'win32':
226 226 chain = [win32_clipboard_get, tkinter_clipboard_get]
227 227 elif sys.platform == 'darwin':
228 228 chain = [osx_clipboard_get, tkinter_clipboard_get]
229 229 else:
230 230 chain = [tkinter_clipboard_get]
231 231 dispatcher = CommandChainDispatcher()
232 232 for func in chain:
233 233 dispatcher.add(func)
234 234 text = dispatcher()
235 235 return text
General Comments 0
You need to be logged in to leave comments. Login now