2015-06-19 11 views
8

Innerhalb eines vim-Skripts ist es möglich, Python-Code einzubetten, solange vim mit der Funktion +python erstellt wird.Generic: Python-Befehl in Vim?

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

aber einige Leute haben vim mit +python3 statt gebaut. Dies bringt einige Kompatibilitätsprobleme für vim plugins mit sich. Gibt es einen generischen Befehl, der die Python-Version aufruft, die auf dem Computer installiert ist?

+3

Die kurze Antwort ist nein. Die längere Antwort ist, dass Sie etwas abstrahieren können, indem Sie testen, welche Version von Python verfügbar ist, indem Sie eine Variable say 'py' auf' python' oder 'python3' setzen und dann diese mit' exec py aufrufen. 'print ("ESSEN MICH")' '. Ja, ich habe nie gesagt, dass es nett ist. – lcd047

Antwort

1

Die "heredoc" (<< EOF) Syntax beschränkt sich nur auf das Skript :py, :perl usw.) -Befehle; Sie können sie nicht mit normalen Strings verwenden. Und die Verwendung der Zeilenfortsetzung in Vim ist ein bisschen schmerzhaft.

Aus diesem Grund würde ich den Python-Code in eine separate Datei legen und diese an die :py oder :py3 Befehle übergeben.

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 

Und das mycode.py Skript:

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

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

Von Python 2:

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

Und von Python 3:

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

Dieser Ausschnitt bestimmen könnte, die Python-Version wir verwende und Wechseln Sie dazu (Python steht für diese Version installiert).

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 

den Python-Code laden, wir (hier unter dem gleichen Verzeichnis wie das Vim-Script) zuerst seine Lage herauszufinden:

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

Dann prüfen, ob der Python-Modul zur Verfügung. Falls nicht, legen Sie es erneut:

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 

zwei Möglichkeiten, es zu nennen:
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