2013-07-15 31 views
15

我在vim中苦苦挣扎。
我还没有找到我如何可以从python脚本(在vim函数中)将值导回到vim p.e.在vimscript中使用Python:如何将值从python脚本导出回vim?

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 

1)如何能在我的vim再次使用"s"(我怎么可以导入"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 

2)我怎样才能分配动态值"start""end""l"

+0

这是一个从bash脚本运行的python脚本吗? –

+0

@TallPaul,Un pythonscript在vimscript中运行(并用vimrc中的地图调用) – Reman

+0

相关:[如何从Python&Vimscript中的函数返回值?](http://stackoverflow.com/q/ 16756613)。 – glts

回答

16

首先,请确定启动以大写的函数名。

下面是你的两个问题的例子。我希望它能帮助:

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 

首先我贴上一个小的测试输出:选择3,4,5,三线我的视觉和:call TestPy()

输出我:

vim-start:3 vim-endline:5 
start, end in python:3,5 
I was set in python 

所以我将输出解释一下,您可能需要阅读示例功能代码以了解下面的注释。

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. 

我为您的功能添加了一个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 

,如果你把它的输出是:

3 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

“3” 是指类型列表中(检查type()函数)。下面一行是列表的字符串表示。

+0

伟大的解释肯特!但是,如果's'不是一个字符串,而是一个列表。它给'vim.command(“let sInVim ='%s'”%s)' – Reman

+1

@Remonn检查编辑 – Kent

+0

非常感谢。我会更多地研究你的答案。你给了我这么多的信息。但现在一切正常! – Reman