From 35e723e09374c1c65d572df1a2dbcd9ca6b841d5 Mon Sep 17 00:00:00 2001 From: ZyX Date: Wed, 15 May 2013 00:15:02 +0400 Subject: [PATCH] Move code to powerline.vim.setup --- powerline/bindings/vim/plugin/powerline.vim | 40 ++++----------- powerline/vim.py | 56 ++++++++++++++++++--- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/powerline/bindings/vim/plugin/powerline.vim b/powerline/bindings/vim/plugin/powerline.vim index 554cad3b..78e9ff53 100644 --- a/powerline/bindings/vim/plugin/powerline.vim +++ b/powerline/bindings/vim/plugin/powerline.vim @@ -15,18 +15,18 @@ if ! has('python') && ! has('python3') finish endif -let s:powerline_pycmd = substitute(get(g:, 'powerline_pycmd', has('python') ? 'py' : 'py3'), +let s:pycmd = substitute(get(g:, 'powerline_pycmd', has('python') ? 'py' : 'py3'), \'\v^(py)%[thon](3?)$', '\1\2', '') -let s:powerline_pyeval = get(g:, 'powerline_pyeval', s:powerline_pycmd.'eval') +let s:pyeval = get(g:, 'powerline_pyeval', s:pycmd.'eval') -let s:import_cmd = 'from powerline.vim import VimPowerline' +let s:import_cmd = 'from powerline.vim import setup as powerline_setup' try - exec s:powerline_pycmd "try:\n" - \ ." ".s:import_cmd."\n" - \ ."except ImportError:\n" - \ ." import sys, vim\n" - \ ." sys.path.append(vim.eval('expand(\":h:h:h:h:h\")'))\n" - \ ." ".s:import_cmd + execute s:pycmd "try:\n" + \ ." ".s:import_cmd."\n" + \ ."except ImportError:\n" + \ ." import sys, vim\n" + \ ." sys.path.append(vim.eval('expand(\":h:h:h:h:h\")'))\n" + \ ." ".s:import_cmd let s:launched = 1 finally if !exists('s:launched') @@ -40,23 +40,5 @@ finally endif endtry -if !get(g:, 'powerline_debugging_pyeval') && exists('*'. s:powerline_pyeval) - let PowerlinePyeval = function(s:powerline_pyeval) -else - exec s:powerline_pycmd 'import json, vim' - exec "function! PowerlinePyeval(e)\n". - \ s:powerline_pycmd." vim.command('return ' + json.dumps(eval(vim.eval('a:e'))))\n". - \"endfunction" -endif - -augroup Powerline - autocmd! ColorScheme * :exec s:powerline_pycmd 'powerline.reset_highlight()' - autocmd! VimEnter * :redrawstatus! - autocmd! VimLeavePre * :exec s:powerline_pycmd 'powerline.shutdown()' -augroup END - -exec s:powerline_pycmd 'powerline = VimPowerline()' -exec s:powerline_pycmd 'del VimPowerline' -" Is immediately changed when PowerlineNew() function is run. Good for global -" value. -set statusline=%!PowerlinePyeval('powerline.new_window()') +execute s:pycmd 'powerline_setup(pyeval=vim.eval("s:pyeval"), pycmd=vim.eval("s:pycmd"))' +execute s:pycmd 'del powerline_setup' diff --git a/powerline/vim.py b/powerline/vim.py index a0cbdc3c..a132f4ea 100644 --- a/powerline/vim.py +++ b/powerline/vim.py @@ -9,6 +9,9 @@ from powerline.matcher import gen_matcher_getter import vim from itertools import count +if not hasattr(vim, 'bindeval'): + import json + vim_exists = vim_get_func('exists', rettype=int) vim_getwinvar = vim_get_func('getwinvar') @@ -26,13 +29,11 @@ def _override_from(config, override_varname): return config -WINDOW_STASUSLINE = '%!PowerlinePyeval(\'powerline.statusline({0})\')' - - class VimPowerline(Powerline): - def __init__(self): + def __init__(self, pyeval='PowerlinePyeval'): super(VimPowerline, self).__init__('vim') self.last_window_id = 1 + self.window_statusline = '%!' + pyeval + '(\'powerline.statusline({0})\')' def add_local_theme(self, key, config): '''Add local themes at runtime (during vim session). @@ -111,7 +112,7 @@ class VimPowerline(Powerline): curwindow_id = self.last_window_id self.last_window_id += 1 window.vars['powerline_window_id'] = curwindow_id - statusline = WINDOW_STASUSLINE.format(curwindow_id) + statusline = self.window_statusline.format(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: @@ -129,7 +130,7 @@ class VimPowerline(Powerline): curwindow_id = self.last_window_id self.last_window_id += 1 vim_setwinvar(winnr, 'powerline_window_id', curwindow_id) - statusline = WINDOW_STASUSLINE.format(curwindow_id) + statusline = self.window_statusline.format(curwindow_id) if vim_getwinvar(winnr, '&statusline') != statusline: vim_setwinvar(winnr, '&statusline', statusline) if curwindow_id == window_id if window_id else window is vim.current.window: @@ -146,3 +147,46 @@ class VimPowerline(Powerline): def new_window(self): window, window_id, winnr = self.win_idx(None) return self.render(window, window_id, winnr) + + if not hasattr(vim, 'bindeval'): + # Method for PowerlinePyeval function. Is here to reduce the number of + # requirements to __main__ globals to just one powerline object + # (previously it required as well vim and json) + @staticmethod + def pyeval(): + vim.command('return ' + json.dumps(eval(vim.eval('a:e')))) + + +def setup(pyeval=None, pycmd=None): + import sys + import __main__ + if not pyeval: + pyeval = 'pyeval' if sys.version_info < (3,) else 'py3eval' + if not pycmd: + pycmd = 'python' if sys.version_info < (3,) else 'python3' + + # pyeval() and vim.bindeval were both introduced in one patch + if not hasattr(vim, 'bindeval'): + vim.command((''' + function! PowerlinePyeval(e) + {pycmd} powerline.pyeval() + endfunction + ''').format(pycmd=pycmd)) + pyeval = 'PowerlinePyeval' + + powerline = VimPowerline(pyeval) + __main__.powerline = powerline + + # Cannot have this in one line due to weird newline handling (in :execute + # context newline is considered part of the command in just the same cases + # when bar is considered part of the command (unless defining function + # inside :execute)). vim.command is :execute equivalent regarding this case. + vim.command('augroup Powerline') + vim.command(' autocmd! ColorScheme * :{pycmd} powerline.reset_highlight()'.format(pycmd=pycmd)) + vim.command(' autocmd! VimEnter * :redrawstatus!') + vim.command(' autocmd! VimLeavePre * :{pycmd} powerline.shutdown()'.format(pycmd=pycmd)) + vim.command('augroup END') + + # Is immediately changed after new_window function is run. Good for global + # value. + vim.command('set statusline=%!{pyeval}(\'powerline.new_window()\')'.format(pyeval=pyeval))