mirror of
https://github.com/powerline/powerline.git
synced 2025-07-23 05:46:01 +02:00
Merge remote-tracking branch 'zyx-i/fix-322' into develop
This commit is contained in:
commit
747c75c1c4
@ -6,19 +6,18 @@ import os
|
||||
import sys
|
||||
|
||||
from powerline.colorscheme import Colorscheme
|
||||
from powerline.lib import underscore_to_camelcase
|
||||
|
||||
|
||||
def open_file(path):
|
||||
return open(path, 'r')
|
||||
|
||||
|
||||
def load_json_config(search_paths, config_file, load=json.load, open=open_file):
|
||||
def load_json_config(search_paths, config_file, load=json.load, open_file=open_file):
|
||||
config_file += '.json'
|
||||
for path in search_paths:
|
||||
config_file_path = os.path.join(path, config_file)
|
||||
if os.path.isfile(config_file_path):
|
||||
with open(config_file_path) as config_file_fp:
|
||||
with open_file(config_file_path) as config_file_fp:
|
||||
return load(config_file_fp)
|
||||
raise IOError('Config file not found in search path: {0}'.format(config_file))
|
||||
|
||||
@ -65,9 +64,8 @@ class Powerline(object):
|
||||
# Load and initialize extension renderer
|
||||
renderer_module_name = renderer_module or ext
|
||||
renderer_module_import = 'powerline.renderers.{0}'.format(renderer_module_name)
|
||||
renderer_class_name = '{0}Renderer'.format(underscore_to_camelcase(renderer_module_name))
|
||||
try:
|
||||
Renderer = getattr(__import__(renderer_module_import, fromlist=[renderer_class_name]), renderer_class_name)
|
||||
Renderer = __import__(renderer_module_import, fromlist=['renderer']).renderer
|
||||
except ImportError as e:
|
||||
sys.stderr.write('Error while importing renderer module: {0}\n'.format(e))
|
||||
sys.exit(1)
|
||||
|
@ -7,11 +7,6 @@ from powerline.lib.humanize_bytes import humanize_bytes # NOQA
|
||||
from powerline.lib.url import urllib_read, urllib_urlencode # NOQA
|
||||
|
||||
|
||||
def underscore_to_camelcase(string):
|
||||
'''Return a underscore_separated_string as CamelCase.'''
|
||||
return ''.join(word.capitalize() or '_' for word in string.split('_'))
|
||||
|
||||
|
||||
def mergedicts(d1, d2):
|
||||
'''Recursively merge two dictionaries. First dictionary is modified in-place.
|
||||
'''
|
||||
|
@ -604,7 +604,7 @@ def check_segment_name(name, data, context, echoerr):
|
||||
except AttributeError:
|
||||
echoerr(context='Error while loading segment function (key {key})'.format(key=context_key(context)),
|
||||
problem='failed to load function {0} from module {1}'.format(name, module),
|
||||
problem_mark=match_name.mark)
|
||||
problem_mark=name.mark)
|
||||
return True, False, True
|
||||
|
||||
if not callable(func):
|
||||
@ -875,7 +875,7 @@ def check(path=None):
|
||||
|
||||
hadproblem = False
|
||||
try:
|
||||
main_config = load_json_config(search_paths, 'config', load=load_config, open=open_file)
|
||||
main_config = load_json_config(search_paths, 'config', load=load_config, open_file=open_file)
|
||||
except IOError:
|
||||
main_config = {}
|
||||
sys.stderr.write('\nConfiguration file not found: config.json\n')
|
||||
@ -891,7 +891,7 @@ def check(path=None):
|
||||
import_paths = [os.path.expanduser(path) for path in main_config.get('common', {}).get('paths', [])]
|
||||
|
||||
try:
|
||||
colors_config = load_json_config(search_paths, 'colors', load=load_config, open=open_file)
|
||||
colors_config = load_json_config(search_paths, 'colors', load=load_config, open_file=open_file)
|
||||
except IOError:
|
||||
colors_config = {}
|
||||
sys.stderr.write('\nConfiguration file not found: colors.json\n')
|
||||
|
@ -88,7 +88,6 @@ class Reader(object):
|
||||
def check_printable(self, data):
|
||||
match = NON_PRINTABLE.search(data)
|
||||
if match:
|
||||
character = match.group()
|
||||
self.update_pointer(match.start())
|
||||
raise ReaderError('while reading from stream', None,
|
||||
'found special characters which are not allowed',
|
||||
|
@ -10,6 +10,13 @@ except NameError:
|
||||
NBSP = ' '
|
||||
|
||||
|
||||
def construct_returned_value(rendered_highlighted, segments, output_raw):
|
||||
if output_raw:
|
||||
return rendered_highlighted, ''.join((segment['_rendered_raw'] for segment in segments))
|
||||
else:
|
||||
return rendered_highlighted
|
||||
|
||||
|
||||
class Renderer(object):
|
||||
def __init__(self, theme_config, local_themes, theme_kwargs, colorscheme, **options):
|
||||
self.__dict__.update(options)
|
||||
@ -64,7 +71,7 @@ class Renderer(object):
|
||||
|
||||
if not width:
|
||||
# No width specified, so we don't need to crop or pad anything
|
||||
return self._returned_value(''.join([segment['_rendered_hl'] for segment in segments]) + self.hlstyle(), segments, output_raw)
|
||||
return construct_returned_value(''.join([segment['_rendered_hl'] for segment in segments]) + self.hlstyle(), segments, output_raw)
|
||||
|
||||
# Create an ordered list of segments that can be dropped
|
||||
segments_priority = [segment for segment in sorted(segments, key=lambda segment: segment['priority'], reverse=True) if segment['priority'] > 0]
|
||||
@ -89,7 +96,7 @@ class Renderer(object):
|
||||
|
||||
rendered_highlighted = ''.join([segment['_rendered_hl'] for segment in self._render_segments(theme, segments)]) + self.hlstyle()
|
||||
|
||||
return self._returned_value(rendered_highlighted, segments, output_raw)
|
||||
return construct_returned_value(rendered_highlighted, segments, output_raw)
|
||||
|
||||
def _render_segments(self, theme, segments, render_highlighted=True):
|
||||
'''Internal segment rendering method.
|
||||
@ -166,24 +173,10 @@ class Renderer(object):
|
||||
segment['_len'] = self.strwidth(segment['_rendered_raw'])
|
||||
yield segment
|
||||
|
||||
@staticmethod
|
||||
def _returned_value(rendered_highlighted, segments, output_raw):
|
||||
if output_raw:
|
||||
return rendered_highlighted, ''.join((segment['_rendered_raw'] for segment in segments))
|
||||
else:
|
||||
return rendered_highlighted
|
||||
|
||||
@staticmethod
|
||||
def escape(string):
|
||||
return string
|
||||
|
||||
@staticmethod
|
||||
def _int_to_rgb(int):
|
||||
r = (int >> 16) & 0xff
|
||||
g = (int >> 8) & 0xff
|
||||
b = int & 0xff
|
||||
return r, g, b
|
||||
|
||||
def hlstyle(fg=None, bg=None, attr=None):
|
||||
raise NotImplementedError
|
||||
|
||||
|
@ -11,3 +11,6 @@ class BashPromptRenderer(ShellRenderer):
|
||||
@staticmethod
|
||||
def escape(string):
|
||||
return string.replace('\\', '\\\\').replace('$', '\\$').replace('`', '\\`')
|
||||
|
||||
|
||||
renderer = BashPromptRenderer
|
||||
|
@ -7,3 +7,6 @@ class IpythonRenderer(ShellRenderer):
|
||||
'''Powerline ipython segment renderer.'''
|
||||
escape_hl_start = '\x01'
|
||||
escape_hl_end = '\x02'
|
||||
|
||||
|
||||
renderer = IpythonRenderer
|
||||
|
@ -29,3 +29,6 @@ class PangoMarkupRenderer(Renderer):
|
||||
if attr & ATTR_UNDERLINE:
|
||||
awesome_attr += ['underline="single"']
|
||||
return '<span ' + ' '.join(awesome_attr) + '>' + contents + '</span>'
|
||||
|
||||
|
||||
renderer = PangoMarkupRenderer
|
||||
|
@ -4,6 +4,13 @@ from powerline.renderer import Renderer
|
||||
from powerline.colorscheme import ATTR_BOLD, ATTR_ITALIC, ATTR_UNDERLINE
|
||||
|
||||
|
||||
def int_to_rgb(num):
|
||||
r = (num >> 16) & 0xff
|
||||
g = (num >> 8) & 0xff
|
||||
b = num & 0xff
|
||||
return r, g, b
|
||||
|
||||
|
||||
class ShellRenderer(Renderer):
|
||||
'''Powerline shell segment renderer.'''
|
||||
escape_hl_start = ''
|
||||
@ -25,7 +32,7 @@ class ShellRenderer(Renderer):
|
||||
ansi += [39]
|
||||
else:
|
||||
if self.term_truecolor:
|
||||
ansi += [38, 2] + list(self._int_to_rgb(fg[1]))
|
||||
ansi += [38, 2] + list(int_to_rgb(fg[1]))
|
||||
else:
|
||||
ansi += [38, 5, fg[0]]
|
||||
if bg is not None:
|
||||
@ -33,7 +40,7 @@ class ShellRenderer(Renderer):
|
||||
ansi += [49]
|
||||
else:
|
||||
if self.term_truecolor:
|
||||
ansi += [48, 2] + list(self._int_to_rgb(bg[1]))
|
||||
ansi += [48, 2] + list(int_to_rgb(bg[1]))
|
||||
else:
|
||||
ansi += [48, 5, bg[0]]
|
||||
if attr is not None:
|
||||
@ -58,3 +65,6 @@ class ShellRenderer(Renderer):
|
||||
@staticmethod
|
||||
def escape(string):
|
||||
return string.replace('\\', '\\\\')
|
||||
|
||||
|
||||
renderer = ShellRenderer
|
||||
|
@ -39,3 +39,6 @@ class TmuxRenderer(Renderer):
|
||||
else:
|
||||
tmux_attr += ['nounderscore']
|
||||
return '#[' + ','.join(tmux_attr) + ']'
|
||||
|
||||
|
||||
renderer = TmuxRenderer
|
||||
|
@ -9,6 +9,7 @@ from powerline.theme import Theme
|
||||
|
||||
import vim
|
||||
|
||||
|
||||
vim_mode = vim_get_func('mode')
|
||||
vim_getwinvar = vim_get_func('getwinvar')
|
||||
vim_setwinvar = vim_get_func('setwinvar')
|
||||
@ -132,3 +133,6 @@ class VimRenderer(Renderer):
|
||||
attr=','.join(hl_group['attr']),
|
||||
))
|
||||
return '%#' + self.hl_groups[(fg, bg, attr)]['name'] + '#'
|
||||
|
||||
|
||||
renderer = VimRenderer
|
||||
|
@ -11,3 +11,6 @@ class ZshPromptRenderer(ShellRenderer):
|
||||
@staticmethod
|
||||
def escape(string):
|
||||
return string.replace('%', '%%').replace('\\', '\\\\')
|
||||
|
||||
|
||||
renderer = ZshPromptRenderer
|
||||
|
@ -151,16 +151,23 @@ def readonly_indicator(segment_info, text=''):
|
||||
|
||||
|
||||
@requires_segment_info
|
||||
def file_directory(segment_info, shorten_home=False):
|
||||
def file_directory(segment_info, shorten_user=True, shorten_cwd=True, shorten_home=False):
|
||||
'''Return file directory (head component of the file path).
|
||||
|
||||
:param bool shorten_user:
|
||||
shorten ``$HOME`` directory to :file:`~/`
|
||||
|
||||
:param bool shorten_cwd:
|
||||
shorten current directory to :file:`./`
|
||||
|
||||
:param bool shorten_home:
|
||||
shorten all directories in :file:`/home/` to :file:`~user/` instead of :file:`/home/user/`.
|
||||
'''
|
||||
name = segment_info['buffer'].name
|
||||
if not name:
|
||||
return None
|
||||
file_directory = vim_funcs['fnamemodify'](name, ':~:.:h')
|
||||
file_directory = vim_funcs['fnamemodify'](name, (':~' if shorten_user else '')
|
||||
+ (':.' if shorten_home else '') + ':h')
|
||||
if shorten_home and file_directory.startswith('/home/'):
|
||||
file_directory = '~' + file_directory[6:]
|
||||
return file_directory + os.sep if file_directory else None
|
||||
|
@ -57,6 +57,34 @@ class TestConfig(TestCase):
|
||||
from powerline.shell import ShellPowerline
|
||||
with replace_module_attr(common, 'urllib_read', urllib_read):
|
||||
ShellPowerline(Args(ext=['tmux'])).renderer.render()
|
||||
reload(common)
|
||||
|
||||
def test_zsh(self):
|
||||
from powerline.shell import ShellPowerline
|
||||
ShellPowerline(Args(last_pipe_status=[1, 0], ext=['shell'], renderer_module='zsh_prompt')).renderer.render()
|
||||
|
||||
def test_bash(self):
|
||||
from powerline.shell import ShellPowerline
|
||||
ShellPowerline(Args(last_exit_code=1, ext=['shell'], renderer_module='bash_prompt', config=[('ext', {'shell': {'theme': 'default_leftonly'}})])).renderer.render()
|
||||
|
||||
def test_ipython(self):
|
||||
from powerline.ipython import IpythonPowerline
|
||||
|
||||
class IpyPowerline(IpythonPowerline):
|
||||
path = None
|
||||
config_overrides = None
|
||||
theme_overrides = {}
|
||||
|
||||
IpyPowerline().renderer.render()
|
||||
|
||||
def test_wm(self):
|
||||
from powerline.segments import common
|
||||
from imp import reload
|
||||
reload(common)
|
||||
from powerline import Powerline
|
||||
with replace_module_attr(common, 'urllib_read', urllib_read):
|
||||
Powerline(ext='wm', renderer_module='pango_markup').renderer.render()
|
||||
reload(common)
|
||||
|
||||
|
||||
old_cwd = None
|
||||
|
@ -1,5 +1,5 @@
|
||||
# vim:fileencoding=utf-8:noet
|
||||
from powerline.lib import mergedicts, underscore_to_camelcase, add_divider_highlight_group, humanize_bytes
|
||||
from powerline.lib import mergedicts, add_divider_highlight_group, humanize_bytes
|
||||
from powerline.lib.vcs import guess
|
||||
from subprocess import call, PIPE
|
||||
import os
|
||||
@ -8,10 +8,6 @@ from tests import TestCase
|
||||
|
||||
|
||||
class TestLib(TestCase):
|
||||
def test_underscore_to_camelcase(self):
|
||||
self.assertEqual(underscore_to_camelcase('abc_def_ghi'), 'AbcDefGhi')
|
||||
self.assertEqual(underscore_to_camelcase('abc_def__ghi'), 'AbcDef_Ghi')
|
||||
|
||||
def test_mergedicts(self):
|
||||
d = {}
|
||||
mergedicts(d, {'abc': {'def': 'ghi'}})
|
||||
|
Loading…
x
Reference in New Issue
Block a user