mirror of
https://github.com/powerline/powerline.git
synced 2025-07-22 13:25:13 +02:00
Merge pull request #961 from ZyX-I/fix-664
Do not output \x01/\x02 symbols for non-prompts in ipython
This commit is contained in:
commit
ac6b9af246
@ -15,28 +15,36 @@ class IpythonInfo(object):
|
|||||||
|
|
||||||
|
|
||||||
class PowerlinePromptManager(PromptManager):
|
class PowerlinePromptManager(PromptManager):
|
||||||
powerline = None
|
def __init__(self, prompt_powerline, non_prompt_powerline, shell):
|
||||||
|
self.prompt_powerline = prompt_powerline
|
||||||
def __init__(self, powerline, shell):
|
self.non_prompt_powerline = non_prompt_powerline
|
||||||
self.powerline = powerline
|
|
||||||
self.powerline_segment_info = IpythonInfo(shell)
|
self.powerline_segment_info = IpythonInfo(shell)
|
||||||
self.shell = shell
|
self.shell = shell
|
||||||
|
|
||||||
def render(self, name, color=True, *args, **kwargs):
|
def render(self, name, color=True, *args, **kwargs):
|
||||||
width = None if name == 'in' else self.width
|
width = None if name == 'in' else self.width
|
||||||
res, res_nocolor = self.powerline.render(output_raw=True, width=width, matcher_info=name, segment_info=self.powerline_segment_info)
|
if name == 'out' or name == 'rewrite':
|
||||||
|
powerline = self.non_prompt_powerline
|
||||||
|
else:
|
||||||
|
powerline = self.prompt_powerline
|
||||||
|
res, res_nocolor = powerline.render(
|
||||||
|
output_raw=True,
|
||||||
|
width=width,
|
||||||
|
matcher_info=name,
|
||||||
|
segment_info=self.powerline_segment_info,
|
||||||
|
)
|
||||||
self.txtwidth = len(res_nocolor)
|
self.txtwidth = len(res_nocolor)
|
||||||
self.width = self.txtwidth
|
self.width = self.txtwidth
|
||||||
return res if color else res_nocolor
|
return res if color else res_nocolor
|
||||||
|
|
||||||
|
|
||||||
class ConfigurableIpythonPowerline(IpythonPowerline):
|
class ConfigurableIpythonPowerline(IpythonPowerline):
|
||||||
def __init__(self, ip):
|
def __init__(self, ip, is_prompt):
|
||||||
config = ip.config.Powerline
|
config = ip.config.Powerline
|
||||||
self.config_overrides = config.get('config_overrides')
|
self.config_overrides = config.get('config_overrides')
|
||||||
self.theme_overrides = config.get('theme_overrides', {})
|
self.theme_overrides = config.get('theme_overrides', {})
|
||||||
self.path = config.get('path')
|
self.path = config.get('path')
|
||||||
super(ConfigurableIpythonPowerline, self).__init__()
|
super(ConfigurableIpythonPowerline, self).__init__(is_prompt)
|
||||||
|
|
||||||
|
|
||||||
old_prompt_manager = None
|
old_prompt_manager = None
|
||||||
@ -46,12 +54,18 @@ def load_ipython_extension(ip):
|
|||||||
global old_prompt_manager
|
global old_prompt_manager
|
||||||
|
|
||||||
old_prompt_manager = ip.prompt_manager
|
old_prompt_manager = ip.prompt_manager
|
||||||
powerline = ConfigurableIpythonPowerline(ip)
|
prompt_powerline = ConfigurableIpythonPowerline(ip, True)
|
||||||
|
non_prompt_powerline = ConfigurableIpythonPowerline(ip, False)
|
||||||
|
|
||||||
ip.prompt_manager = PowerlinePromptManager(powerline=powerline, shell=ip.prompt_manager.shell)
|
ip.prompt_manager = PowerlinePromptManager(
|
||||||
|
prompt_powerline=prompt_powerline,
|
||||||
|
non_prompt_powerline=non_prompt_powerline,
|
||||||
|
shell=ip.prompt_manager.shell
|
||||||
|
)
|
||||||
|
|
||||||
def shutdown_hook():
|
def shutdown_hook():
|
||||||
powerline.shutdown()
|
prompt_powerline.shutdown()
|
||||||
|
non_prompt_powerline.shutdown()
|
||||||
raise TryNext()
|
raise TryNext()
|
||||||
|
|
||||||
ip.hooks.shutdown_hook.add(shutdown_hook)
|
ip.hooks.shutdown_hook.add(shutdown_hook)
|
||||||
|
@ -41,8 +41,9 @@ class IpythonInfo(object):
|
|||||||
|
|
||||||
|
|
||||||
class PowerlinePrompt(BasePrompt):
|
class PowerlinePrompt(BasePrompt):
|
||||||
def __init__(self, powerline, powerline_last_in, old_prompt):
|
def __init__(self, powerline, other_powerline, powerline_last_in, old_prompt):
|
||||||
self.powerline = powerline
|
self.powerline = powerline
|
||||||
|
self.other_powerline = other_powerline
|
||||||
self.powerline_last_in = powerline_last_in
|
self.powerline_last_in = powerline_last_in
|
||||||
self.powerline_segment_info = IpythonInfo(old_prompt.cache)
|
self.powerline_segment_info = IpythonInfo(old_prompt.cache)
|
||||||
self.cache = old_prompt.cache
|
self.cache = old_prompt.cache
|
||||||
@ -85,7 +86,7 @@ class PowerlinePrompt1(PowerlinePrompt):
|
|||||||
self.powerline_last_in['prompt_text_len'] = self.prompt_text_len
|
self.powerline_last_in['prompt_text_len'] = self.prompt_text_len
|
||||||
|
|
||||||
def auto_rewrite(self):
|
def auto_rewrite(self):
|
||||||
return RewriteResult(self.powerline.render(matcher_info='rewrite', width=self.prompt_text_len, segment_info=self.powerline_segment_info)
|
return RewriteResult(self.other_powerline.render(matcher_info='rewrite', width=self.prompt_text_len, segment_info=self.powerline_segment_info)
|
||||||
+ (' ' * self.nrspaces))
|
+ (' ' * self.nrspaces))
|
||||||
|
|
||||||
|
|
||||||
@ -104,31 +105,33 @@ class PowerlinePrompt2(PowerlinePromptOut):
|
|||||||
|
|
||||||
|
|
||||||
class ConfigurableIpythonPowerline(IpythonPowerline):
|
class ConfigurableIpythonPowerline(IpythonPowerline):
|
||||||
def __init__(self, config_overrides=None, theme_overrides={}, path=None):
|
def __init__(self, is_prompt, config_overrides=None, theme_overrides={}, path=None):
|
||||||
self.config_overrides = config_overrides
|
self.config_overrides = config_overrides
|
||||||
self.theme_overrides = theme_overrides
|
self.theme_overrides = theme_overrides
|
||||||
self.path = path
|
self.path = path
|
||||||
super(ConfigurableIpythonPowerline, self).__init__()
|
super(ConfigurableIpythonPowerline, self).__init__(is_prompt)
|
||||||
|
|
||||||
|
|
||||||
def setup(**kwargs):
|
def setup(**kwargs):
|
||||||
ip = get_ipython()
|
ip = get_ipython()
|
||||||
|
|
||||||
powerline = ConfigurableIpythonPowerline(**kwargs)
|
prompt_powerline = ConfigurableIpythonPowerline(True, **kwargs)
|
||||||
|
non_prompt_powerline = ConfigurableIpythonPowerline(False, **kwargs)
|
||||||
|
|
||||||
def late_startup_hook():
|
def late_startup_hook():
|
||||||
last_in = {'nrspaces': 0, 'prompt_text_len': None}
|
last_in = {'nrspaces': 0, 'prompt_text_len': None}
|
||||||
for attr, prompt_class in (
|
for attr, prompt_class, powerline, other_powerline in (
|
||||||
('prompt1', PowerlinePrompt1),
|
('prompt1', PowerlinePrompt1, prompt_powerline, non_prompt_powerline),
|
||||||
('prompt2', PowerlinePrompt2),
|
('prompt2', PowerlinePrompt2, prompt_powerline, None),
|
||||||
('prompt_out', PowerlinePromptOut)
|
('prompt_out', PowerlinePromptOut, non_prompt_powerline, None)
|
||||||
):
|
):
|
||||||
old_prompt = getattr(ip.IP.outputcache, attr)
|
old_prompt = getattr(ip.IP.outputcache, attr)
|
||||||
setattr(ip.IP.outputcache, attr, prompt_class(powerline, last_in, old_prompt))
|
setattr(ip.IP.outputcache, attr, prompt_class(powerline, other_powerline, last_in, old_prompt))
|
||||||
raise TryNext()
|
raise TryNext()
|
||||||
|
|
||||||
def shutdown_hook():
|
def shutdown_hook():
|
||||||
powerline.shutdown()
|
prompt_powerline.shutdown()
|
||||||
|
non_prompt_powerline.shutdown()
|
||||||
raise TryNext()
|
raise TryNext()
|
||||||
|
|
||||||
ip.IP.hooks.late_startup_hook.add(late_startup_hook)
|
ip.IP.hooks.late_startup_hook.add(late_startup_hook)
|
||||||
|
@ -5,8 +5,12 @@ from powerline.lib import mergedicts
|
|||||||
|
|
||||||
|
|
||||||
class IpythonPowerline(Powerline):
|
class IpythonPowerline(Powerline):
|
||||||
def __init__(self):
|
def __init__(self, is_prompt):
|
||||||
super(IpythonPowerline, self).__init__('ipython', use_daemon_threads=True)
|
super(IpythonPowerline, self).__init__(
|
||||||
|
'ipython',
|
||||||
|
renderer_module=('ipython_prompt' if is_prompt else 'ipython'),
|
||||||
|
use_daemon_threads=True
|
||||||
|
)
|
||||||
|
|
||||||
def get_config_paths(self):
|
def get_config_paths(self):
|
||||||
if self.path:
|
if self.path:
|
||||||
|
@ -6,9 +6,6 @@ from powerline.theme import Theme
|
|||||||
|
|
||||||
class IpythonRenderer(ShellRenderer):
|
class IpythonRenderer(ShellRenderer):
|
||||||
'''Powerline ipython segment renderer.'''
|
'''Powerline ipython segment renderer.'''
|
||||||
escape_hl_start = '\x01'
|
|
||||||
escape_hl_end = '\x02'
|
|
||||||
|
|
||||||
def get_segment_info(self, segment_info, mode):
|
def get_segment_info(self, segment_info, mode):
|
||||||
r = self.segment_info.copy()
|
r = self.segment_info.copy()
|
||||||
r['ipython'] = segment_info
|
r['ipython'] = segment_info
|
||||||
|
12
powerline/renderers/ipython_prompt.py
Normal file
12
powerline/renderers/ipython_prompt.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# vim:fileencoding=utf-8:noet
|
||||||
|
|
||||||
|
from powerline.renderers.ipython import IpythonRenderer
|
||||||
|
|
||||||
|
|
||||||
|
class IpythonPromptRenderer(IpythonRenderer):
|
||||||
|
'''Powerline ipython prompt renderer'''
|
||||||
|
escape_hl_start = '\x01'
|
||||||
|
escape_hl_end = '\x02'
|
||||||
|
|
||||||
|
|
||||||
|
renderer = IpythonPromptRenderer
|
@ -116,9 +116,14 @@ class TestConfig(TestCase):
|
|||||||
config_overrides = None
|
config_overrides = None
|
||||||
theme_overrides = {}
|
theme_overrides = {}
|
||||||
|
|
||||||
with IpyPowerline() as powerline:
|
segment_info = Args(prompt_count=1)
|
||||||
segment_info = Args(prompt_count=1)
|
|
||||||
for prompt_type in ['in', 'in2', 'out', 'rewrite']:
|
with IpyPowerline(True) as powerline:
|
||||||
|
for prompt_type in ['in', 'in2']:
|
||||||
|
powerline.render(matcher_info=prompt_type, segment_info=segment_info)
|
||||||
|
powerline.render(matcher_info=prompt_type, segment_info=segment_info)
|
||||||
|
with IpyPowerline(False) as powerline:
|
||||||
|
for prompt_type in ['out', 'rewrite']:
|
||||||
powerline.render(matcher_info=prompt_type, segment_info=segment_info)
|
powerline.render(matcher_info=prompt_type, segment_info=segment_info)
|
||||||
powerline.render(matcher_info=prompt_type, segment_info=segment_info)
|
powerline.render(matcher_info=prompt_type, segment_info=segment_info)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user