##// END OF EJS Templates
Reuse CLI in between pdb prompts...
Matthias Bussonnier -
Show More
@@ -39,8 +39,11 b' from IPython.core.excolors import exception_colors'
39 39 from IPython.testing.skipdoctest import skip_doctest
40 40 from IPython.terminal.ptutils import IPythonPTCompleter
41 41
42 from prompt_toolkit import prompt as ptk_prompt
43 42 from prompt_toolkit.token import Token
43 from prompt_toolkit.shortcuts import create_prompt_application
44 from prompt_toolkit.interface import CommandLineInterface
45 from prompt_toolkit.enums import EditingMode
46
44 47
45 48 prompt = 'ipdb> '
46 49
@@ -204,7 +207,7 b' class Pdb(OldPdb, object):'
204 207 except (TypeError, ValueError):
205 208 raise ValueError("Context must be a positive integer")
206 209
207 OldPdb.__init__(self,completekey,stdin,stdout)
210 OldPdb.__init__(self, completekey, stdin, stdout)
208 211
209 212 # IPython changes...
210 213 self.shell = get_ipython()
@@ -217,7 +220,6 b' class Pdb(OldPdb, object):'
217 220
218 221 # This is icky, but I'm not currently sure how best to test if we're
219 222 # in a terminal shell using prompt_toolkit
220 self.use_prompt_toolkit = hasattr(self.shell, 'pt_cli')
221 223
222 224 self.aliases = {}
223 225
@@ -250,6 +252,36 b' class Pdb(OldPdb, object):'
250 252 # Set the prompt - the default prompt is '(Pdb)'
251 253 self.prompt = prompt
252 254 self._ptcomp = None
255 self.pt_init()
256
257 def pt_init(self):
258 self.use_prompt_toolkit = hasattr(self.shell, 'pt_cli')
259
260 if not self.use_prompt_toolkit:
261 return
262
263 def get_prompt_tokens(cli):
264 return [(Token.Prompt, self.prompt)]
265
266 if self._ptcomp is None:
267 compl = IPCompleter(shell=self.shell,
268 namespace={},
269 global_namespace={},
270 use_readline=False,
271 parent=self.shell,
272 )
273 self._ptcomp = IPythonPTCompleter(compl)
274
275 self._pt_app = create_prompt_application(
276 editing_mode=getattr(EditingMode, self.shell.editing_mode.upper()),
277 history=self.shell.debugger_history,
278 completer= self._ptcomp,
279 enable_history_search=True,
280 mouse_support=self.shell.mouse_support,
281 get_prompt_tokens=get_prompt_tokens
282 )
283 self.pt_cli = CommandLineInterface(self._pt_app, eventloop=self.shell._eventloop)
284
253 285
254 286
255 287 def cmdloop(self, intro=None):
@@ -265,19 +297,9 b' class Pdb(OldPdb, object):'
265 297 if not self.use_rawinput:
266 298 raise ValueError('Sorry ipdb does not support raw_input=False')
267 299
268 def get_prompt_tokens(cli):
269 return [(Token.Prompt, self.prompt)]
270 300
271 301 self.preloop()
272 302
273 if self._ptcomp is None:
274 compl = IPCompleter(shell=self.shell,
275 namespace=self.curframe_locals,
276 global_namespace=self.curframe.f_globals,
277 use_readline=False,
278 parent=self.shell,
279 )
280 self._ptcomp = IPythonPTCompleter(compl)
281 303
282 304 try:
283 305 if intro is not None:
@@ -292,10 +314,7 b' class Pdb(OldPdb, object):'
292 314 self._ptcomp.ipy_completer.namespace = self.curframe_locals
293 315 self._ptcomp.ipy_completer.global_namespace = self.curframe.f_globals
294 316 try:
295 line = ptk_prompt(get_prompt_tokens=get_prompt_tokens,
296 history=self.shell.debugger_history,
297 completer=self._ptcomp
298 )
317 line = self.pt_cli.run(reset_current_buffer=True).text
299 318 except EOFError:
300 319 line = 'EOF'
301 320 line = self.precmd(line)
@@ -303,7 +322,7 b' class Pdb(OldPdb, object):'
303 322 stop = self.postcmd(stop, line)
304 323 self.postloop()
305 324 except Exception:
306 pass
325 raise
307 326
308 327
309 328
General Comments 0
You need to be logged in to leave comments. Login now