Add tabpage and tabnr arguments to segment_info

This commit is contained in:
ZyX 2014-08-03 12:03:44 +04:00
parent 1907708e98
commit f02399b617
4 changed files with 103 additions and 54 deletions

View File

@ -84,10 +84,10 @@ else:
def bufvar_exists(buffer, varname): # NOQA def bufvar_exists(buffer, varname): # NOQA
if not buffer or buffer.number == vim.current.buffer.number: if not buffer or buffer.number == vim.current.buffer.number:
return vim.eval('exists("b:{0}")'.format(varname)) return int(vim.eval('exists("b:{0}")'.format(varname)))
else: else:
return vim.eval('has_key(getbufvar({0}, ""), {1})' return int(vim.eval('has_key(getbufvar({0}, ""), {1})'
.format(buffer.number, varname)) .format(buffer.number, varname)))
def vim_getwinvar(segment_info, varname): # NOQA def vim_getwinvar(segment_info, varname): # NOQA
result = vim.eval('getwinvar({0}, "{1}")'.format(segment_info['winnr'], varname)) result = vim.eval('getwinvar({0}, "{1}")'.format(segment_info['winnr'], varname))
@ -104,6 +104,79 @@ else:
return getbufvar(info['bufnr'], '&' + option) return getbufvar(info['bufnr'], '&' + option)
if hasattr(vim, 'tabpages'):
current_tabpage = lambda: vim.current.tabpage
list_tabpages = lambda: vim.tabpages
else:
class FalseObject(object):
@staticmethod
def __nonzero__():
return False
__bool__ = __nonzero__
def get_buffer(number):
for buffer in vim.buffers:
if buffer.number == number:
return buffer
raise KeyError(number)
class WindowVars(object):
__slots__ = ('tabnr', 'winnr')
def __init__(self, window):
self.tabnr = window.tabnr
self.winnr = window.number
def __getitem__(self, key):
has_key = vim.eval('has_key(gettabwinvar({0}, {1}, ""), "{2}")'.format(self.tabnr, self.winnr, key))
if has_key == '0':
raise KeyError
return vim.eval('gettabwinvar({0}, {1}, "{2}")'.format(self.tabnr, self.winnr, key))
def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
class Window(FalseObject):
__slots__ = ('tabnr', 'number', '_vars')
def __init__(self, tabnr, number):
self.tabnr = tabnr
self.number = number
self.vars = WindowVars(self)
@property
def buffer(self):
return get_buffer(int(vim.eval('tabpagebuflist({0})[{1}]'.format(self.tabnr, self.number - 1))))
class Tabpage(FalseObject):
__slots__ = ('number',)
def __init__(self, number):
self.number = number
def __eq__(self, tabpage):
if not isinstance(tabpage, Tabpage):
raise NotImplementedError
return self.number == tabpage.number
@property
def window(self):
return Window(self.number, int(vim.eval('tabpagewinnr({0})'.format(self.number))))
def _last_tab_nr():
return int(vim.eval('tabpagenr("$")'))
def current_tabpage(): # NOQA
return Tabpage(int(vim.eval('tabpagenr()')))
def list_tabpages(): # NOQA
return [Tabpage(nr) for nr in range(1, _last_tab_nr() + 1)]
if sys.version_info < (3,) or not hasattr(vim, 'bindeval'): if sys.version_info < (3,) or not hasattr(vim, 'bindeval'):
getbufvar = vim_get_func('getbufvar') getbufvar = vim_get_func('getbufvar')
else: else:

View File

@ -2,7 +2,7 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
from powerline.bindings.vim import vim_get_func, environ from powerline.bindings.vim import vim_get_func, environ, current_tabpage
from powerline.renderer import Renderer from powerline.renderer import Renderer
from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE
from powerline.theme import Theme from powerline.theme import Theme
@ -99,7 +99,9 @@ class VimRenderer(Renderer):
window_id=window_id, window_id=window_id,
winnr=winnr, winnr=winnr,
buffer=window.buffer, buffer=window.buffer,
tabpage=current_tabpage(),
) )
segment_info['tabnr'] = segment_info['tabpage'].number
segment_info['bufnr'] = segment_info['buffer'].number segment_info['bufnr'] = segment_info['buffer'].number
winwidth = segment_info['window'].width winwidth = segment_info['window'].width
matcher_info = segment_info matcher_info = segment_info

View File

@ -180,6 +180,7 @@ def gen_segment_getter(pl, ext, common_config, theme_configs, default_module=Non
'priority': None, 'priority': None,
'draw_soft_divider': None, 'draw_soft_divider': None,
'draw_hard_divider': None, 'draw_hard_divider': None,
'draw_inner_divider': None,
'side': side, 'side': side,
'exclude_modes': segment.get('exclude_modes', []), 'exclude_modes': segment.get('exclude_modes', []),
'include_modes': segment.get('include_modes', []), 'include_modes': segment.get('include_modes', []),
@ -190,7 +191,8 @@ def gen_segment_getter(pl, ext, common_config, theme_configs, default_module=Non
'mode': None, 'mode': None,
'_rendered_raw': '', '_rendered_raw': '',
'_rendered_hl': '', '_rendered_hl': '',
'_len': 0, '_len': None,
'_contents_len': None,
'_space_left': 0, '_space_left': 0,
'_space_right': 0, '_space_right': 0,
} }
@ -235,7 +237,8 @@ def gen_segment_getter(pl, ext, common_config, theme_configs, default_module=Non
'mode': None, 'mode': None,
'_rendered_raw': '', '_rendered_raw': '',
'_rendered_hl': '', '_rendered_hl': '',
'_len': 0, '_len': None,
'_contents_len': None,
'_space_left': 0, '_space_left': 0,
'_space_right': 0, '_space_right': 0,
} }

View File

@ -15,7 +15,8 @@ except ImportError:
from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption, from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption,
buffer_name, vim_getwinvar, buffer_name, vim_getwinvar,
register_buffer_cache) register_buffer_cache, current_tabpage,
list_tabpages)
from powerline.theme import requires_segment_info, requires_filesystem_watcher from powerline.theme import requires_segment_info, requires_filesystem_watcher
from powerline.lib import add_divider_highlight_group from powerline.lib import add_divider_highlight_group
from powerline.lib.vcs import guess, tree_status from powerline.lib.vcs import guess, tree_status
@ -487,50 +488,20 @@ def trailing_whitespace(pl, segment_info):
return ret return ret
if hasattr(vim, 'vvars') and vim.vvars['version'] >= 704: def tabpage_updated_segment_info(segment_info, tabpage):
def updated_segment_info(segment_info, tabpage): segment_info = segment_info.copy()
segment_info = segment_info.copy() window = tabpage.window
window = tabpage.window buffer = window.buffer
buffer = window.buffer segment_info.update(
segment_info.update( tabpage=tabpage,
tabpage=tabpage, tabnr=tabpage.number,
tabnr=tabpage.number, window=window,
window=window, winnr=window.number,
winnr=window.number, window_id=int(window.vars.get('powerline_window_id', -1)),
window_id=window.vars.get('powerline_window_id'), buffer=buffer,
buffer=buffer, bufnr=buffer.number,
bufnr=buffer.number, )
) return segment_info
return segment_info
list_tabpages = lambda: vim.tabpages
current_tabpage = lambda: vim.current.tabpage
tabpage_nr = lambda tabpage: tabpage.number
else:
def updated_segment_info(segment_info, tabnr): # NOQA
segment_info = segment_info.copy()
winnr = int(vim.eval('tabpagewinnr({0})'.format(tabnr)))
bufnr = int(vim.eval('tabpagebuflist({0})[{1}]'.format(tabnr, winnr - 1)))
buffer = None
for buffer in vim.buffers:
if buffer.number == bufnr:
break
window_id = vim.eval('gettabwinvar({0}, {1}, "powerline_window_id")'.format(tabnr, winnr))
window_id = int(window_id) if window_id else None
segment_info.update(
tabpage=None,
tabnr=tabnr,
window=None,
winnr=winnr,
window_id=window_id,
buffer=buffer,
bufnr=bufnr,
)
return segment_info
list_tabpages = lambda: range(1, int(vim.eval('tabpagenr("$")')) + 1) # NOQA
current_tabpage = lambda: int(vim.eval('tabpagenr()')) # NOQA
tabpage_nr = lambda tabnr: tabnr # NOQA
@requires_segment_info @requires_segment_info
@ -548,15 +519,15 @@ def tablister(pl, segment_info):
thus window objects are not available as well. thus window objects are not available as well.
''' '''
cur_tabpage = current_tabpage() cur_tabpage = current_tabpage()
cur_tabnr = tabpage_nr(cur_tabpage) cur_tabnr = cur_tabpage.number
def add_multiplier(tabpage, dct): def add_multiplier(tabpage, dct):
dct['priority_multiplier'] = 1 + (0.001 * abs(tabpage_nr(tabpage) - cur_tabnr)) dct['priority_multiplier'] = 1 + (0.001 * abs(tabpage.number - cur_tabnr))
return dct return dct
return [ return [
( (
updated_segment_info(segment_info, tabpage), tabpage_updated_segment_info(segment_info, tabpage),
add_multiplier(tabpage, {'mode': ('tab' if tabpage == cur_tabpage else 'nc')}) add_multiplier(tabpage, {'mode': ('tab' if tabpage == cur_tabpage else 'nc')})
) )
for tabpage in list_tabpages() for tabpage in list_tabpages()