Merge pull request #1011 from ZyX-I/old-vims

Improve Vim bindings
This commit is contained in:
Nikolai Aleksandrovich Pavlov 2014-08-24 13:57:08 +04:00
commit c2f35ca76e
4 changed files with 70 additions and 49 deletions

View File

@ -19,7 +19,9 @@ Python headers to be installed on your system. Please consult your
distribution's documentation for details on how to compile and install
packages.
Vim version 7.3.661 or newer is recommended for performance reasons.
Vim version 7.4 or newer is recommended for performance reasons, but Powerline
is known to work on vim-7.0.112 (some segments may not work though as it was not
actually tested).
.. _usage-terminal-emulators:

View File

@ -20,6 +20,7 @@ if exists('g:powerline_pycmd')
echomsg 'specify g:powerline_pyeval explicitly or unset both and let powerline'
echomsg 'figure them out.'
echohl None
unlet s:pycmd
finish
endif
let s:pyeval = g:powerline_pyeval
@ -45,24 +46,38 @@ if !s:has_python
echomsg 'details.'
echohl None
endif
unlet s:has_python
finish
endif
unlet s:has_python
let s:import_cmd = 'from powerline.vim import VimPowerline'
function s:rcmd(s)
if !exists('s:pystr')
let s:pystr = a:s . "\n"
else
let s:pystr = s:pystr . a:s . "\n"
endif
endfunction
try
let s:pystr = "try:\n"
let s:pystr .= " ".s:import_cmd."\n"
let s:pystr .= "except ImportError:\n"
let s:pystr .= " import sys, vim\n"
let s:pystr .= " sys.path.append(vim.eval('expand(\"<sfile>:h:h:h:h:h\")'))\n"
let s:pystr .= " ".s:import_cmd."\n"
let s:can_replace_pyeval = !exists('g:powerline_pyeval')
call s:rcmd("try:")
call s:rcmd(" ".s:import_cmd."")
call s:rcmd("except ImportError:")
call s:rcmd(" import sys, vim")
call s:rcmd(" sys.path.append(vim.eval('expand(\"<sfile>:h:h:h:h:h\")'))")
call s:rcmd(" ".s:import_cmd."")
call s:rcmd("import vim")
call s:rcmd("VimPowerline().setup(pyeval=vim.eval('s:pyeval'), pycmd=vim.eval('s:pycmd'), can_replace_pyeval=int(vim.eval('s:can_replace_pyeval')))")
call s:rcmd("del VimPowerline")
execute s:pycmd s:pystr
unlet s:pystr
let s:launched = 1
finally
unlet s:can_replace_pyeval
unlet s:import_cmd
if !exists('s:launched')
unlet s:pystr
echohl ErrorMsg
echomsg 'An error occurred while importing powerline package.'
echomsg 'This could be caused by invalid sys.path setting,'
@ -75,54 +90,52 @@ finally
echomsg 'should set g:powerline_pycmd to "py3" to make it load correctly.'
endif
echohl None
let s:pystr = "def powerline_troubleshoot():\n"
let s:pystr .= " import sys\n"
let s:pystr .= " if sys.version_info < (2, 6):\n"
let s:pystr .= " print('Too old python version: ' + sys.version + ' (first supported is 2.6)')\n"
let s:pystr .= " elif sys.version_info[0] == 3 and sys.version_info[1] < 2:\n"
let s:pystr .= " print('Too old python 3 version: ' + sys.version + ' (first supported is 3.2)')\n"
let s:pystr .= " try:\n"
let s:pystr .= " import powerline\n"
let s:pystr .= " except ImportError:\n"
let s:pystr .= " print('Unable to import powerline, is it installed?')\n"
if expand('<sfile>')[:4] isnot# '/usr/'
let s:pystr .= " else:\n"
let s:pystr .= " import os\n"
let s:pystr .= " powerline_dir = os.path.dirname(os.path.realpath(powerline.__file__))\n"
let s:pystr .= " this_dir = os.path.dirname(os.path.realpath(vim.eval('expand(\"<sfile>:p\")')))\n"
let s:pystr .= " this_dir = os.path.dirname(os.path.dirname(os.path.dirname(this_dir)))\n"
let s:pystr .= " if os.path.basename(this_dir) != 'powerline':\n"
let s:pystr .= " print('Check your installation:')\n"
let s:pystr .= " print('this script is not in powerline[/bindings/vim/plugin] directory,')\n"
let s:pystr .= " print('neither it is installed system-wide')\n"
let s:pystr .= " this_dir = os.path.dirname(this_dir)\n"
let s:pystr .= " real_powerline_dir = os.path.realpath(powerline_dir)\n"
let s:pystr .= " real_this_dir = os.path.realpath(this_dir)\n"
let s:pystr .= " if real_this_dir != sys.path[-1]:\n"
let s:pystr .= " print('Check your installation:')\n"
let s:pystr .= " print('this script is symlinked somewhere where powerline is not present.')\n"
let s:pystr .= " elif real_powerline_dir != real_this_dir:\n"
let s:pystr .= " print('It appears that you have two powerline versions installed:')\n"
let s:pystr .= " print('one in ' + real_powerline_dir + ', other in ' + real_this_dir + '.')\n"
let s:pystr .= " print('You should remove one of this. Check out troubleshooting section,')\n"
let s:pystr .= " print('it contains some information about the alternatives.')\n"
call s:rcmd( "def powerline_troubleshoot():")
call s:rcmd( " import sys")
call s:rcmd( " if sys.version_info < (2, 6):")
call s:rcmd( " print('Too old python version: ' + sys.version + ' (first supported is 2.6)')")
call s:rcmd( " elif sys.version_info[0] == 3 and sys.version_info[1] < 2:")
call s:rcmd( " print('Too old python 3 version: ' + sys.version + ' (first supported is 3.2)')")
call s:rcmd( " try:")
call s:rcmd( " import powerline")
call s:rcmd( " except ImportError:")
call s:rcmd( " print('Unable to import powerline, is it installed?')")
if strpart(expand('<sfile>'), 0, 5) !=# '/usr/'
call s:rcmd(" else:")
call s:rcmd(" import os")
call s:rcmd(" powerline_dir = os.path.dirname(os.path.realpath(powerline.__file__))")
call s:rcmd(" this_dir = os.path.dirname(os.path.realpath(vim.eval('expand(\"<sfile>:p\")')))")
call s:rcmd(" this_dir = os.path.dirname(os.path.dirname(os.path.dirname(this_dir)))")
call s:rcmd(" if os.path.basename(this_dir) != 'powerline':")
call s:rcmd(" print('Check your installation:')")
call s:rcmd(" print('this script is not in powerline[/bindings/vim/plugin] directory,')")
call s:rcmd(" print('neither it is installed system-wide')")
call s:rcmd(" this_dir = os.path.dirname(this_dir)")
call s:rcmd(" real_powerline_dir = os.path.realpath(powerline_dir)")
call s:rcmd(" real_this_dir = os.path.realpath(this_dir)")
call s:rcmd(" if real_this_dir != sys.path[-1]:")
call s:rcmd(" print('Check your installation:')")
call s:rcmd(" print('this script is symlinked somewhere where powerline is not present.')")
call s:rcmd(" elif real_powerline_dir != real_this_dir:")
call s:rcmd(" print('It appears that you have two powerline versions installed:')")
call s:rcmd(" print('one in ' + real_powerline_dir + ', other in ' + real_this_dir + '.')")
call s:rcmd(" print('You should remove one of this. Check out troubleshooting section,')")
call s:rcmd(" print('it contains some information about the alternatives.')")
endif
call s:rcmd( "try:")
call s:rcmd( " powerline_troubleshoot()")
call s:rcmd( "finally:")
call s:rcmd( " del powerline_troubleshoot")
execute s:pycmd s:pystr
unlet s:pystr
unlet s:pycmd
unlet s:pyeval
delfunction s:rcmd
finish
else
unlet s:launched
endif
unlet s:pycmd
unlet s:pyeval
delfunction s:rcmd
endtry
let s:can_replace_pyeval = !exists('g:powerline_pyeval')
execute s:pycmd 'import vim'
execute s:pycmd 'VimPowerline().setup(pyeval=vim.eval("s:pyeval"), pycmd=vim.eval("s:pycmd"), can_replace_pyeval=int(vim.eval("s:can_replace_pyeval")))'
execute s:pycmd 'del VimPowerline'
unlet s:can_replace_pyeval
unlet s:pycmd
unlet s:pyeval

View File

@ -18,6 +18,10 @@ except ImportError:
vim_mode = vim_get_func('mode', rettype=str)
if int(vim.eval('v:version')) >= 702:
_vim_mode = vim_mode
vim_mode = lambda: _vim_mode(1)
mode_translations = {
chr(ord('V') - 0x40): '^V',
chr(ord('S') - 0x40): '^S',
@ -89,7 +93,7 @@ class VimRenderer(Renderer):
segment_info = self.segment_info.copy()
if window is vim.current.window:
mode = vim_mode(1)
mode = vim_mode()
mode = mode_translations.get(mode, mode)
else:
mode = 'nc'

View File

@ -229,6 +229,8 @@ def command(cmd):
def eval(expr):
if expr.startswith('g:'):
return vars[expr[2:]]
elif expr.startswith('v:'):
return vvars[expr[2:]]
elif expr.startswith('&'):
return options[expr[1:]]
elif expr.startswith('$'):