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
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:
return vim.eval('has_key(getbufvar({0}, ""), {1})'
.format(buffer.number, varname))
return int(vim.eval('has_key(getbufvar({0}, ""), {1})'
.format(buffer.number, varname)))
def vim_getwinvar(segment_info, varname): # NOQA
result = vim.eval('getwinvar({0}, "{1}")'.format(segment_info['winnr'], varname))
@ -104,6 +104,79 @@ else:
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'):
getbufvar = vim_get_func('getbufvar')
else:

View File

@ -2,7 +2,7 @@
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.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE
from powerline.theme import Theme
@ -99,7 +99,9 @@ class VimRenderer(Renderer):
window_id=window_id,
winnr=winnr,
buffer=window.buffer,
tabpage=current_tabpage(),
)
segment_info['tabnr'] = segment_info['tabpage'].number
segment_info['bufnr'] = segment_info['buffer'].number
winwidth = segment_info['window'].width
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,
'draw_soft_divider': None,
'draw_hard_divider': None,
'draw_inner_divider': None,
'side': side,
'exclude_modes': segment.get('exclude_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,
'_rendered_raw': '',
'_rendered_hl': '',
'_len': 0,
'_len': None,
'_contents_len': None,
'_space_left': 0,
'_space_right': 0,
}
@ -235,7 +237,8 @@ def gen_segment_getter(pl, ext, common_config, theme_configs, default_module=Non
'mode': None,
'_rendered_raw': '',
'_rendered_hl': '',
'_len': 0,
'_len': None,
'_contents_len': None,
'_space_left': 0,
'_space_right': 0,
}

View File

@ -15,7 +15,8 @@ except ImportError:
from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption,
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.lib import add_divider_highlight_group
from powerline.lib.vcs import guess, tree_status
@ -487,50 +488,20 @@ def trailing_whitespace(pl, segment_info):
return ret
if hasattr(vim, 'vvars') and vim.vvars['version'] >= 704:
def updated_segment_info(segment_info, tabpage):
segment_info = segment_info.copy()
window = tabpage.window
buffer = window.buffer
segment_info.update(
tabpage=tabpage,
tabnr=tabpage.number,
window=window,
winnr=window.number,
window_id=window.vars.get('powerline_window_id'),
buffer=buffer,
bufnr=buffer.number,
)
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
def tabpage_updated_segment_info(segment_info, tabpage):
segment_info = segment_info.copy()
window = tabpage.window
buffer = window.buffer
segment_info.update(
tabpage=tabpage,
tabnr=tabpage.number,
window=window,
winnr=window.number,
window_id=int(window.vars.get('powerline_window_id', -1)),
buffer=buffer,
bufnr=buffer.number,
)
return segment_info
@requires_segment_info
@ -548,15 +519,15 @@ def tablister(pl, segment_info):
thus window objects are not available as well.
'''
cur_tabpage = current_tabpage()
cur_tabnr = tabpage_nr(cur_tabpage)
cur_tabnr = cur_tabpage.number
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 [
(
updated_segment_info(segment_info, tabpage),
tabpage_updated_segment_info(segment_info, tabpage),
add_multiplier(tabpage, {'mode': ('tab' if tabpage == cur_tabpage else 'nc')})
)
for tabpage in list_tabpages()