Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vimscript中使用Python:如何将Python脚本中的值导出回vim?_Python_Variables_Vim - Fatal编程技术网

在vimscript中使用Python:如何将Python脚本中的值导出回vim?

在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

我正在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" 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'")