Modo elegante per supportare sia python che python3 nel plugin vim


9

Recentemente ho ricevuto una richiesta pull per cambiare il mio plugin vim per farlo supportare python3. Ma queste modifiche interrompono il plug-in per il VIM sul mio Mac che sembra ascoltare Python.

python import sys

contro

python3 import sys

Esiste un metodo elegante per fare in modo che lo script nel mio plugin rilevi quale affermazione dovrebbe usare? Qualcosa di simile a:

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

Grazie.

Risposte:


5

Se vuoi evitare di riscrivere lo script Python, mettilo in un file separato e usa :pyfileo :py3fileinvece.

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

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

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

Questo caricherà script.pyche si trova nella stessa directory.


3

La mia tecnica per distinguere le versioni di Python è quella di creare un comando separato (anche se questo è nei miei .vimrcfile di avvio, è possibile modificare secondo necessità per il codice del 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

3

Ecco come funziona youcompleteme .

  1. Definire una funzione per determinare se python3 è disponibile:

    function! s:UsingPython3()
      if has('python3')
        return 1
      endif
        return 0
    endfunction
  2. quindi ottieni il comando python giusto:

    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 "
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.