From 5c4d75f9526424d68a107d76ad350c4bb95193bc Mon Sep 17 00:00:00 2001 From: ZyX Date: Fri, 22 Aug 2014 08:59:25 +0400 Subject: [PATCH] Make tab_modified_indicator work in old Vims Closes #996 --- powerline/bindings/vim/__init__.py | 24 ++++++++++++++++++++++++ powerline/segments/vim/__init__.py | 12 +++++------- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/powerline/bindings/vim/__init__.py b/powerline/bindings/vim/__init__.py index e6edb92a..eec4da3c 100644 --- a/powerline/bindings/vim/__init__.py +++ b/powerline/bindings/vim/__init__.py @@ -136,6 +136,12 @@ else: if hasattr(vim, 'tabpages'): current_tabpage = lambda: vim.current.tabpage list_tabpages = lambda: vim.tabpages + + def list_tabpage_buffers_segment_info(segment_info): + return ( + {'buffer': window.buffer, 'bufnr': window.buffer.number} + for window in segment_info['tabpage'].windows + ) else: class FalseObject(object): @staticmethod @@ -205,6 +211,24 @@ else: def list_tabpages(): # NOQA return [Tabpage(nr) for nr in range(1, _last_tab_nr() + 1)] + class TabBufSegmentInfo(dict): + def __getitem__(self, key): + try: + return super(TabBufSegmentInfo, self).__getitem__(key) + except KeyError: + if key != 'buffer': + raise + else: + buffer = get_buffer(super(TabBufSegmentInfo, self).__getitem__('bufnr')) + self['buffer'] = buffer + return buffer + + def list_tabpage_buffers_segment_info(segment_info): + return ( + TabBufSegmentInfo(bufnr=int(bufnrstr)) + for bufnrstr in vim.eval('tabpagebuflist({0})'.format(segment_info['tabnr'])) + ) + class VimEnviron(object): @staticmethod diff --git a/powerline/segments/vim/__init__.py b/powerline/segments/vim/__init__.py index bfb7b475..65118b2f 100644 --- a/powerline/segments/vim/__init__.py +++ b/powerline/segments/vim/__init__.py @@ -15,7 +15,8 @@ from collections import defaultdict from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption, buffer_name, vim_getwinvar, register_buffer_cache, current_tabpage, - list_tabpages) + list_tabpages, + list_tabpage_buffers_segment_info) from powerline.theme import requires_segment_info, requires_filesystem_watcher from powerline.lib import add_divider_highlight_group from powerline.lib.vcs import guess, tree_status @@ -176,13 +177,10 @@ def tab_modified_indicator(pl, segment_info, text='+'): Highlight groups used: ``tab_modified_indicator`` or ``modified_indicator``. ''' - if 'tabpage' in segment_info: - buffers = [dict(buffer=w.buffer) for w in segment_info['tabpage'].windows] - modified = [int(vim_getbufoption(buf, 'modified')) != 0 for buf in buffers] - ret = text if reduce(lambda x, y: x or y, modified) else None - if ret: + for buf_segment_info in list_tabpage_buffers_segment_info(segment_info): + if int(vim_getbufoption(buf_segment_info, 'modified')): return [{ - 'contents': ret, + 'contents': text, 'highlight_group': ['tab_modified_indicator', 'modified_indicator'], }] return None