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

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()函数).下面的一行是列表的字符串表示.


rip*_*ash 5

从 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)