mirror of
https://github.com/powerline/powerline.git
synced 2025-07-27 07:44:36 +02:00
Add support for pdb prompt
Note: pdbpp is not supported, it has lots of problems with unicode<-->str conversion (either explicit or implicit).
This commit is contained in:
parent
7250cd4bd8
commit
9bbec772e0
@ -469,6 +469,12 @@ Ipython
|
|||||||
Attribute ``prompt_count`` contains the so-called “history count”
|
Attribute ``prompt_count`` contains the so-called “history count”
|
||||||
(equivalent to ``\N`` in ``in_template``).
|
(equivalent to ``\N`` in ``in_template``).
|
||||||
|
|
||||||
|
Pdb
|
||||||
|
---
|
||||||
|
|
||||||
|
``pdb``
|
||||||
|
Currently active :py:class:`pdb.Pdb` instance.
|
||||||
|
|
||||||
Segment class
|
Segment class
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
@ -124,3 +124,30 @@ the used profile:
|
|||||||
|
|
||||||
IPython=0.11* is not supported and does not work. IPython<0.10 was not
|
IPython=0.11* is not supported and does not work. IPython<0.10 was not
|
||||||
tested (not installable by pip).
|
tested (not installable by pip).
|
||||||
|
|
||||||
|
PDB prompt
|
||||||
|
==========
|
||||||
|
|
||||||
|
To use Powerline with PDB prompt you need to use custom class. Inherit your
|
||||||
|
class from :py:class:`pdb.Pdb` and decorate it with
|
||||||
|
:py:func:`powerline.bindings.pdb.use_powerline_prompt`:
|
||||||
|
|
||||||
|
.. code-block:: Python
|
||||||
|
|
||||||
|
import pdb
|
||||||
|
|
||||||
|
from powerline.bindings.pdb import use_powerline_prompt
|
||||||
|
|
||||||
|
@use_powerline_prompt
|
||||||
|
class MyPdb(pdb.Pdb):
|
||||||
|
pass
|
||||||
|
|
||||||
|
MyPdb.run('some.code.to.debug()')
|
||||||
|
|
||||||
|
. Alternatively you may use
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
python -mpowerline.bindings.pdb path/to/script.py
|
||||||
|
|
||||||
|
just like you used ``python -m pdb``.
|
||||||
|
54
powerline/bindings/pdb/__init__.py
Normal file
54
powerline/bindings/pdb/__init__.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
# vim:fileencoding=utf-8:noet
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||||
|
|
||||||
|
from powerline.pdb import PDBPowerline
|
||||||
|
from powerline.lib.encoding import get_preferred_output_encoding
|
||||||
|
|
||||||
|
|
||||||
|
def use_powerline_prompt(cls):
|
||||||
|
'''Decorator that installs powerline prompt to the class
|
||||||
|
|
||||||
|
:param pdb.Pdb cls:
|
||||||
|
Class that should be decorated.
|
||||||
|
|
||||||
|
:return:
|
||||||
|
``cls`` argument or a class derived from it. Latter is used to turn
|
||||||
|
old-style classes into new-style classes.
|
||||||
|
'''
|
||||||
|
encoding = get_preferred_output_encoding()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def prompt(self):
|
||||||
|
try:
|
||||||
|
powerline = self.powerline
|
||||||
|
except AttributeError:
|
||||||
|
powerline = PDBPowerline()
|
||||||
|
powerline.setup(self)
|
||||||
|
self.powerline = powerline
|
||||||
|
ret = powerline.render(side='left')
|
||||||
|
if not isinstance(ret, str):
|
||||||
|
# Python-2
|
||||||
|
ret = ret.encode(encoding)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
@prompt.setter
|
||||||
|
def prompt(self, _):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@prompt.deleter
|
||||||
|
def prompt(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not hasattr(cls, '__class__'):
|
||||||
|
# Old-style class: make it new-style or @property will not work.
|
||||||
|
old_cls = cls
|
||||||
|
|
||||||
|
class cls(cls, object):
|
||||||
|
__module__ = cls.__module__
|
||||||
|
__doc__ = cls.__doc__
|
||||||
|
|
||||||
|
cls.__name__ = old_cls.__name__
|
||||||
|
|
||||||
|
cls.prompt = prompt
|
||||||
|
|
||||||
|
return cls
|
29
powerline/bindings/pdb/__main__.py
Executable file
29
powerline/bindings/pdb/__main__.py
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim:fileencoding=utf-8:noet
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||||
|
|
||||||
|
import pdb
|
||||||
|
|
||||||
|
from powerline.bindings.pdb import use_powerline_prompt
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
'''Run module as a script
|
||||||
|
|
||||||
|
Uses :py:func:`pdb.main` function directly, but prior to that it mocks
|
||||||
|
:py:class:`pdb.Pdb` class with powerline-specific class instance.
|
||||||
|
'''
|
||||||
|
orig_pdb = pdb.Pdb
|
||||||
|
|
||||||
|
@use_powerline_prompt
|
||||||
|
class Pdb(pdb.Pdb, object):
|
||||||
|
def __init__(self):
|
||||||
|
orig_pdb.__init__(self)
|
||||||
|
|
||||||
|
pdb.Pdb = Pdb
|
||||||
|
|
||||||
|
return pdb.main()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -12,6 +12,10 @@
|
|||||||
"in2": "in2"
|
"in2": "in2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pdb": {
|
||||||
|
"colorscheme": "default",
|
||||||
|
"theme": "default"
|
||||||
|
},
|
||||||
"shell": {
|
"shell": {
|
||||||
"colorscheme": "default",
|
"colorscheme": "default",
|
||||||
"theme": "default",
|
"theme": "default",
|
||||||
|
21
powerline/config_files/themes/pdb/default.json
Normal file
21
powerline/config_files/themes/pdb/default.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"segments": {
|
||||||
|
"left": [
|
||||||
|
{
|
||||||
|
"function": "powerline.segments.common.env.virtualenv",
|
||||||
|
"priority": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"contents": "In [",
|
||||||
|
"draw_soft_divider": false,
|
||||||
|
"highlight_groups": ["virtualenv"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"contents": "]",
|
||||||
|
"highlight_groups": ["virtualenv"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
19
powerline/pdb.py
Normal file
19
powerline/pdb.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# vim:fileencoding=utf-8:noet
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||||
|
|
||||||
|
from powerline import Powerline
|
||||||
|
|
||||||
|
|
||||||
|
class PDBPowerline(Powerline):
|
||||||
|
'''PDB-specific powerline bindings
|
||||||
|
'''
|
||||||
|
def init(self, **kwargs):
|
||||||
|
return super(PDBPowerline, self).init(
|
||||||
|
ext='pdb',
|
||||||
|
renderer_module='pdb',
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
def do_setup(self, pdb):
|
||||||
|
self.update_renderer()
|
||||||
|
self.renderer.set_pdb(pdb)
|
34
powerline/renderers/pdb.py
Normal file
34
powerline/renderers/pdb.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# vim:fileencoding=utf-8:noet
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||||
|
|
||||||
|
from powerline.renderers.shell.readline import ReadlineRenderer
|
||||||
|
from powerline.renderer import Renderer
|
||||||
|
|
||||||
|
|
||||||
|
class PDBRenderer(ReadlineRenderer):
|
||||||
|
'''PDB-specific powerline renderer
|
||||||
|
'''
|
||||||
|
pdb = None
|
||||||
|
|
||||||
|
def get_segment_info(self, segment_info, mode):
|
||||||
|
r = self.segment_info.copy()
|
||||||
|
r['pdb'] = self.pdb
|
||||||
|
return r
|
||||||
|
|
||||||
|
def set_pdb(self, pdb):
|
||||||
|
'''Record currently used :py:class:`pdb.Pdb` instance
|
||||||
|
|
||||||
|
Must be called before first calling :py:meth:`render` method.
|
||||||
|
|
||||||
|
:param pdb.Pdb pdb:
|
||||||
|
Used :py:class:`pdb.Pdb` instance. This instance will later be used
|
||||||
|
by :py:meth:`get_segment_info` for patching :ref:`segment_info
|
||||||
|
<dev-segments-info>` dictionary.
|
||||||
|
'''
|
||||||
|
self.pdb = pdb
|
||||||
|
|
||||||
|
def render(self, **kwargs):
|
||||||
|
return Renderer.render(self, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
renderer = PDBRenderer
|
Loading…
x
Reference in New Issue
Block a user