##// END OF EJS Templates
Create separate class for debugger using prompt_toolkit
Thomas Kluyver -
Show More
@@ -0,0 +1,73 b''
1 from IPython.core.debugger import Pdb
2
3 from IPython.core.completer import IPCompleter
4 from .ptutils import IPythonPTCompleter
5
6 from prompt_toolkit.token import Token
7 from prompt_toolkit.shortcuts import create_prompt_application
8 from prompt_toolkit.interface import CommandLineInterface
9 from prompt_toolkit.enums import EditingMode
10
11 class TerminalPdb(Pdb):
12 def __init__(self, *args, **kwargs):
13 Pdb.__init__(self, *args, **kwargs)
14 self._ptcomp = None
15 self.pt_init()
16
17 def pt_init(self):
18 def get_prompt_tokens(cli):
19 return [(Token.Prompt, self.prompt)]
20
21 if self._ptcomp is None:
22 compl = IPCompleter(shell=self.shell,
23 namespace={},
24 global_namespace={},
25 use_readline=False,
26 parent=self.shell,
27 )
28 self._ptcomp = IPythonPTCompleter(compl)
29
30 self._pt_app = create_prompt_application(
31 editing_mode=getattr(EditingMode, self.shell.editing_mode.upper()),
32 history=self.shell.debugger_history,
33 completer= self._ptcomp,
34 enable_history_search=True,
35 mouse_support=self.shell.mouse_support,
36 get_prompt_tokens=get_prompt_tokens
37 )
38 self.pt_cli = CommandLineInterface(self._pt_app, eventloop=self.shell._eventloop)
39
40 def cmdloop(self, intro=None):
41 """Repeatedly issue a prompt, accept input, parse an initial prefix
42 off the received input, and dispatch to action methods, passing them
43 the remainder of the line as argument.
44
45 override the same methods from cmd.Cmd to provide prompt toolkit replacement.
46 """
47 if not self.use_rawinput:
48 raise ValueError('Sorry ipdb does not support use_rawinput=False')
49
50 self.preloop()
51
52 try:
53 if intro is not None:
54 self.intro = intro
55 if self.intro:
56 self.stdout.write(str(self.intro)+"\n")
57 stop = None
58 while not stop:
59 if self.cmdqueue:
60 line = self.cmdqueue.pop(0)
61 else:
62 self._ptcomp.ipy_completer.namespace = self.curframe_locals
63 self._ptcomp.ipy_completer.global_namespace = self.curframe.f_globals
64 try:
65 line = self.pt_cli.run(reset_current_buffer=True).text
66 except EOFError:
67 line = 'EOF'
68 line = self.precmd(line)
69 stop = self.onecmd(line)
70 stop = self.postcmd(stop, line)
71 self.postloop()
72 except Exception:
73 raise
@@ -34,15 +34,8 b' import sys'
34 34 from IPython import get_ipython
35 35 from IPython.utils import PyColorize, ulinecache
36 36 from IPython.utils import coloransi, py3compat
37 from IPython.core.completer import IPCompleter
38 37 from IPython.core.excolors import exception_colors
39 38 from IPython.testing.skipdoctest import skip_doctest
40 from IPython.terminal.ptutils import IPythonPTCompleter
41
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 39
47 40
48 41 prompt = 'ipdb> '
@@ -251,80 +244,6 b' class Pdb(OldPdb, object):'
251 244
252 245 # Set the prompt - the default prompt is '(Pdb)'
253 246 self.prompt = prompt
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
285
286
287 def cmdloop(self, intro=None):
288 """Repeatedly issue a prompt, accept input, parse an initial prefix
289 off the received input, and dispatch to action methods, passing them
290 the remainder of the line as argument.
291
292 override the same methods from cmd.Cmd to provide prompt toolkit replacement.
293 """
294 if not self.use_prompt_toolkit:
295 return OldPdb.cmdloop(self, intro)
296
297 if not self.use_rawinput:
298 raise ValueError('Sorry ipdb does not support raw_input=False')
299
300
301 self.preloop()
302
303
304 try:
305 if intro is not None:
306 self.intro = intro
307 if self.intro:
308 self.stdout.write(str(self.intro)+"\n")
309 stop = None
310 while not stop:
311 if self.cmdqueue:
312 line = self.cmdqueue.pop(0)
313 else:
314 self._ptcomp.ipy_completer.namespace = self.curframe_locals
315 self._ptcomp.ipy_completer.global_namespace = self.curframe.f_globals
316 try:
317 line = self.pt_cli.run(reset_current_buffer=True).text
318 except EOFError:
319 line = 'EOF'
320 line = self.precmd(line)
321 stop = self.onecmd(line)
322 stop = self.postcmd(stop, line)
323 self.postloop()
324 except Exception:
325 raise
326
327
328 247
329 248 def set_colors(self, scheme):
330 249 """Shorthand access to the color table scheme selector method."""
@@ -42,6 +42,7 b' from IPython.core.autocall import ExitAutocall'
42 42 from IPython.core.builtin_trap import BuiltinTrap
43 43 from IPython.core.events import EventManager, available_events
44 44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
45 from IPython.core.debugger import Pdb
45 46 from IPython.core.display_trap import DisplayTrap
46 47 from IPython.core.displayhook import DisplayHook
47 48 from IPython.core.displaypub import DisplayPublisher
@@ -1584,6 +1585,8 b' class InteractiveShell(SingletonConfigurable):'
1584 1585 # Things related to exception handling and tracebacks (not debugging)
1585 1586 #-------------------------------------------------------------------------
1586 1587
1588 debugger_cls = Pdb
1589
1587 1590 def init_traceback_handlers(self, custom_exceptions):
1588 1591 # Syntax error handler.
1589 1592 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
@@ -1594,7 +1597,8 b' class InteractiveShell(SingletonConfigurable):'
1594 1597 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1595 1598 color_scheme='NoColor',
1596 1599 tb_offset = 1,
1597 check_cache=check_linecache_ipython)
1600 check_cache=check_linecache_ipython,
1601 debugger_cls=self.debugger_cls)
1598 1602
1599 1603 # The instance will store a pointer to the system-wide exception hook,
1600 1604 # so that runtime code (such as magics) can access it. This is because
@@ -809,7 +809,7 b' class VerboseTB(TBTools):'
809 809
810 810 def __init__(self, color_scheme='Linux', call_pdb=False, ostream=None,
811 811 tb_offset=0, long_header=False, include_vars=True,
812 check_cache=None):
812 check_cache=None, debugger_cls = None):
813 813 """Specify traceback offset, headers and color scheme.
814 814
815 815 Define how many frames to drop from the tracebacks. Calling it with
@@ -830,6 +830,8 b' class VerboseTB(TBTools):'
830 830 check_cache = linecache.checkcache
831 831 self.check_cache = check_cache
832 832
833 self.debugger_cls = debugger_cls or debugger.Pdb
834
833 835 def format_records(self, records, last_unique, recursion_repeat):
834 836 """Format the stack frames of the traceback"""
835 837 frames = []
@@ -1217,7 +1219,7 b' class VerboseTB(TBTools):'
1217 1219
1218 1220 if force or self.call_pdb:
1219 1221 if self.pdb is None:
1220 self.pdb = debugger.Pdb(
1222 self.pdb = self.debugger_cls(
1221 1223 self.color_scheme_table.active_scheme_name)
1222 1224 # the system displayhook may have changed, restore the original
1223 1225 # for pdb
@@ -1278,7 +1280,7 b' class FormattedTB(VerboseTB, ListTB):'
1278 1280 def __init__(self, mode='Plain', color_scheme='Linux', call_pdb=False,
1279 1281 ostream=None,
1280 1282 tb_offset=0, long_header=False, include_vars=False,
1281 check_cache=None):
1283 check_cache=None, debugger_cls=None):
1282 1284
1283 1285 # NEVER change the order of this list. Put new modes at the end:
1284 1286 self.valid_modes = ['Plain', 'Context', 'Verbose']
@@ -1287,7 +1289,7 b' class FormattedTB(VerboseTB, ListTB):'
1287 1289 VerboseTB.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb,
1288 1290 ostream=ostream, tb_offset=tb_offset,
1289 1291 long_header=long_header, include_vars=include_vars,
1290 check_cache=check_cache)
1292 check_cache=check_cache, debugger_cls=debugger_cls)
1291 1293
1292 1294 # Different types of tracebacks are joined with different separators to
1293 1295 # form a single string. They are taken from this dict
@@ -26,6 +26,7 b' from prompt_toolkit.styles import PygmentsStyle, DynamicStyle'
26 26 from pygments.styles import get_style_by_name, get_all_styles
27 27 from pygments.token import Token
28 28
29 from .debugger import TerminalPdb
29 30 from .pt_inputhooks import get_inputhook_func
30 31 from .interactiveshell import get_default_editor, TerminalMagics
31 32 from .ptutils import IPythonPTCompleter, IPythonPTLexer
@@ -43,6 +44,7 b' class TerminalInteractiveShell(InteractiveShell):'
43 44
44 45 pt_cli = None
45 46 debugger_history = None
47 debugger_cls = TerminalPdb
46 48
47 49 autoedit_syntax = Bool(False,
48 50 help="auto editing of files with syntax errors.",
General Comments 0
You need to be logged in to leave comments. Login now