Elegante Möglichkeit, sowohl Python als auch Python3 im Vim-Plugin zu unterstützen


9

Ich habe kürzlich eine Pull-Anfrage erhalten, mein Vim-Plugin so zu ändern, dass es Python3 unterstützt. Aber diese Änderungen brechen das Plugin für das vim auf meinem Mac, das Python zu hören scheint.

python import sys

gegen

python3 import sys

Gibt es eine elegante Methode, mit der das Skript in meinem Plugin erkennt, welche Anweisung es verwenden soll? Etwas wie:

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

Vielen Dank.

Antworten:


5

Wenn Sie vermeiden möchten, das Python-Skript neu zu schreiben, legen Sie es in einer separaten Datei ab und verwenden Sie :pyfileoder :py3filestattdessen.

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

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

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

Dadurch wird das geladen script.py, das sich im selben Verzeichnis befindet.


3

Meine Technik zur Unterscheidung der Python-Versionen besteht darin, einen separaten Befehl zu erstellen (obwohl dieser in meinen .vimrcStartdateien enthalten ist, können Sie ihn für den Plugin-Code nach Bedarf ändern.)

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

3

Hier erfahren Sie, wie Sie fertig sind .

  1. Definieren Sie eine Funktion, um festzustellen, ob Python3 verfügbar ist:

    function! s:UsingPython3()
      if has('python3')
        return 1
      endif
        return 0
    endfunction
  2. Dann holen Sie sich den richtigen Python-Befehl:

    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 "
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.