2013-07-15 4 views
15

Ich kämpfe mit Python in vim.
Ich habe immer noch nicht herausgefunden, wie ich einen Wert aus einem Python-Skript (in einer Vim-Funktion) zurück zu Vim p.e importieren kann.Verwendung von Python in vimscript: Wie exportiert man einen Wert aus einem Python-Skript zurück in vim?

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) Wie kann ich "s" wieder in vim (wie kann ich "s" aus dem Python-Code zurück zu vim importieren)?

Ich kann nicht herausfinden, wie vim.current.buffer mit einer Auswahl auch zu verwenden ist.

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) Wie kann ich den dynamischen Wert "start" und "end"-"l"

+0

ist dies ein Python-Skript, das von einem Bash-Skript ausgeführt wird? –

+0

@TallPaul, Un pythonscript läuft in einem vimscript (und aufgerufen mit einer map in vimrc) – Reman

+0

Related: [Wie bekomme ich den Wert von einer Funktion in Python & Vimscript zurückgegeben?] (Http://stackoverflow.com/q/ 16756613). – glts

Antwort

16

Zunächst einmal zuweisen, definieren Sie bitte Ihre Funktionsnamen mit Großbuchstaben beginnen.

Hier ist ein Beispiel für Ihre zwei Fragen. Ich hoffe, es hilft:

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 

ersten ich die Ausgabe eines kleinen Prüfpaste: Ich visuelle 3,4,5 ausgewählt, drei Linien, und :call TestPy()

Der Ausgang hatte ich:

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

Also erkläre ich die Ausgabe ein wenig, müssen Sie die Beispielfunktionscodes ein wenig zum Verständnis des Kommentars unten lesen.

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. 

Ich fügte eine range für Ihre Funktion hinzu. Denn wenn Sie es nicht haben, ruft vim für jede visuell ausgewählte Zeile Ihre Funktion einmal auf. In meinem Beispiel wird die Funktion 3 mal ausgeführt (3,4,5). Mit der Reichweite wird die visuelle Auswahl als Bereich gehandhabt. Es ist ausreichend für dieses Beispiel. Wenn Ihre echte Funktion etwas anderes tun wird, können Sie die range entfernen.

Mit range, besser mit a:firstline and a:lastline. Ich benutze die line("'<") nur für die gleichen wie Ihre Codes.

EDIT mit Listenvariable:

Check diese Funktion:

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

wenn Sie es nennen, ist der Ausgang:

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

die "3" bedeutet Typenliste (Überprüfen Sie die Funktion type(). und eine Zeile darunter ist die Zeichenfolgendarstellung der Liste.

+0

großartige Erklärung Kent! Aber was ist, wenn 's' keine Zeichenfolge ist, sondern eine Liste? Es gibt Fehler mit 'vim.command (" Lassen Sie sInVim = '% s' "% s)' – Reman

+1

@Remonn überprüfen EDIT – Kent

+0

Vielen Dank. Ich werde deine Antwort ein wenig mehr studieren. Du hast mir so viele Informationen gegeben.Aber jetzt funktioniert alles gut! – Reman

Verwandte Themen