Як змусити 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 Arch, якщо система на базі Debian занадто складна.

Зауважте, що я отримав Vim для створення динамічної підтримки завантаження для обох, тому створення Vim не є проблемою.

Відповіді:


17

Я поточний супровід Vim для Debian і людина, котрий цитується в обговоренні списку розсилки.

Як ви сказали, це не питання про Віма. Йдеться про створення програмного забезпечення, з яким Vim посилається таким чином, щоб відповідати вашим потребам. Існує більш ретельна дискусія (принаймні, щодо аспекту Debian) проблеми в помилці з проханням включити Python3 в упаковці Vim Debian.

Це зводиться до

  • Упаковка Python Debian не пов'язує розширення 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.


"Це означає, що упаковка 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. Звичайно, це подвоює кількість пакетів пакетів, але це все недоліки, які я бачу в такій упаковці.
муру

Це для Arch. В Debian, є vim-nox, vim-gtk, vim-gnomeі vim-athena. Подвоєння таких просто, що користувачі досі не можуть використовувати як плагіни Python, так і Python3, здається, не варто.
jamessan

Мене цікавить, чому ви не вибрали динамічний варіант для звичайних пакетів.
муру

4

У Ubuntu 16.04 тепер vim-*-py2включені пакети репо. Це означає, що всі користувачі Debian Vim при необхідності можуть перейти на Ubuntu.

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

І так далі.


Отже, 16.04. Я можу завантажити python2 та python3 в той же сеанс Vim?
муру

@muru ні, ви можете просто вибрати, який з них ви отримаєте на заданому сеансі легше;)
hobbs

@hobbs Я впевнений, що пакети конфліктують з python3.
муру

@muru вони насправді не роблять. Ви можете встановити та запустити будь-який із них, а також вибрати його для вашого vim за замовчуванням. Це не здорово, але це покращення.
варення

2
А тепер з 17.04 підтримка Python 2 та відповідні пакети Vim відпали
muru
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.