如果我有两个函数:
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
因此,python解释器是否嵌入在vim中?此外,它们是对python的单独扩展(vim API的包装器函数)
mylib编译成字节码并加载了多少次?每个vimscript函数都有自己的mylib吗?我可以实例化一些东西并期望它在另一个函数中可见吗?我有一堆leader函数,它们共享相似的代码,并在同一个缓冲区上运行,所以我想知道是否可以重用该数据结构。解释器被加载到内存中的次数:一次显然是在vim运行时。
- Python解释器确实加载过一次
- Python解释器在
sys.modules
中缓存导入的模块,因此mylib在每个Vim实例中加载一次 - Python解释器将编译后的字节码缓存在文件系统的
*.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
每次被调用时都会被重新编译