Rem*_*man 18 python variables vim
我在vim中挣扎着Python.
我还没有发现如何将python脚本(在vim函数中)中的值导回到vim pe
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
Run Code Online (Sandbox Code Playgroud)
1)如何"s"在vim中再次使用(如何"s"从python代码导入vim)?
我无法找到如何使用vim.current.buffer选择.
function! myvimscript()
let startline = line("'<")
let endline = line("'>")
python << endpython
start = vim.eval("startline")
end = vim.eval("endline")
cb = vim.current.buffer
l = cb[start:end]
endpython
endfunction
Run Code Online (Sandbox Code Playgroud)
2)我如何分配动态值"start",并"end"以"l"
Ken*_*ent 24
首先,请定义以大写字母开头的函数名称.
以下是您的两个问题的示例.我希望它有所帮助:
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
Run Code Online (Sandbox Code Playgroud)
首先我粘贴一个小测试的输出:我视觉选择3,4,5,三行,和 :call TestPy()
我有的输出:
vim-start:3 vim-endline:5
start, end in python:3,5
I was set in python
Run Code Online (Sandbox Code Playgroud)
所以我稍微解释一下输出,你可能需要阅读一些示例函数代码,以便理解下面的注释.
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.
Run Code Online (Sandbox Code Playgroud)
我range为你的功能添加了一个.因为,如果你没有它,对于每个视觉选择的行,vim将调用你的函数一次.在我的例子中,该函数将被执行3次(3,4,5).对于范围,它将视觉选择作为范围处理.这个例子就足够了.如果你的真实功能会做其他事情,你可以删除range.
随着range,更好a:firstline and a:lastline.我用line("'<")它来保持它和你的代码一样.
使用列表变量编辑:
检查这个功能:
function! TestPy2()
python << EOF
import vim
s = range(10)
vim.command("let sInVim = %s"% s)
EOF
echo type(sInVim)
echo sInVim
endfunction
Run Code Online (Sandbox Code Playgroud)
如果你调用它,输出是:
3
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
"3"表示类型列表(检查type()函数).下面的一行是列表的字符串表示.
从 v7.3.569 开始,vim 内置函数pyeval()允许py3eval()您计算 python 表达式,并将其结果作为 vimscript 值返回。它可以处理简单的标量值,还可以处理列表和字典 - 请参阅:help pyeval()
1):在 vim 中使用 python 定义的变量:
python << endPython
py_var = 8
endPython
let vim_var = pyeval('py_var')
Run Code Online (Sandbox Code Playgroud)
关于 2):我假设您希望缓冲区行最后在可视模式下突出显示,作为 vimscript 中的字符串列表:
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')
Run Code Online (Sandbox Code Playgroud)
注意:这是一个有点人为的示例,因为您可以直接在 vimscript 中获得相同的结果:
let lines = getline("'<", "'>")
Run Code Online (Sandbox Code Playgroud)