Manière élégante de prendre en charge python et python3 dans le plugin vim

9

J'ai récemment reçu une demande de pull pour changer mon plugin vim pour qu'il prenne en charge python3. Mais ces changements cassent le plugin pour le vim sur mon Mac qui semble écouter python.

python import sys

contre

python3 import sys

Existe-t-il une méthode élégante pour que le script de mon plugin détecte quelle instruction il doit utiliser? Quelque chose comme:

if has('python')
   python import ...
elseif if has('python3')
   python3 import ...
else
   finish
endif

Merci.

mipmip
la source

Réponses:

5

Si vous voulez éviter de réécrire le script Python, placez-le dans un fichier séparé et utilisez :pyfileou à la :py3fileplace.

let script_path = expand('<sfile>:p:h') . '/script.py'

if !has('python') and !has('python3')
   finish
endif

execute (has('python3') ? 'py3file' : 'pyfile') script_path

Cela se chargera script.pydans le même répertoire.

Tommy A
la source
3

Ma technique pour distinguer les versions de python est de créer une commande distincte (bien que ce soit dans mes .vimrcfichiers de démarrage, vous pouvez modifier au besoin le code du plugin.)

function! PyImports()
Py << EOF
import sys, os, .....
EOF
endfunction

if has('python')
  command! -nargs=* Py python <args>
  call PyImports()
elseif has('python3')
  command! -nargs=* Py python3 <args>
  call PyImports()
endif
Cometsong
la source
3

Voici comment youcompleteme le fait.

  1. Définissez une fonction pour déterminer si python3 est disponible:

    function! s:UsingPython3()
      if has('python3')
        return 1
      endif
        return 0
    endfunction
  2. puis obtenez la bonne commande python:

    let s:using_python3 = s:UsingPython3()
    let s:python_until_eof = s:using_python3 ? "python3 << EOF" : "python << EOF"
    let s:python_command = s:using_python3 ? "py3 " : "py "
artificerpi
la source