Encode vim statusline to &encoding before returning
Partially fixes #1072
This commit is contained in:
parent
fdf21feae1
commit
fa217185cf
|
@ -52,6 +52,23 @@ def powerline_decode_error(e):
|
|||
codecs.register_error('powerline_decode_error', powerline_decode_error)
|
||||
|
||||
|
||||
last_swe_idx = 0
|
||||
|
||||
|
||||
def register_strwidth_error(strwidth):
|
||||
global last_swe_idx
|
||||
last_swe_idx += 1
|
||||
|
||||
def powerline_encode_strwidth_error(e):
|
||||
if not isinstance(e, UnicodeEncodeError):
|
||||
raise NotImplementedError
|
||||
return ('?' * strwidth(e.object[e.start:e.end]), e.end)
|
||||
|
||||
ename = 'powerline_encode_strwidth_error_{0}'.format(last_swe_idx)
|
||||
codecs.register_error(ename, powerline_encode_strwidth_error)
|
||||
return ename
|
||||
|
||||
|
||||
def out_u(s):
|
||||
'''Return unicode string suitable for displaying
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ from powerline.bindings.vim import vim_get_func, vim_getoption, environ, current
|
|||
from powerline.renderer import Renderer
|
||||
from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE
|
||||
from powerline.theme import Theme
|
||||
from powerline.lib.unicode import unichr
|
||||
from powerline.lib.unicode import unichr, register_strwidth_error
|
||||
|
||||
|
||||
vim_mode = vim_get_func('mode', rettype=str)
|
||||
|
@ -41,6 +41,7 @@ class VimRenderer(Renderer):
|
|||
super(VimRenderer, self).__init__(*args, **kwargs)
|
||||
self.hl_groups = {}
|
||||
self.prev_highlight = None
|
||||
self.strwidth_error_name = register_strwidth_error(self.strwidth)
|
||||
|
||||
def shutdown(self):
|
||||
self.theme.shutdown()
|
||||
|
@ -115,6 +116,7 @@ class VimRenderer(Renderer):
|
|||
segment_info=segment_info,
|
||||
matcher_info=(None if is_tabline else segment_info),
|
||||
)
|
||||
statusline = statusline.encode(vim.eval('&encoding'), self.strwidth_error_name)
|
||||
return statusline
|
||||
|
||||
def reset_highlight(self):
|
||||
|
|
|
@ -653,9 +653,9 @@ class TestVim(TestCase):
|
|||
window = vim_module.current.window
|
||||
window_id = 1
|
||||
winnr = window.number
|
||||
self.assertEqual(powerline.render(window, window_id, winnr), '%#Pl_3_8404992_4_192_underline#\xa0abc%#Pl_4_192_NONE_None_NONE#>>')
|
||||
self.assertEqual(powerline.render(window, window_id, winnr), b'%#Pl_3_8404992_4_192_underline#\xc2\xa0abc%#Pl_4_192_NONE_None_NONE#>>')
|
||||
vim_module._environ['TEST'] = 'def'
|
||||
self.assertEqual(powerline.render(window, window_id, winnr), '%#Pl_3_8404992_4_192_underline#\xa0def%#Pl_4_192_NONE_None_NONE#>>')
|
||||
self.assertEqual(powerline.render(window, window_id, winnr), b'%#Pl_3_8404992_4_192_underline#\xc2\xa0def%#Pl_4_192_NONE_None_NONE#>>')
|
||||
|
||||
def test_local_themes(self):
|
||||
# Regression test: VimPowerline.add_local_theme did not work properly.
|
||||
|
@ -682,7 +682,7 @@ class TestVim(TestCase):
|
|||
window = vim_module.current.window
|
||||
window_id = 1
|
||||
winnr = window.number
|
||||
self.assertEqual(powerline.render(window, window_id, winnr), '%#Pl_5_12583104_6_32896_NONE#\xa0\u201cbar\u201d%#Pl_6_32896_NONE_None_NONE#>>')
|
||||
self.assertEqual(powerline.render(window, window_id, winnr), b'%#Pl_5_12583104_6_32896_NONE#\xc2\xa0\xe2\x80\x9cbar\xe2\x80\x9d%#Pl_6_32896_NONE_None_NONE#>>')
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
|
|
Loading…
Reference in New Issue