From d464ff84bbc0f9510ae9dad9014133e3e3e05007 Mon Sep 17 00:00:00 2001 From: Foo Date: Fri, 17 Apr 2015 22:01:10 +0300 Subject: [PATCH] Fix warning when &l:statusline is set to a unicode value This normally should not happen because &l:stl should be powerline-controlled, but some plugins do this. Fixes #1347 --- powerline/vim.py | 34 ++++++++++++++++++++++++----- tests/test_foreign_stl_override.vim | 22 +++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 tests/test_foreign_stl_override.vim diff --git a/powerline/vim.py b/powerline/vim.py index d4f5c2d6..53e23147 100644 --- a/powerline/vim.py +++ b/powerline/vim.py @@ -52,7 +52,31 @@ class VimPowerline(Powerline): super(VimPowerline, self).init('vim', **kwargs) self.last_window_id = 1 self.pyeval = pyeval - self.window_statusline = '%!' + pyeval + '(\'powerline.statusline({0})\')' + self.construct_window_statusline = self.create_window_statusline_constructor() + + if sys.version_info < (3,): + def create_window_statusline_constructor(self): + window_statusline = b'%!' + str(self.pyeval) + b'(\'powerline.statusline({0})\')' + return window_statusline.format + else: + def create_window_statusline_constructor(self): + startstr = b'%!' + self.pyeval.encode('ascii') + b'(\'powerline.statusline(' + endstr = b')\')' + return lambda idx: ( + startstr + str(idx).encode('ascii') + endstr + ) + + create_window_statusline_constructor.__doc__ = ( + '''Create function which returns &l:stl value being given window index + + Created function must return :py:class:`bytes` instance because this is + what ``window.options['statusline']`` returns (``window`` is + :py:class:`vim.Window` instance). + + :return: + Function with type ``int → bytes``. + ''' + ) default_log_stream = sys.stdout @@ -174,7 +198,7 @@ class VimPowerline(Powerline): pyeval = 'PowerlinePyeval' self.pyeval = pyeval - self.window_statusline = '%!' + pyeval + '(\'powerline.statusline({0})\')' + self.construct_window_statusline = self.create_window_statusline_constructor() self.update_renderer() __main__.powerline = self @@ -240,14 +264,14 @@ class VimPowerline(Powerline): curwindow_id = self.last_window_id self.last_window_id += 1 window.vars['powerline_window_id'] = curwindow_id - statusline = self.window_statusline.format(curwindow_id) + statusline = self.construct_window_statusline(curwindow_id) if window.options['statusline'] != statusline: window.options['statusline'] = statusline if curwindow_id == window_id if window_id else window is vim.current.window: r = (window, curwindow_id, window.number) return r else: - _vim_getwinvar = staticmethod(vim_get_func('getwinvar')) + _vim_getwinvar = staticmethod(vim_get_func('getwinvar', 'bytes')) _vim_setwinvar = staticmethod(vim_get_func('setwinvar')) def win_idx(self, window_id): @@ -260,7 +284,7 @@ class VimPowerline(Powerline): curwindow_id = self.last_window_id self.last_window_id += 1 self._vim_setwinvar(winnr, 'powerline_window_id', curwindow_id) - statusline = self.window_statusline.format(curwindow_id) + statusline = self.construct_window_statusline(curwindow_id) if self._vim_getwinvar(winnr, '&statusline') != statusline: self._vim_setwinvar(winnr, '&statusline', statusline) if curwindow_id == window_id if window_id else window is vim.current.window: diff --git a/tests/test_foreign_stl_override.vim b/tests/test_foreign_stl_override.vim new file mode 100644 index 00000000..0cafb558 --- /dev/null +++ b/tests/test_foreign_stl_override.vim @@ -0,0 +1,22 @@ +scriptencoding utf-8 +set encoding=utf-8 +let g:powerline_config_paths = [expand(':p:h:h') . '/powerline/config_files'] +set laststatus=2 +redir => g:messages + try + source powerline/bindings/vim/plugin/powerline.vim + redrawstatus! + vsplit + redrawstatus! + setlocal statusline=«» + redrawstatus! + catch + call writefile(['Unexpected exception', v:exception], 'message.fail') + cquit + endtry +redir END +if g:messages =~# '\v\S' + call writefile(['Unexpected messages'] + split(g:messages, "\n", 1), 'message.fail') + cquit +endif +qall!