Использование Python в vimscript: как экспортировать значение из python script обратно в vim?

Я борюсь с Python в vim.
Я до сих пор не понял, как я могу импортировать значение из python script (в функции 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

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"

Ответы

Ответ 1

Прежде всего, укажите имя своей функции, начиная с прописного.

Вот пример для ваших двух вопросов. Надеюсь, это поможет:

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 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). с диапазоном, он будет обрабатывать visualselection как диапазон. Этого достаточно для этого примера. Если ваша реальная функция сделает что-то еще, вы можете удалить range.

С range, лучше с a:firstline and a:lastline. Я использовал line("'<") только для того, чтобы сохранить его так же, как ваши коды.

EDIT со списком:

проверьте эту функцию:

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" означает список типов (функция check type()). и одна строка ниже представляет собой строковое представление списка.