Elegancki sposób obsługi zarówno Pythona, jak i Pythona we wtyczce vim

9

Niedawno otrzymałem żądanie ściągnięcia, aby zmienić wtyczkę vima, aby obsługiwała Python3. Ale te zmiany psują wtyczkę vima na moim Macu, który wydaje się słuchać Pythona.

python import sys

przeciw

python3 import sys

Czy istnieje elegancka metoda, dzięki której skrypt w mojej wtyczce wykrywa, której instrukcji powinien użyć? Coś jak:

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

Dzięki.

mipmip
źródło

Odpowiedzi:

5

Jeśli chcesz uniknąć przepisywania skryptu Python, umieść go w osobnym pliku i użyj :pyfilelub :py3filezamiast niego.

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

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

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

Spowoduje to załadowanie script.pytego pliku do tego samego katalogu.

Tommy A.
źródło
3

Moja technika rozróżniania wersji Pythona polega na utworzeniu osobnego polecenia (chociaż jest to w moich .vimrcplikach startowych, możesz zmodyfikować w razie potrzeby kod wtyczki).

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
Pieśń Komiczna
źródło
3

Oto, jak to zrobisz .

  1. Zdefiniuj funkcję określającą, czy python3 jest dostępny:

    function! s:UsingPython3()
      if has('python3')
        return 1
      endif
        return 0
    endfunction
    
  2. następnie uzyskaj właściwą komendę 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
źródło