Move code to powerline.vim.setup

This commit is contained in:
ZyX 2013-05-15 00:15:02 +04:00
parent 0823f29f7d
commit 35e723e093
2 changed files with 61 additions and 35 deletions

View File

@ -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(\"<sfile>: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(\"<sfile>: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'

View File

@ -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))