Add code that will return bytes() from vim functions in Python-3
This commit is contained in:
parent
f073437f02
commit
e7d0c8368e
|
@ -9,8 +9,7 @@ try:
|
|||
except ImportError:
|
||||
vim = {}
|
||||
|
||||
if not hasattr(vim, 'bindeval'):
|
||||
import json
|
||||
from powerline.lib.unicode import unicode
|
||||
|
||||
|
||||
try:
|
||||
|
@ -19,6 +18,22 @@ except AttributeError:
|
|||
vim_encoding = 'utf-8'
|
||||
|
||||
|
||||
python_to_vim_types = {
|
||||
unicode: (
|
||||
lambda o: b'\'' + (o.translate({
|
||||
ord('\''): '\'\'',
|
||||
}).encode(vim_encoding)) + b'\''
|
||||
),
|
||||
bytes: (lambda o: b'\'' + o.replace(b'\'', b'\'\'') + b'\''),
|
||||
int: (str if str is bytes else (lambda o: unicode(o).encode('ascii'))),
|
||||
}
|
||||
python_to_vim_types[float] = python_to_vim_types[int]
|
||||
|
||||
|
||||
def python_to_vim(o):
|
||||
return python_to_vim_types[type(o)](o)
|
||||
|
||||
|
||||
if hasattr(vim, 'bindeval'):
|
||||
def vim_get_func(f, rettype=None):
|
||||
'''Return a vim function binding.'''
|
||||
|
@ -39,11 +54,25 @@ else:
|
|||
__slots__ = ('f', 'rettype')
|
||||
|
||||
def __init__(self, f, rettype=None):
|
||||
self.f = f
|
||||
self.f = f.encode('utf-8')
|
||||
self.rettype = rettype
|
||||
|
||||
def __call__(self, *args):
|
||||
r = vim.eval(self.f + '(' + json.dumps(args)[1:-1] + ')')
|
||||
expr = self.f + b'(' + (b','.join((
|
||||
python_to_vim(o) for o in args
|
||||
))) + b')'
|
||||
try:
|
||||
r = vim.eval(expr)
|
||||
except UnicodeDecodeError:
|
||||
r = bytes(bytearray((
|
||||
int(chunk) for chunk in (
|
||||
vim.eval(
|
||||
b'substitute(' + expr + b', ' +
|
||||
b'\'^.*$\', \'\\=join(map(range(len(submatch(0))), ' +
|
||||
b'"char2nr(submatch(0)[v:val])"))\', "")'
|
||||
).split()
|
||||
)
|
||||
)))
|
||||
if self.rettype:
|
||||
return self.rettype(r)
|
||||
return r
|
||||
|
@ -140,7 +169,7 @@ else:
|
|||
|
||||
def vim_setoption(option, value):
|
||||
vim.command('let &g:{option} = {value}'.format(
|
||||
option=option, value=json.encode(value)))
|
||||
option=option, value=python_to_vim(value)))
|
||||
|
||||
|
||||
if hasattr(vim, 'tabpages'):
|
||||
|
|
|
@ -8,6 +8,7 @@ from functools import partial
|
|||
|
||||
from powerline.segments import shell, tmux, common
|
||||
from powerline.lib.vcs import get_fallback_create_watcher
|
||||
from powerline.lib.unicode import out_u
|
||||
|
||||
import tests.vim as vim_module
|
||||
|
||||
|
@ -18,10 +19,10 @@ from tests import TestCase, SkipTest
|
|||
def get_dummy_guess(**kwargs):
|
||||
if 'directory' in kwargs:
|
||||
def guess(path, create_watcher):
|
||||
return Args(branch=lambda: os.path.basename(path), **kwargs)
|
||||
return Args(branch=lambda: out_u(os.path.basename(path)), **kwargs)
|
||||
else:
|
||||
def guess(path, create_watcher):
|
||||
return Args(branch=lambda: os.path.basename(path), directory=path, **kwargs)
|
||||
return Args(branch=lambda: out_u(os.path.basename(path)), directory=path, **kwargs)
|
||||
return guess
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue