Элегантный способ поддержки как python, так и python3 в плагине vim


9

Недавно я получил запрос на изменение, чтобы изменить мой плагин vim, чтобы он поддерживал python3. Но эти изменения ломают плагин для vim на моем Mac, который, кажется, слушает python.

python import sys

против

python3 import sys

Есть ли элегантный способ заставить скрипт в моем плагине определять, какой оператор он должен использовать? Что-то вроде:

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

Спасибо.

Ответы:


5

Если вы хотите избежать переписывания скрипта Python, поместите его в отдельный файл и используйте :pyfileили :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

Это загрузит script.pyэто в том же каталоге.


3

Моя техника различения версий Python заключается в создании отдельной команды (хотя это в моих .vimrcфайлах запуска, вы можете изменить по мере необходимости для кода плагина).

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

Вот как это делает youcompleteme .

  1. Определите функцию для определения доступности Python3:

    function! s:UsingPython3()
      if has('python3')
        return 1
      endif
        return 0
    endfunction
  2. тогда получите правильную команду 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 "
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.