2015-06-19 33 views
8

vim, +python özelliği ile oluşturulduğu sürece, bir vim komut dosyasında bazı python kodlarının gömülmesi mümkündür.Genel: vim içinde python komutu?

function! IcecreamInitialize() 
python << EOF 
class StrawberryIcecream: 
    def __call__(self): 
     print('EAT ME') 
EOF 
endfunction 

Ancak bazı insanlar vim yerine +python3 ile inşa etmişlerdir. Bu vim eklentileri için bazı uyumluluk sorunları getirir. Bilgisayarda hangi python sürümü yüklü olduğunu belirten genel bir komut var mı?

+3

kısa cevap hayır. Daha uzun bir cevap ise, Python'un hangi sürümünün mevcut olduğunu test ederek, bir değişkeni "py" ya da "python" ya da "python3" şeklinde ayarlayıp bunu exec pod ile çağırarak özetleyebilirsiniz. 'yazdır ("EAT ME")' '. Evet, iyi olduğunu söylemedim. – lcd047

cevap

1

"heredoc" (<< EOF) sözdizimi) komut :py, :perl vb sadece komutları sınırlıdır; onları normal dizelerle kullanamazsın. Ve Vim'de çizgi devamını kullanmak biraz acıdır.

Bu nedenle, Python kodunu ayrı bir dosyaya koyar ve bunu :py veya :py3 komutlarına iletirim.

let mycode = join(readfile(expand('~/mycode.py')), "\n") 

if has('python') 
    execute 'py ' . mycode 
elseif has('python3') 
    execute 'py3 ' . mycode 
else 
    echoe 'Your mother was a hamster' 
endif 

Ve mycode.py senaryo: Python 2 Gönderen

import sys 
import vim 
print('This is mycode', sys.version) 

vim.command(':echo "Hello"') 
print(vim.eval('42')) 

:

('This is mycode', '2.7.10 (default, May 26 2015, 04:16:29) \n[GCC 5.1.0]') 
Hello 
42 

Ve Python 3'ten

:

This is mycode 3.4.3 (default, Mar 25 2015, 17:13:50) 
[GCC 4.9.2 20150304 (prerelease)] 
Hello 
42 
3

Bu pasajı hangi Python sürümünü belirleyebilir biz kullanıyorsun ve ona geçin (Python bu sürümün yüklü olduğu anlamına gelir).

if has('python') 
    command! -nargs=1 Python python <args> 
elseif has('python3') 
    command! -nargs=1 Python python3 <args> 
else 
    echo "Error: Requires Vim compiled with +python or +python3" 
    finish 
endif 

öncelikle (Vim Script gibi aynı dizin altında burada) yerini anlamaya, piton kodunu yüklemek için: piton modülü varsa
execute "Python import sys" 
execute "Python sys.path.append(r'" . expand("<sfile>:p:h") . "')" 

Sonra kontrol edin. Değilse, bunu yeniden:

Python << EOF 
if 'yourModuleName' not in sys.modules: 
    import yourModuleName 
else: 
    import imp 
    # Reload python module to avoid errors when updating plugin 
    yourModuleName = imp.reload(yourModuleName) 
EOF 

iki yol adlandırmak:
1.

" call the whole module 
execute "Python yourModuleName" 

" call a function from that module 
execute "Python yourModuleName.aMethod()" 

2.

" Call a method using map 
vnoremap <leader> c :Python yourModuleName.aMethod()<cr> 

" Call a module or method using Vim function 
vnoremap <leader> c :<c-u> <SID>yourFunctionName(visualmode())<cr> 
function! s:YourFunctionName(someName) 
    Python YourFunctionName.aMethod(a:someName) 
    Python YourFunctionName 
endfunction