在vim脚本中,只要vim是使用+python
功能构建的,就可以嵌入一些python代码。
function! IcecreamInitialize()
python << EOF
class StrawberryIcecream:
def __call__(self):
print('EAT ME')
EOF
endfunction
但是,有些人使用+python3
构建了vim。这为vim插件带来了一些兼容性问题。是否有一个通用命令可以调用计算机上安装的任何python版本?
答案 0 :(得分:3)
此代码段可以确定我们正在使用哪个Python版本并切换到它(Python代表安装的那个版本)。
if has('python')
command! -nargs=1 Python python <args>
elseif has('python3')
command! -nargs=1 Python python3 <args>
else
echo "Error: Requires Vim compiled with +python or +python3"
finish
endif
要加载python代码,我们首先要弄清楚它的位置(这里与Vim脚本位于同一目录下):
execute "Python import sys"
execute "Python sys.path.append(r'" . expand("<sfile>:p:h") . "')"
然后检查python模块是否可用。如果没有,请重新加载:
Python << EOF
if 'yourModuleName' not in sys.modules:
import yourModuleName
else:
import imp
# Reload python module to avoid errors when updating plugin
yourModuleName = imp.reload(yourModuleName)
EOF
两种称呼方式:
1.
" call the whole module
execute "Python yourModuleName"
" call a function from that module
execute "Python yourModuleName.aMethod()"
2
" Call a method using map
vnoremap <leader> c :Python yourModuleName.aMethod()<cr>
" Call a module or method using Vim function
vnoremap <leader> c :<c-u> <SID>yourFunctionName(visualmode())<cr>
function! s:YourFunctionName(someName)
Python YourFunctionName.aMethod(a:someName)
Python YourFunctionName
endfunction
答案 1 :(得分:1)
“heredoc”(<< EOF
)语法仅限于脚本:py
,:perl
等)命令;你不能使用普通字符串。在Vim中使用line-continuation有点痛苦。
出于这个原因,我会将Python代码放在一个单独的文件中,并将其传递给:py
或:py3
命令。
let mycode = join(readfile(expand('~/mycode.py')), "\n")
if has('python')
execute 'py ' . mycode
elseif has('python3')
execute 'py3 ' . mycode
else
echoe 'Your mother was a hamster'
endif
mycode.py
脚本:
import sys
import vim
print('This is mycode', sys.version)
vim.command(':echo "Hello"')
print(vim.eval('42'))
来自Python 2:
('This is mycode', '2.7.10 (default, May 26 2015, 04:16:29) \n[GCC 5.1.0]')
Hello
42
从Python 3开始:
This is mycode 3.4.3 (default, Mar 25 2015, 17:13:50)
[GCC 4.9.2 20150304 (prerelease)]
Hello
42