在vimscript中使用Python:如何将Python脚本中的值导出回vim?
我正在vim中与Python进行斗争。在vimscript中使用Python:如何将Python脚本中的值导出回vim?,python,variables,vim,Python,Variables,Vim,我正在vim中与Python进行斗争。 我仍然没有找到如何从python脚本(在vim函数中)将值导入回vim p.e function! myvimscript() python << endpython import vim, random, sys s = vim.eval("mylist") # do operation with variable "s" in python endpython " import variable "s
我仍然没有找到如何从python脚本(在vim函数中)将值导入回vim p.e
function! myvimscript()
python << endpython
import vim, random, sys
s = vim.eval("mylist")
# do operation with variable "s" in python
endpython
" import variable "s" from above
" do operation with "s" in vimscript
endfunction
2) 如何将动态值
“start”
和“end”
分配给“l”
首先,请定义以大写字母开头的函数名
下面是两个问题的示例。我希望这有助于:
function! TestPy() range
let startline = line("'<")
let endline = line("'>")
echo "vim-start:".startline . " vim-endline:".endline
python << EOF
import vim
s = "I was set in python"
vim.command("let sInVim = '%s'"% s)
start = vim.eval("startline")
end = vim.eval("endline")
print "start, end in python:%s,%s"% (start, end)
EOF
echo sInVim
endfunction
所以我稍微解释一下输出,为了理解下面的注释,您可能需要稍微阅读一下示例函数代码
vim-start:3 vim-endline:5 #this line was printed in vim, by vim's echo.
start, end in python:3,5 # this line was prrinted in py, using the vim var startline and endline. this answered your question two.
I was set in python # this line was printed in vim, the variable value was set in python. it answered your question one.
我为您的函数添加了一个范围
。因为,如果您没有它,对于每个可视选择的行,vim将调用您的函数一次。在我的示例中,函数将执行3次(3,4,5)。对于范围,它将作为一个范围处理visualselection。这个例子就足够了。如果实际函数将执行其他操作,则可以删除范围
使用
范围
,最好使用a:firstline和a:lastline
。从v7.3.569开始,我使用了行(“),vim内置函数pyeval()
和py3eval()
允许您计算python表达式,并将其结果作为vimscript值返回。它可以处理简单的标量值,也可以处理列表和字典-请参见:help pyeval()
On 1):对于在vim中使用python定义的变量:
python << endPython
py_var = 8
endPython
let vim_var = pyeval('py_var')
简而言之,python:
或
其中,vimvar
是一个vim变量,可以是b:w:t:g:l:s:a:v:
,'pyvalue'
是一个python变量。这是从bash脚本运行的python脚本吗?@TallPaul,在vimscript中运行的Un-pythonscript(在vimrc中通过映射调用)相关:。很好的解释,肯特!但是如果s
不是一个字符串而是一个列表呢。它给出了vim.command的错误(“让sInVim='%s'%s”)
非常感谢。我会进一步研究你的答案。你给了我这么多信息。但是现在一切都很好!现在有了你的信息,我正试图用python测试一个随机函数。:py import vim,random as r;cb=vim.current.buffer;start=vim.eval('line('find the solution:)我必须将变量“start”和“end”声明为整数:)对于全局变量,对于vim.command(“let sInVim='%s''%s')%s)
:vim.vars[“sInVim”]=s
我使用这个:python@Reman:pyeval
可能有助于使用现有的python库,它们通常不知道vim
上下文。另外,使用vim.command
,列表和字典可能会因为潜在的引用问题而变得更加脆弱。RippleFlash是否也适用于Python 3.7?我在…pyeval()中更改了一些vim.command:“找不到python库2.7”-我不使用python 2.7RippleFlash,如果列表或字典只有整数怎么办?py3eval()无法转换对象:E859:无法将返回的python对象转换为vim值
@Reman,py3eval(“[1,2,3]”)和py3eval(“{'foo':1}”)
似乎可以工作,但py3eval({1:'foo'}”)
不能(在vim 8.1.1137中试用)。根据:help Dictionary
,vim总是使用字符串作为dict键,也许这就是为什么它在这种情况下失败的原因。我能想到的最好方法是对dict键进行字符串化,即defconvert(d):在python中返回{str(k):v代表k,在d.items()中返回v
,在vim中返回py3eval(“convert({1:'foo'))
。
vim-start:3 vim-endline:5 #this line was printed in vim, by vim's echo.
start, end in python:3,5 # this line was prrinted in py, using the vim var startline and endline. this answered your question two.
I was set in python # this line was printed in vim, the variable value was set in python. it answered your question one.
function! TestPy2()
python << EOF
import vim
s = range(10)
vim.command("let sInVim = %s"% s)
EOF
echo type(sInVim)
echo sInVim
endfunction
3
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
python << endPython
py_var = 8
endPython
let vim_var = pyeval('py_var')
python << endPython
import vim
cb = vim.current.buffer
start = int(vim.eval("""line("'<")"""))
end = int(vim.eval("""line("'>")"""))
lines = cb[(start - 1) : end]
endPython
let lines = pyeval('lines')
let lines = getline("'<", "'>")
:py3 vim.command("let vimvar = '%s'" % 'pyvalue')
:let vimvar = py3eval("'pyvalue'")