Ответ 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()). и одна строка ниже представляет собой строковое представление списка.