2012-01-10 11 views
7

Nei miei .vimrc ei miei vim UltiSnips di plugin Ho un sacco di codice che sembra cheModo compatibile per utilizzare: py OR: py3 in vim?

:py << EOF 
print("Hi") 
EOF 

Ora, voglio verificare se python3 viene compilato in Vim via has("python3") e quindi utilizzare :py3 invece di :py . Mantenere il codice Python compatibile tra Python 2 e 3 non è il problema: il problema è di dire a vim di usare: py3 se è disponibile e: py altrimenti.

Qualcuno ha una buona idea?

+0

Il modo ovvio sarebbe avere un 'if ha (" python3 ")' ogni volta che si desidera usare ': py3'. – romainl

+0

O forse una funzione wrapper che prende il codice Python che vuoi eseguire come argomento ed esegue un singolo 'if'. – romainl

+0

Il tuo primo commento è la soluzione ovvia che ho scelto per ora. Il secondo commento è quello che volevo fare ma non conosco alcun modo per far sì che una funzione definita dall'utente accetti la sintassi heredoc (<< EOF). Fai? – SirVer

risposta

6

Si può approfittare del fatto che i comandi definiti dall'utente in vim sono semplicemente posto-in-patter-and-eval dichiarazioni, e scrivere:

if has("python3") 
    command! -nargs=1 Py py3 <args> 
else 
    command! -nargs=1 Py py <args> 
endif 

Quindi è possibile utilizzare per eseguire i comandi :Py python stesso modo in cui si utilizzano regolarmente :py o :py3.

+0

No, questo non funziona con la sintassi << EOF che il comando python capisce. Tuttavia, è leggermente più bello della mia soluzione let. – SirVer

+0

Funziona perfettamente per me: http://imageshack.us/photo/my-images/832/52433408.png/ –

+0

In effetti ... Funziona anche per me. Devo aver fatto qualcosa di sbagliato quando l'ho provato io stesso. Forse l'argomento -nargs = 1. Grazie per la tua perseveranza nell'aiutarmi! Io monto su una soluzione ma conserverò quella che ho menzionato di seguito perché sembra un po 'ostruttivo definire un nuovo comando solo per uso interno e perché ho rapporti che la soluzione exec funziona su vari sistemi. – SirVer