2013-07-15 17 views
15

Ben vizyonda Python ile uğraşıyorum.
Hala bir python betiğinden (vim işlevinde) bir değeri nasıl alıp vim p.e.Vimscript içinde Python kullanma: Bir python komut dosyasından vim'e bir değer nasıl aktarılır?

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) nasıl (nasıl) geri vim piton kodundan "s" alabilirsiniz vim tekrar "s" kullanabilir?

Vim.current.buffer'ın bir seçim ile nasıl kullanılacağını da bulamıyorum. Ben her "l"

+0

bu bir bash komut dosyasından çalışan bir python betiğidir? –

+0

@TallPaul, Bir vimscript içinde çalışan pythonscript (ve vimrc'de bir harita ile çağrılır) – Reman

+0

İlgili: [Python ve Vimscript'deki bir işlevden döndürülen değeri nasıl alabilirim?] (Http://stackoverflow.com/q/ 16.756.613). – glts

cevap

16

Birinci dinamik değeri "start" ve "end" atayabilirsiniz nasıl

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), büyük harf ile başlayarak işlev adı tanımlar mısınız.

İki sorunuz için bir örnek. üç satır, 3,4,5 seçilmiş Görsel ve :call TestPy()

vardı çıktı:

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 

ilk ben küçük testin çıktısını yapıştırın: Ben yardımcı olur umarım

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

Bu yüzden çıktıyı biraz açıklarım, aşağıdaki açıklamaları anlamak için örnek işlev kodlarını biraz okumalısınız. Bu işlev için range ekledim. çünkü, eğer yoksa, görsel olarak seçilen her satır için, vim işlevinizi bir kez çağırır. Benim örneğimde, işlev 3 kez (3,4,5) yürütülecek. aralıklı, görsel seçim bir dizi olarak ele alacaktır. Bu örnek için yeterlidir. Gerçek işleviniz başka bir şey yapacaksa, range'u kaldırabilirsiniz.

range ile ile daha iyi. Kodlarınızla aynı kaldığı için line("'<")'u kullandım. Liste değişkenle

DÜZENLEME:

onay bu işlevi: eğer arama

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

, çıkışı:

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

"3" tipi listesi (anlamına gelir kontrol tipi() işlevi). ve aşağıda bir satır liste dize gösterimi.

+0

Harika bir açıklama Kent! Ama ya bir dize değil, bir liste ise. Vim.command ile hatalar verir ("let sInVim = '% s'"% s) ' – Reman

+1

@Remonn onay EDIT – Kent

+0

Çok teşekkür ederim. Cevabınızı biraz daha çalışacağım. Bana çok fazla bilgi verdin.Ama şimdi her şey iyi çalışıyor! – Reman

İlgili konular