Как мне заставить Vim иметь возможность запускать как python, так и python3 в системе Linux в одном сеансе?

28

В системах Linux пакетный Vim обычно имеет только один из них pythonили python3включен. Можно включить оба (используя python/dynи python3/dyn), но во время сеанса может использоваться только один. Это обсуждение списка рассылки гласило :

Это зависит от того, как создаются библиотеки Python. В системах на основе Debian (по причинам, которые я не вспоминаю не случайно), они построены таким образом, что для получения доступа к символам необходимо использовать RTLD_GLOBAL. Это предотвращает загрузку libpython2.x и libpython3.x в одном процессе.

Что можно сделать, чтобы включить загрузку обоих в одном сеансе?

Варианты, которые я вижу:

  • Перестройте пакеты Python {2,3}, чтобы RTLD_GLOBAL(что бы это ни было) не нужно.
  • Каким-то образом загрузите библиотеку, чтобы Vim выгружал ее раньше (?!). (Это вообще возможно?)

Для любых деталей дистрибутива, предположим, в порядке возрастания специфичности:

  • Debian на основе
  • Ubuntu
  • Ubuntu 14.04
  • Или Arch Linux, если система на основе Debian слишком сложна.

Обратите внимание, что у меня есть Vim для сборки с поддержкой динамической загрузки для обоих, поэтому сборка Vim не проблема.

Мур
источник

Ответы:

17

Я являюсь текущим сопровождающим Vim для Debian и человеком, цитируемым в обсуждении упомянутого списка рассылки.

Как вы сказали, это не вопрос о Vim. Речь идет о создании программного обеспечения, на которое Vim ссылается так, чтобы оно отвечало вашим потребностям Существует более подробное обсуждение (по крайней мере, для аспекта Debian) проблемы с ошибкой, требующей включения Python3 в пакете Vim Debian.

Это сводится к

  • Пакет Debian для Python не связывает расширения Python с соответствующей общей библиотекой libpython. Это то, что заставляет пакет Vim Debian использовать RTLD_GLOBALпри dlopen()динамической загрузке привязок языка Python.

  • Нет хороших способов выразить взаимосвязь между пакетами Vim и динамически загружаемыми библиотеками, чтобы обеспечить их совместное обновление при необходимости. Даже если бы первый пункт был решен, эта проблема все равно помешала бы мне включить динамическую загрузку поддержки Python.

    Основная задача динамической загрузки языковой поддержки в Vim - не требовать от пользователей установки библиотек, которые они не будут использовать. Это означает, что упаковка Vim не может указать жесткую зависимость от минимальной версии библиотеки.

    Поэтому, если Vim создан на основе более новой версии библиотеки, которая не имеет обратной совместимости со старой версией, и пользователь не обновляет их вместе, Vim завершится сбоем. Я не хочу, чтобы пользователи пакетов сталкивались с этим.

Я хотел бы иметь возможность повторно включить (это было доступно в течение короткого времени в 2010-2011 гг.) Динамическую загрузку языковой поддержки, но вышеупомянутые проблемы должны быть решены в первую очередь.


Начиная с версии 2: 7.4.2330-1 , упаковка Debian перешла на использование Python3 вместо Python2 для привязок Python.


В качестве альтернативы, пакет neovim поддерживает использование как Python2, так и Python3 из одного и того же процесса nvim, поскольку поддержка Python обеспечивается внешними модулями ( пакеты python-neovim и python3-neovim ). Экстернализация кода Python вместо его встраивания, как это делает Vim, позволяет избежать проблемы, связанной с созданием libpython.

jamessan
источник
«Это означает, что упаковка Vim не может указать жесткую зависимость от минимальной версии библиотеки». Я предполагаю, что именно поэтому в Debian нет отдельных пакетов для Vim + Python2 и Vim + Python3, как в Arch Linux?
Муру
@muru Python - это только одна из доступных языковых привязок. Предоставление комбинаций пакетов для разных языков и наборов инструментов GUI - это большое количество пакетов. Было решено включить столько привязок к языку, сколько было разумным, и позволить выбор между инструментами GUI (или нет). Пользователю не нужно выбирать плагины Vim в зависимости от языка, на котором они написаны.
jamessan
Это не реальный аргумент, поскольку только Python и Python3 конфликтуют друг с другом. Честно говоря, думаю, вам стоит позаимствовать лист из книги разработчиков Arch. Помимо общего vim-runtimeпакета, у них есть vim, gvim, vim-python3и gvim-python3. Единственное отличие между -python3обычными и пакетными пакетами заключается в включенной версии Python. Конечно, это удваивает количество внешних пакетов, но это все, что я вижу в такой упаковке.
Муру
Это для Арча. В Debian, есть vim-nox, vim-gtk, vim-gnomeи vim-athena. Удвоить их просто так, чтобы пользователи все еще не могли использовать плагины Python и Python3, не стоит.
Jamessan
Мне немного любопытно, почему вы не выбрали динамическую опцию для обычных пакетов.
Муру
4

Ubuntu 16.04 теперь имеет vim-*-py2пакеты, включенные в репо. Это означает, что все пользователи Debian Vim могут перейти на Ubuntu, если это необходимо.

Предыдущие vim-*пакеты теперь предоставляют +python3, и двоичные файлы названы по-разному, чтобы избежать конфликта:

И так далее.

dfggdfgdfgdfgdfgdfgdfgdfg
источник
Итак, 16.04 я могу загрузить python2 и python3 в одном сеансе Vim?
Муру
@muru нет, вы можете просто выбрать, какой из них вы получите в данной сессии;)
Хоббс
@hobbs Я уверен, что пакеты конфликтуют с пакетами python3.
Муру
@ Муру, на самом деле это не так. Вы можете установить и запустить тот, который вы выберете, и выбрать тот, который будет вашим vim по умолчанию. Это не здорово, но это улучшение.
Хоббс
2
И теперь с 17.04 поддержка Python 2 и соответствующие пакеты Vim были
удалены