From 1a5bbbea9634e848211ee393c197ff98d90f48f0 Mon Sep 17 00:00:00 2001 From: ZyX Date: Thu, 4 Sep 2014 22:20:21 +0400 Subject: [PATCH] Replace segment-local modes with highlight_group_prefix option Fixes #1046 --- docs/source/develop/listers.rst | 5 --- docs/source/develop/segments.rst | 9 ++-- .../colorschemes/vim/__main__.json | 11 ++++- .../colorschemes/vim/default.json | 42 ++----------------- .../colorschemes/vim/solarized.json | 20 --------- .../colorschemes/vim/solarizedlight.json | 20 --------- powerline/listers/vim.py | 30 +++++++------ powerline/segment.py | 27 ++++++------ powerline/theme.py | 1 - tests/test_tabline.vim | 6 +-- 10 files changed, 51 insertions(+), 120 deletions(-) diff --git a/docs/source/develop/listers.rst b/docs/source/develop/listers.rst index 85513718..37917fe2 100644 --- a/docs/source/develop/listers.rst +++ b/docs/source/develop/listers.rst @@ -40,11 +40,6 @@ resulting segment. In addition to :ref:`usual keys that describe segment ` the following keys may be present (it is advised that *only* the following keys will be used): -.. _dev-listers-mode: - -``mode`` - Segment-specific mode. Used to alter segment highlighting. - ``priority_multiplier`` Value (usually a ``float``) used to multiply segment priority. It is useful for finer-grained controlling which segments disappear first: e.g. when diff --git a/docs/source/develop/segments.rst b/docs/source/develop/segments.rst index 55838ae7..6454caa8 100644 --- a/docs/source/develop/segments.rst +++ b/docs/source/develop/segments.rst @@ -228,6 +228,12 @@ Segment dictionary contains the following keys: ``highlight_group``, ``divider_highlight_group`` Used highlight groups. May be ``None``. + ``highlight_group_prefix`` + If this key is present then given prefix will be prepended to each highlight + group (both regular and divider) used by this segment in a form + ``{prefix}:{group}`` (note the colon). This key is mostly useful for + :ref:`segment listers `. + .. _dev-segments-seg-around: ``before``, ``after`` @@ -281,9 +287,6 @@ Segment dictionary contains the following keys: ``shutdown`` :ref:`Shutdown function `. Accepts no argument. - ``mode`` - :ref:`Segment-specific mode `. May be ``None``. - Segments layout =============== diff --git a/powerline/config_files/colorschemes/vim/__main__.json b/powerline/config_files/colorschemes/vim/__main__.json index e7d995b8..6adb61ce 100644 --- a/powerline/config_files/colorschemes/vim/__main__.json +++ b/powerline/config_files/colorschemes/vim/__main__.json @@ -17,6 +17,15 @@ "many_tabs": "line_current", "bufnr": "file_directory", "winnr": "information:unimportant", - "tabnr": "file_directory" + "tabnr": "file_directory", + + "tab_nc:file_directory": "information:unimportant", + "tab_nc:file_name": "tab_nc:file_directory", + "tab_nc:tabnr": "tab_nc:file_directory", + + "buf_nc:file_directory": "tab_nc:file_directory", + "buf_nc:file_name": "tab_nc:file_name", + "buf_nc:bufnr": "tab_nc:tabnr", + "buf_nc:modified_indicator": "tab_nc:modified_indicator" } } diff --git a/powerline/config_files/colorschemes/vim/default.json b/powerline/config_files/colorschemes/vim/default.json index 53583b2e..dd62fdb0 100644 --- a/powerline/config_files/colorschemes/vim/default.json +++ b/powerline/config_files/colorschemes/vim/default.json @@ -30,7 +30,9 @@ "attached_clients": { "fg": "gray8", "bg": "gray2", "attr": [] }, "error": { "fg": "brightestred", "bg": "darkred", "attr": ["bold"] }, "warning": { "fg": "brightyellow", "bg": "darkorange", "attr": ["bold"] }, - "current_tag": { "fg": "gray9", "bg": "gray2", "attr": [] } + "current_tag": { "fg": "gray9", "bg": "gray2", "attr": [] }, + + "tab_nc:modified_indicator": { "fg": "brightyellow", "bg": "gray2", "attr": ["bold"] } }, "mode_translations": { "nc": { @@ -52,44 +54,6 @@ "dark_green_gray": "gray5" } }, - "tab_nc": { - "colors": { - "brightyellow": "darkorange", - "brightestred": "darkred", - "gray0": "gray0", - "gray1": "gray0", - "gray2": "gray0", - "gray3": "gray1", - "gray4": "gray1", - "gray5": "gray1", - "gray6": "gray1", - "gray7": "gray4", - "gray8": "gray4", - "gray9": "gray4", - "gray10": "gray5", - "white": "gray6", - "dark_green_gray": "gray5" - } - }, - "buf_nc": { - "colors": { - "brightyellow": "darkorange", - "brightestred": "darkred", - "gray0": "gray0", - "gray1": "gray0", - "gray2": "gray0", - "gray3": "gray1", - "gray4": "gray1", - "gray5": "gray1", - "gray6": "gray1", - "gray7": "gray4", - "gray8": "gray4", - "gray9": "gray4", - "gray10": "gray5", - "white": "gray6", - "dark_green_gray": "gray5" - } - }, "i": { "colors": { "gray0": "darkestblue", diff --git a/powerline/config_files/colorschemes/vim/solarized.json b/powerline/config_files/colorschemes/vim/solarized.json index 63038fbc..b0fa497d 100644 --- a/powerline/config_files/colorschemes/vim/solarized.json +++ b/powerline/config_files/colorschemes/vim/solarized.json @@ -44,26 +44,6 @@ "solarized:base3": "solarized:base1" } }, - "tab_nc": { - "colors": { - "solarized:base01": "solarized:base02", - "solarized:base00": "solarized:base02", - "solarized:base0": "solarized:base01", - "solarized:base1": "solarized:base00", - "solarized:base2": "solarized:base0", - "solarized:base3": "solarized:base1" - } - }, - "buf_nc": { - "colors": { - "solarized:base01": "solarized:base02", - "solarized:base00": "solarized:base02", - "solarized:base0": "solarized:base01", - "solarized:base1": "solarized:base00", - "solarized:base2": "solarized:base0", - "solarized:base3": "solarized:base1" - } - }, "i": { "groups": { "background": { "fg": "solarized:base3", "bg": "solarized:base01", "attr": [] }, diff --git a/powerline/config_files/colorschemes/vim/solarizedlight.json b/powerline/config_files/colorschemes/vim/solarizedlight.json index da38bb88..f6c1e178 100644 --- a/powerline/config_files/colorschemes/vim/solarizedlight.json +++ b/powerline/config_files/colorschemes/vim/solarizedlight.json @@ -43,26 +43,6 @@ "solarized:base03": "solarized:base1" } }, - "tab_nc": { - "colors": { - "solarized:base2": "solarized:base01", - "solarized:base0": "solarized:base01", - "solarized:base00": "solarized:base2", - "solarized:base1": "solarized:base0", - "solarized:base02": "solarized:base00", - "solarized:base03": "solarized:base1" - } - }, - "buf_nc": { - "colors": { - "solarized:base2": "solarized:base01", - "solarized:base0": "solarized:base01", - "solarized:base00": "solarized:base2", - "solarized:base1": "solarized:base0", - "solarized:base02": "solarized:base00", - "solarized:base03": "solarized:base1" - } - }, "i": { "groups": { "background": { "fg": "solarized:base03", "bg": "solarized:base2", "attr": [] }, diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py index c3a1c9b2..c1995957 100644 --- a/powerline/listers/vim.py +++ b/powerline/listers/vim.py @@ -10,7 +10,7 @@ except ImportError: vim = {} -def tabpage_updated_segment_info(segment_info, tabpage, mode): +def tabpage_updated_segment_info(segment_info, tabpage): segment_info = segment_info.copy() window = tabpage.window buffer = window.buffer @@ -22,7 +22,6 @@ def tabpage_updated_segment_info(segment_info, tabpage, mode): window_id=int(window.vars.get('powerline_window_id', -1)), buffer=buffer, bufnr=buffer.number, - mode=mode, ) return segment_info @@ -35,8 +34,7 @@ def tablister(pl, segment_info, **kwargs): ``winnr``, ``window_id``, ``buffer`` and ``bufnr`` keys set to tab-local ones and additional ``tabpage`` and ``tabnr`` keys. - Sets segment ``mode`` to either ``tab`` (for current tab page) or ``tab_nc`` - (for all other tab pages). + Adds either ``tab:`` or ``tab_nc:`` prefix to all segment highlight groups. Works best with vim-7.4 or later: earlier versions miss tabpage object and thus window objects are not available as well. @@ -49,15 +47,15 @@ def tablister(pl, segment_info, **kwargs): return dct return ( - (lambda tabpage, mode: ( - tabpage_updated_segment_info(segment_info, tabpage, mode), - add_multiplier(tabpage, {'mode': mode}) + (lambda tabpage, prefix: ( + tabpage_updated_segment_info(segment_info, tabpage), + add_multiplier(tabpage, {'highlight_group_prefix': prefix}) ))(tabpage, 'tab' if tabpage == cur_tabpage else 'tab_nc') for tabpage in list_tabpages() ) -def buffer_updated_segment_info(segment_info, buffer, mode): +def buffer_updated_segment_info(segment_info, buffer): segment_info = segment_info.copy() segment_info.update( window=None, @@ -65,7 +63,6 @@ def buffer_updated_segment_info(segment_info, buffer, mode): window_id=None, buffer=buffer, bufnr=buffer.number, - mode=mode, ) return segment_info @@ -78,8 +75,7 @@ def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): and ``bufnr`` keys set to buffer-specific ones, ``window``, ``winnr`` and ``window_id`` keys set to None. - Sets segment ``mode`` to either ``buf`` (for current buffer) or ``buf_nc`` - (for all other buffers). + Adds either ``buf:`` or ``buf_nc:`` prefix to all segment highlight groups. :param bool show_unlisted: True if unlisted buffers should be shown as well. Current buffer is @@ -95,12 +91,14 @@ def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): return ( ( buf_segment_info, - add_multiplier(buf_segment_info['buffer'], {'mode': buf_segment_info['mode']}) + add_multiplier(buf_segment_info['buffer'], {'highlight_group_prefix': prefix}) ) - for buf_segment_info in ( - buffer_updated_segment_info( - segment_info, - buffer, + for buf_segment_info, prefix in ( + ( + buffer_updated_segment_info( + segment_info, + buffer + ), ('buf' if buffer is cur_buffer else 'buf_nc') ) for buffer in vim.buffers diff --git a/powerline/segment.py b/powerline/segment.py index 7c11ed8d..abcbe8a4 100644 --- a/powerline/segment.py +++ b/powerline/segment.py @@ -123,7 +123,7 @@ def process_segment_lister(pl, segment_info, parsed_segments, side, mode, colors subsegment_info, parsed_segments, subsegment, - subsegment_update.get('mode', mode), + mode, colorscheme, ) new_pslen = len(parsed_segments) @@ -133,17 +133,23 @@ def process_segment_lister(pl, segment_info, parsed_segments, side, mode, colors return None -def set_segment_highlighting(pl, colorscheme, segment): +def set_segment_highlighting(pl, colorscheme, segment, mode): + try: + highlight_group_prefix = segment['highlight_group_prefix'] + except KeyError: + hl_groups = lambda hlgs: hlgs + else: + hl_groups = lambda hlgs: [highlight_group_prefix + ':' + hlg for hlg in hlgs] + hlgs try: segment['highlight'] = colorscheme.get_highlighting( - segment['highlight_group'], - segment['mode'], + hl_groups(segment['highlight_group']), + mode, segment.get('gradient_level') ) if segment['divider_highlight_group']: segment['divider_highlight'] = colorscheme.get_highlighting( - (segment['divider_highlight_group'],), - segment['mode'] + hl_groups([segment['divider_highlight_group']]), + mode ) else: segment['divider_highlight'] = None @@ -156,7 +162,6 @@ def set_segment_highlighting(pl, colorscheme, segment): def process_segment(pl, side, segment_info, parsed_segments, segment, mode, colorscheme): segment = segment.copy() - segment['mode'] = mode pl.prefix = segment['name'] if segment['type'] in ('function', 'segment_list'): try: @@ -202,14 +207,14 @@ def process_segment(pl, side, segment_info, parsed_segments, segment, mode, colo if draw_inner_divider is not None: segment_copy['draw_soft_divider'] = draw_inner_divider draw_inner_divider = segment_copy.pop('draw_inner_divider', None) - if set_segment_highlighting(pl, colorscheme, segment_copy): + if set_segment_highlighting(pl, colorscheme, segment_copy, mode): append(segment_copy) else: segment['contents'] = contents - if set_segment_highlighting(pl, colorscheme, segment): + if set_segment_highlighting(pl, colorscheme, segment, mode): parsed_segments.append(segment) elif segment['width'] == 'auto' or (segment['type'] == 'string' and segment['contents'] is not None): - if set_segment_highlighting(pl, colorscheme, segment): + if set_segment_highlighting(pl, colorscheme, segment, mode): parsed_segments.append(segment) @@ -356,7 +361,6 @@ def gen_segment_getter(pl, ext, common_config, theme_configs, default_module, ge 'truncate': None, 'startup': None, 'shutdown': None, - 'mode': None, '_rendered_raw': '', '_rendered_hl': '', '_len': None, @@ -405,7 +409,6 @@ def gen_segment_getter(pl, ext, common_config, theme_configs, default_module, ge 'truncate': truncate_func, 'startup': startup_func, 'shutdown': shutdown_func, - 'mode': None, '_rendered_raw': '', '_rendered_hl': '', '_len': None, diff --git a/powerline/theme.py b/powerline/theme.py index 32a8aeee..6bfc9b45 100644 --- a/powerline/theme.py +++ b/powerline/theme.py @@ -135,7 +135,6 @@ class Theme(object): for side in [side] if side else ['left', 'right']: parsed_segments = [] for segment in self.segments[line][side]: - # No segment-local modes at this point if segment['display_condition'](self.pl, segment_info, mode): process_segment( self.pl, diff --git a/tests/test_tabline.vim b/tests/test_tabline.vim index 9d829ea6..66b60a49 100755 --- a/tests/test_tabline.vim +++ b/tests/test_tabline.vim @@ -16,7 +16,7 @@ catch cquit endtry -if result isnot# '%#Pl_240_5789784_235_2500134_NONE# 1 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#abc %#Pl_244_8421504_235_2500134_NONE# %#Pl_240_5789784_235_2500134_NONE#2 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#def %#Pl_235_2500134_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Tabs ' +if result isnot# '%#Pl_247_10395294_236_3158064_NONE# 1 %#Pl_247_10395294_236_3158064_NONE#./%#Pl_247_10395294_236_3158064_NONE#abc %#Pl_247_10395294_236_3158064_NONE# %#Pl_247_10395294_236_3158064_NONE#2 %#Pl_247_10395294_236_3158064_NONE#./%#Pl_247_10395294_236_3158064_NONE#def %#Pl_236_3158064_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Tabs ' call writefile(['Unexpected tabline', result], 'message.fail') cquit endif @@ -30,7 +30,7 @@ catch cquit endtry -if result isnot# '%#Pl_240_5789784_235_2500134_NONE# 1 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#abc %#Pl_244_8421504_235_2500134_NONE# %#Pl_240_5789784_235_2500134_NONE#2 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#def %#Pl_235_2500134_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Bufs ' +if result isnot# '%#Pl_247_10395294_236_3158064_NONE# 1 %#Pl_247_10395294_236_3158064_NONE#./%#Pl_247_10395294_236_3158064_NONE#abc %#Pl_247_10395294_236_3158064_NONE# %#Pl_247_10395294_236_3158064_NONE#2 %#Pl_247_10395294_236_3158064_NONE#./%#Pl_247_10395294_236_3158064_NONE#def %#Pl_236_3158064_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Bufs ' call writefile(['Unexpected tabline (2)', result], 'message.fail') cquit endif @@ -42,7 +42,7 @@ catch call writefile(['Exception while evaluating &tabline (3)', v:exception], 'message.fail') endtry -if result isnot# '%#Pl_240_5789784_235_2500134_NONE# 1 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#abc %#Pl_244_8421504_235_2500134_NONE# %#Pl_240_5789784_235_2500134_NONE#2 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#def %#Pl_235_2500134_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Bufs ' +if result isnot# '%#Pl_247_10395294_236_3158064_NONE# 1 %#Pl_247_10395294_236_3158064_NONE#./%#Pl_247_10395294_236_3158064_NONE#abc %#Pl_247_10395294_236_3158064_NONE# %#Pl_247_10395294_236_3158064_NONE#2 %#Pl_247_10395294_236_3158064_NONE#./%#Pl_247_10395294_236_3158064_NONE#def %#Pl_236_3158064_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Bufs ' call writefile(['Unexpected tabline (3)', result], 'message.fail') cquit endif