21

我在 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

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

2)如何分配动态值"start""end""l"

4

3 回答 3

26

首先,请定义以大写开头的函数名称。

这是您的两个问题的示例。我希望它有帮助:

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("'<")just 来保持它与您的代码相同。

使用列表变量编辑:

检查此功能:

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

于 2013-07-15T14:57:06.950 回答
4

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

On 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')

注意:这是一个有点做作的例子,因为你可以直接在 vimscript 中得到相同的结果:

let lines = getline("'<", "'>")
于 2019-05-30T18:52:04.883 回答
1

简而言之:

:py3 vim.command("let vimvar = '%s'" % 'pyvalue')

或者

:let vimvar = py3eval("'pyvalue'")

哪里vimvar是 vim 变量,可以是b: w: t: g: l: s: a: v:并且'pyvalue'是 python 变量。

于 2019-12-12T05:53:37.583 回答