2013-07-15 13 views
15

Walczę z Pythonem w vimie.
Nadal nie dowiedziałem się, jak mogę zaimportować wartość ze skryptu Pythona (w funkcji vim) z powrotem do vim p.e.Używanie Pythona w vimscript: Jak wyeksportować wartość ze skryptu Pythona z powrotem do vima?

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) Jak mogę używać "s" ponownie w vim (jak mogę importować "s" z kodu Pythona z powrotem do vim)?

Nie mogę się również dowiedzieć, jak używać vim.current.buffer z wyborem.

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) W jaki sposób można przypisać wartość dynamiczną "start" i "end" do "l"

+0

jest to skrypt Pythona uruchamiany ze skryptu Bash? –

+0

@TallPaul, Un pythonscript działa w vimscript (i wywoływana z mapą w vimrc) – Reman

+0

Powiązane: [Jak uzyskać wartość zwróconą przez funkcję w Pythonie i Vimscript?] (Http://stackoverflow.com/q/ 16756613). – glts

Odpowiedz

16

Przede wszystkim należy zdefiniować nazwę funkcji zaczynając od wielkiej litery.

Oto przykład dla dwóch pytań. Mam nadzieję, że to pomaga:

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 

pierwszy wklej wyjście małego testu: ja wizualny wybrany 3,4,5, trzy linie, a :call TestPy()

Wyjście miałem:

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

Wyjaśnię więc nieco wynik, może być konieczne przeczytanie przykładowych kodów funkcji w celu zrozumienia poniższego komentarza.

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. 

Dodałem range dla twojej funkcji. ponieważ, jeśli go nie masz, dla każdej linii zaznaczonej wizualnie vim wywoła twoją funkcję raz. w moim przykładzie funkcja zostanie wykonana 3 razy (3,4,5). z zasięgiem obsłuży wybór wizualny jako zasięg. Wystarczy na ten przykład. Jeśli twoja prawdziwa funkcja zrobi coś innego, możesz usunąć range.

Z range, lepiej z a:firstline and a:lastline. Użyłem line("'<") tylko po to, aby zachować to samo co kody.

EDIT ze zmiennej listy:

Kontrola ta funkcja:

function! TestPy2() 
python << EOF 
import vim 
s = range(10) 
vim.command("let sInVim = %s"% s) 
EOF 
    echo type(sInVim) 
    echo sInVim 
endfunction 

jeśli nazwać to, wyjście jest:

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

"3" oznacza wykaz typu (sprawdź funkcję type()). a jedna linia poniżej to ciąg znaków reprezentujący listę.

+0

wielkie wyjaśnienie Kent! Ale co jeśli 's' nie jest łańcuchem, ale listą. Daje błędy z 'vim.command (" let sInVim = '% s' "% s)' – Reman

+1

@Remonn check EDIT – Kent

+0

Dziękuję bardzo. Przeanalizuję twoją odpowiedź nieco bardziej. Dałeś mi tak dużo informacji.Ale teraz wszystko działa dobrze! – Reman

Powiązane problemy