如果我有两个功能:
function! foo()
python3 << HERE
import mylib
pass
HERE
function! bar()
python3 << HERE
import mylib
pass
HERE
src说:
1. Python interpreter main program
3. Implementation of the Vim module for Python
因此,嵌入在vim中的python解释器是另外的,是对python提供的单独扩展(VIM API的包装函数)
mylib编译成字节码并加载了多少次?每个vimscript函数是否都有自己的mylib - 我可以实例化某些内容并期望它在另一个函数中可见吗?我有一堆领导函数,它们共享相似的代码并在同一个缓冲区上运行,因此我想知道我是否可以重用该数据结构。 解释器加载到内存中的次数是多少次:显然是在vim运行时。
答案 0 :(得分:1)
sys.modules
中缓存导入的模块,因此每个Vim实例都会加载一次mylib。*.pyc
文件中,因此mylib在每次更新时编译一次(假设Python能够检测到此更新;通常它没有问题)。在任何情况下,不要使用python << EOF
,所有插件应始终使用命名空间函数:例如。
为:
python << EOF
from y import foo, bar
def my_function1():
foo()
def my_function2(i):
bar(i)
for i in range(2):
my_function1()
my_function2(i)
EOF
好:
# pythonx/mymodule.py
from y import foo, bar
def my_function1():
foo()
def my_function2(i):
bar(i)
def start():
for i in range(2):
my_function1()
my_function2(i)
" plugin/myscript.vim
python import mymodule; mymodule.start()
推理:
my_function1
模块全局命名空间中出现了my_function2
,foo
,bar
,i
,__main__
的所有内容。如果你安装了一些不符合良好实践的插件(它们有很多)并且它似乎定义了不同的foo
或bar
,那么你的插件将无效。或者,如果它恰好在您的插件之前加载,该插件将无效。python << EOF
时都会重新编译。