Maneira elegante de suportar python e python3 no plugin vim

9

Recentemente, recebi uma solicitação pull para alterar meu plug-in vim para dar suporte ao python3. Mas essas alterações quebram o plugin para o vim no meu Mac, que parece ouvir python.

python import sys

versus

python3 import sys

Existe um método elegante para fazer com que o script no meu plugin detecte qual instrução ele deve usar? Algo como:

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

Obrigado.

mipmip
fonte

Respostas:

5

Se você deseja evitar a reescrita do script Python, coloque-o em um arquivo separado e use :pyfile-o :py3file.

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

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

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

Isso carregará script.pyo mesmo diretório.

Tommy A
fonte
3

Minha técnica para distinguir as versões do python é criar um comando separado (embora isso esteja nos meus .vimrcarquivos de inicialização, você pode modificar conforme necessário para o código do plug-in).

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
fonte
3

Aqui está como você completa .

  1. Defina uma função para determinar se python3 está disponível:

    function! s:UsingPython3()
      if has('python3')
        return 1
      endif
        return 0
    endfunction
    
  2. então obtenha o comando python correto:

    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
fonte