diff --git a/powerline/core.py b/powerline/core.py index 89b8b5de..6f4d5fe7 100644 --- a/powerline/core.py +++ b/powerline/core.py @@ -11,7 +11,7 @@ from powerline.lib import underscore_to_camelcase class Powerline(object): - def __init__(self, ext, renderer_module=None, segment_info=None): + def __init__(self, ext, renderer_module=None, segment_info=None, renderer_options={}): config_home = os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')) config_path = os.path.join(config_home, 'powerline') plugin_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'config_files') @@ -51,8 +51,9 @@ class Powerline(object): except ImportError as e: sys.stderr.write('Error while importing renderer module: {0}\n'.format(e)) sys.exit(1) - self.renderer = Renderer(theme_config, local_themes, theme_kwargs, - term_24bit_colors=self.config.get('term_24bit_colors', False)) + options = {'term_truecolor': self.config.get('term_24bit_colors', False)} + options.update(renderer_options) + self.renderer = Renderer(theme_config, local_themes, theme_kwargs, **options) def add_local_theme(self, key, config): '''Add local themes at runtime (e.g. during vim session). diff --git a/powerline/renderer.py b/powerline/renderer.py index 1b9e90e3..19f50d19 100644 --- a/powerline/renderer.py +++ b/powerline/renderer.py @@ -5,14 +5,11 @@ from powerline.theme import Theme class Renderer(object): - - term_truecolor = False - - def __init__(self, theme_config, local_themes, theme_kwargs, term_24bit_colors=False): + def __init__(self, theme_config, local_themes, theme_kwargs, **options): + self.__dict__.update(options) self.theme = Theme(theme_config=theme_config, **theme_kwargs) self.local_themes = local_themes self.theme_kwargs = theme_kwargs - self.term_truecolor = term_24bit_colors def add_local_theme(self, matcher, theme): if matcher in self.local_themes: diff --git a/powerline/renderers/shell.py b/powerline/renderers/shell.py index 42023ef6..fe3d7a3c 100644 --- a/powerline/renderers/shell.py +++ b/powerline/renderers/shell.py @@ -8,6 +8,8 @@ class ShellRenderer(Renderer): '''Powerline shell segment renderer.''' escape_hl_start = '' escape_hl_end = '' + term_truecolor = False + tmux_escape = False def hlstyle(self, fg=None, bg=None, attr=None): '''Highlight a segment. @@ -45,7 +47,10 @@ class ShellRenderer(Renderer): ansi += [3] elif attr & ATTR_UNDERLINE: ansi += [4] - return self.escape_hl_start + '[{0}m'.format(';'.join(str(attr) for attr in ansi)) + self.escape_hl_end + r = '\033[{0}m'.format(';'.join(str(attr) for attr in ansi)) + if self.tmux_escape: + r = '\033Ptmux;' + r.replace('\033', '\033\033') + '\033\\' + return self.escape_hl_start + r + self.escape_hl_end @staticmethod def escape(string): diff --git a/scripts/powerline b/scripts/powerline index fb2d4bc1..acdcf577 100755 --- a/scripts/powerline +++ b/scripts/powerline @@ -3,6 +3,7 @@ '''Powerline prompt and statusline script.''' import argparse import sys +import json try: from powerline.core import Powerline @@ -11,6 +12,16 @@ except ImportError: sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from powerline.core import Powerline # NOQA +def oval(s): + if '=' not in s: + raise TypeError('Option must look like option=json_value') + if s[0] == '_': + raise ValueError('Option names must not start with `_\'') + idx = s.index('=') + o = s[:idx] + val = json.loads(s[idx+1:]) + return (o, val) + parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('ext', nargs=1) parser.add_argument('side', nargs='?', choices=('left', 'right')) @@ -18,10 +29,11 @@ parser.add_argument('-r', '--renderer_module', metavar='MODULE', type=str) parser.add_argument('-w', '--width', type=int) parser.add_argument('--last_exit_code', metavar='INT', type=int) parser.add_argument('--last_pipe_status', metavar='LIST', default='', type=lambda s: [int(status) for status in s.split()]) +parser.add_argument('-o', '--renderer_option', nargs='*', metavar='OPTION=VALUE', type=oval) if __name__ == '__main__': args = parser.parse_args() - powerline = Powerline(ext=args.ext[0], renderer_module=args.renderer_module, segment_info=args) + powerline = Powerline(ext=args.ext[0], renderer_module=args.renderer_module, segment_info=args, renderer_options=dict(args.renderer_option or {})) rendered = powerline.renderer.render(width=args.width, side=args.side) try: sys.stdout.write(rendered)