diff --git a/powerline/bindings/ipython/post_0_11.py b/powerline/bindings/ipython/post_0_11.py index f91a5aed..1a364e5c 100644 --- a/powerline/bindings/ipython/post_0_11.py +++ b/powerline/bindings/ipython/post_0_11.py @@ -15,28 +15,36 @@ class IpythonInfo(object): class PowerlinePromptManager(PromptManager): - powerline = None - - def __init__(self, powerline, shell): - self.powerline = powerline + def __init__(self, prompt_powerline, non_prompt_powerline, shell): + self.prompt_powerline = prompt_powerline + self.non_prompt_powerline = non_prompt_powerline self.powerline_segment_info = IpythonInfo(shell) self.shell = shell def render(self, name, color=True, *args, **kwargs): 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.width = self.txtwidth return res if color else res_nocolor class ConfigurableIpythonPowerline(IpythonPowerline): - def __init__(self, ip): + def __init__(self, ip, is_prompt): config = ip.config.Powerline self.config_overrides = config.get('config_overrides') self.theme_overrides = config.get('theme_overrides', {}) self.path = config.get('path') - super(ConfigurableIpythonPowerline, self).__init__() + super(ConfigurableIpythonPowerline, self).__init__(is_prompt) old_prompt_manager = None @@ -46,12 +54,18 @@ def load_ipython_extension(ip): global old_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(): - powerline.shutdown() + prompt_powerline.shutdown() + non_prompt_powerline.shutdown() raise TryNext() ip.hooks.shutdown_hook.add(shutdown_hook) diff --git a/powerline/bindings/ipython/pre_0_11.py b/powerline/bindings/ipython/pre_0_11.py index 628c39bc..26356c5d 100644 --- a/powerline/bindings/ipython/pre_0_11.py +++ b/powerline/bindings/ipython/pre_0_11.py @@ -41,8 +41,9 @@ class IpythonInfo(object): 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.other_powerline = other_powerline self.powerline_last_in = powerline_last_in self.powerline_segment_info = IpythonInfo(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 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)) @@ -104,31 +105,33 @@ class PowerlinePrompt2(PowerlinePromptOut): 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.theme_overrides = theme_overrides self.path = path - super(ConfigurableIpythonPowerline, self).__init__() + super(ConfigurableIpythonPowerline, self).__init__(is_prompt) def setup(**kwargs): ip = get_ipython() - powerline = ConfigurableIpythonPowerline(**kwargs) + prompt_powerline = ConfigurableIpythonPowerline(True, **kwargs) + non_prompt_powerline = ConfigurableIpythonPowerline(False, **kwargs) def late_startup_hook(): last_in = {'nrspaces': 0, 'prompt_text_len': None} - for attr, prompt_class in ( - ('prompt1', PowerlinePrompt1), - ('prompt2', PowerlinePrompt2), - ('prompt_out', PowerlinePromptOut) + for attr, prompt_class, powerline, other_powerline in ( + ('prompt1', PowerlinePrompt1, prompt_powerline, non_prompt_powerline), + ('prompt2', PowerlinePrompt2, prompt_powerline, None), + ('prompt_out', PowerlinePromptOut, non_prompt_powerline, None) ): 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() def shutdown_hook(): - powerline.shutdown() + prompt_powerline.shutdown() + non_prompt_powerline.shutdown() raise TryNext() ip.IP.hooks.late_startup_hook.add(late_startup_hook) diff --git a/powerline/ipython.py b/powerline/ipython.py index bed41514..51cc4881 100644 --- a/powerline/ipython.py +++ b/powerline/ipython.py @@ -5,8 +5,12 @@ from powerline.lib import mergedicts class IpythonPowerline(Powerline): - def __init__(self): - super(IpythonPowerline, self).__init__('ipython', use_daemon_threads=True) + def __init__(self, is_prompt): + super(IpythonPowerline, self).__init__( + 'ipython', + renderer_module=('ipython_prompt' if is_prompt else 'ipython'), + use_daemon_threads=True + ) def get_config_paths(self): if self.path: diff --git a/powerline/renderers/ipython.py b/powerline/renderers/ipython.py index 69f38eaa..a2c071cc 100644 --- a/powerline/renderers/ipython.py +++ b/powerline/renderers/ipython.py @@ -6,9 +6,6 @@ from powerline.theme import Theme class IpythonRenderer(ShellRenderer): '''Powerline ipython segment renderer.''' - escape_hl_start = '\x01' - escape_hl_end = '\x02' - def get_segment_info(self, segment_info, mode): r = self.segment_info.copy() r['ipython'] = segment_info diff --git a/powerline/renderers/ipython_prompt.py b/powerline/renderers/ipython_prompt.py new file mode 100644 index 00000000..a1103ec8 --- /dev/null +++ b/powerline/renderers/ipython_prompt.py @@ -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