From aff028e4e9ff8fca12da0aa530d13a41e62f8d06 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sun, 16 Feb 2014 20:06:32 +0400 Subject: [PATCH] Add support for zsh local themes Still missing: parser state Ref #771 --- powerline/bindings/zsh/__init__.py | 4 +- powerline/bindings/zsh/powerline.zsh | 4 ++ .../colorschemes/shell/default.json | 1 + powerline/config_files/config.json | 6 ++- .../themes/shell/continuation.json | 15 +++++++ .../config_files/themes/shell/select.json | 13 ++++++ powerline/renderers/ipython.py | 6 ++- powerline/renderers/zsh_prompt.py | 43 +++++++++++++++++++ powerline/shell.py | 7 +++ 9 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 powerline/config_files/themes/shell/continuation.json create mode 100644 powerline/config_files/themes/shell/select.json diff --git a/powerline/bindings/zsh/__init__.py b/powerline/bindings/zsh/__init__.py index 5acdc39f..d6f7c523 100644 --- a/powerline/bindings/zsh/__init__.py +++ b/powerline/bindings/zsh/__init__.py @@ -104,10 +104,12 @@ class Prompt(object): self.args = powerline.args def __str__(self): + segment_info = {'args': self.args, 'environ': environ}, r = self.powerline.render( width=zsh.columns(), side=self.side, - segment_info={'args': self.args, 'environ': environ} + segment_info=segment_info, + matcher_info=segment_info, ) if type(r) is not str: if type(r) is bytes: diff --git a/powerline/bindings/zsh/powerline.zsh b/powerline/bindings/zsh/powerline.zsh index 8d23c39e..68c589bb 100644 --- a/powerline/bindings/zsh/powerline.zsh +++ b/powerline/bindings/zsh/powerline.zsh @@ -113,9 +113,13 @@ _powerline_setup_prompt() { zpython 'del _powerline_setup' else local add_args='--last_exit_code=$? --last_pipe_status="$pipestatus"' + add_args+=' --renderer_arg="client_id=$$"' add_args+=' --jobnum=$_POWERLINE_JOBNUM' PS1='$($POWERLINE_COMMAND shell left -r zsh_prompt '$add_args')' RPS1='$($POWERLINE_COMMAND shell right -r zsh_prompt '$add_args')' + PS2='$($POWERLINE_COMMAND shell left -r zsh_prompt -R local_theme=continuation '$add_args')' + RPS2='$($POWERLINE_COMMAND shell right -r zsh_prompt -R local_theme=continuation '$add_args')' + PS3='$($POWERLINE_COMMAND shell left -r zsh_prompt -R local_theme=select '$add_args')' fi } diff --git a/powerline/config_files/colorschemes/shell/default.json b/powerline/config_files/colorschemes/shell/default.json index d4f5a6f2..a9b0742f 100644 --- a/powerline/config_files/colorschemes/shell/default.json +++ b/powerline/config_files/colorschemes/shell/default.json @@ -8,6 +8,7 @@ "branch": { "fg": "gray9", "bg": "gray2" }, "branch_dirty": { "fg": "brightyellow", "bg": "gray2" }, "branch_clean": { "fg": "gray9", "bg": "gray2" }, + "prompt": { "fg": "gray9", "bg": "gray4" }, "cwd": { "fg": "gray9", "bg": "gray4" }, "cwd:current_folder": { "fg": "gray10", "bg": "gray4", "attr": ["bold"] }, "cwd:divider": { "fg": "gray7", "bg": "gray4" }, diff --git a/powerline/config_files/config.json b/powerline/config_files/config.json index 4da4e9b1..b918838d 100644 --- a/powerline/config_files/config.json +++ b/powerline/config_files/config.json @@ -25,7 +25,11 @@ }, "shell": { "colorscheme": "default", - "theme": "default" + "theme": "default", + "local_themes": { + "continuation": "continuation", + "select": "select" + } }, "tmux": { "colorscheme": "default", diff --git a/powerline/config_files/themes/shell/continuation.json b/powerline/config_files/themes/shell/continuation.json new file mode 100644 index 00000000..2b4370de --- /dev/null +++ b/powerline/config_files/themes/shell/continuation.json @@ -0,0 +1,15 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "contents": "", + "width": "auto", + "align": "r", + "highlight_group": ["prompt"] + } + ], + "right": [ + ] + } +} diff --git a/powerline/config_files/themes/shell/select.json b/powerline/config_files/themes/shell/select.json new file mode 100644 index 00000000..cdf0998c --- /dev/null +++ b/powerline/config_files/themes/shell/select.json @@ -0,0 +1,13 @@ +{ + "segments": { + "left": [ + { + "type": "string", + "contents": "Select", + "width": "auto", + "align": "r", + "highlight_group": ["prompt"] + } + ] + } +} diff --git a/powerline/renderers/ipython.py b/powerline/renderers/ipython.py index 8de06dfe..69f38eaa 100644 --- a/powerline/renderers/ipython.py +++ b/powerline/renderers/ipython.py @@ -22,7 +22,11 @@ class IpythonRenderer(ShellRenderer): try: return match['theme'] except KeyError: - match['theme'] = Theme(theme_config=match['config'], top_theme_config=self.theme_config, **self.theme_kwargs) + match['theme'] = Theme( + theme_config=match['config'], + top_theme_config=self.theme_config, + **self.theme_kwargs + ) return match['theme'] def shutdown(self): diff --git a/powerline/renderers/zsh_prompt.py b/powerline/renderers/zsh_prompt.py index 47e76cc3..fcbe3e1c 100644 --- a/powerline/renderers/zsh_prompt.py +++ b/powerline/renderers/zsh_prompt.py @@ -3,6 +3,7 @@ from __future__ import absolute_import, unicode_literals from powerline.renderers.shell import ShellRenderer +from powerline.theme import Theme class ZshPromptRenderer(ShellRenderer): @@ -13,5 +14,47 @@ class ZshPromptRenderer(ShellRenderer): character_translations = ShellRenderer.character_translations.copy() character_translations[ord('%')] = '%%' + old_widths = {} + + def render(self, segment_info, *args, **kwargs): + client_id = segment_info.get('client_id') + key = (client_id, kwargs.get('side')) + kwargs = kwargs.copy() + width = kwargs.pop('width', None) + local_theme = segment_info.get('local_theme') + if client_id and local_theme: + output_raw = False + try: + width = self.old_widths[key] + except KeyError: + pass + else: + output_raw = True + ret = super(ShellRenderer, self).render( + output_raw=output_raw, + width=width, + matcher_info=local_theme, + segment_info=segment_info, + *args, **kwargs + ) + if output_raw: + self.old_widths[key] = len(ret[1]) + ret = ret[0] + return ret + + def get_theme(self, matcher_info): + if not matcher_info: + return self.theme + match = self.local_themes[matcher_info] + try: + return match['theme'] + except KeyError: + match['theme'] = Theme( + theme_config=match['config'], + top_theme_config=self.theme_config, + **self.theme_kwargs + ) + return match['theme'] + renderer = ZshPromptRenderer diff --git a/powerline/shell.py b/powerline/shell.py index 9d7d114c..677f2c49 100644 --- a/powerline/shell.py +++ b/powerline/shell.py @@ -38,6 +38,13 @@ class ShellPowerline(Powerline): else: return super(ShellPowerline, self).get_config_paths() + def get_local_themes(self, local_themes): + if not local_themes: + return {} + + return dict(((key, {'config': self.load_theme_config(val)}) + for key, val in local_themes.items())) + def get_argparser(parser=None, *args, **kwargs): if not parser: