2015-06-19 17 views
8

All'interno di uno script vim è possibile incorporare del codice Python, a condizione che vim sia costruito con la funzione +python.Generico: comando python in vim?

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

Tuttavia, alcune persone hanno costruito Vim con +python3 invece. Ciò solleva alcuni problemi di compatibilità per i plugin vim. Esiste un comando generico che chiama la versione di Python installata sul computer?

+3

La risposta breve è no. La risposta più lunga è che puoi astrarre un po 'di esso, testando quale versione di Python è disponibile, impostando una variabile dica 'py' a' python' o 'python3', e poi chiamandola con' exec py. 'print ("EAT ME")' '. Sì, non ho mai detto che fosse bello. – lcd047

risposta

1

La sintassi "heredoc" (<< EOF) è limitata solo ai comandi dello script :py, :perl, ecc.); non puoi usarli con le corde normali. E usare la continuazione della linea in Vim è un po 'un dolore.

Per questo motivo, inserisco il codice Python in un file separato e lo trasferisco ai comandi :py o :py3.

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 

e lo script mycode.py:

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

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

Da Python 2:

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

E da Python 3:

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

Questo frammento di codice in grado di determinare quale versione di Python noi stai usando e passare ad esso (Python sta per quella versione installata).

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 

Per caricare il codice Python, dobbiamo prima capire la sua posizione (qui sotto la stessa directory dello script Vim):

execute "Python import sys" 
execute "Python sys.path.append(r'" . expand("<sfile>:p:h") . "')" 

Quindi verificare se il modulo python è disponibile. In caso contrario, ricaricarla:

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 

due modi per chiamare lo:
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