Jak sprawić, by Vim mógł uruchomić zarówno Pythona, jak i Pythona 3 w systemie Linux w tej samej sesji?

28

W systemach Linux spakowany Vim zazwyczaj ma tylko jeden z nich pythonlub jest python3włączony. Możliwe jest włączenie obu (za pomocą python/dyni python3/dyn), ale podczas sesji można użyć tylko jednego. W tej dyskusji na liście mailowej napisano :

Zależy to od sposobu budowania bibliotek Pythona. W systemach opartych na Debianie (z powodów, których nie pamiętam od razu), są one zbudowane w taki sposób, że RTLD_GLOBAL musi być użyty, aby uzyskać dostęp do symboli. Zapobiega to ładowaniu zarówno libpython2.x, jak i libpython3.x w tym samym procesie.

Co można zrobić, aby umożliwić ładowanie obu w tej samej sesji?

Opcje, które widzę:

  • Przebuduj pakiety Python {2,3}, aby RTLD_GLOBAL(cokolwiek to może być) nie było potrzebne.
  • Jakimś sposobem wcześniej załaduj bibliotekę, aby została zwolniona (?!) Przez Vima. (Czy to w ogóle możliwe?)

W przypadku jakichkolwiek szczegółów dystrybucji załóż, w kolejności rosnącej specyficzności:

  • Oparty na Debianie
  • Ubuntu
  • Ubuntu 14.04
  • Lub Arch Linux, jeśli system oparty na Debianie jest zbyt skomplikowany.

Zauważ, że mam Vima do zbudowania z obsługą dynamicznego ładowania dla obu, więc budowanie Vima nie stanowi problemu.

muru
źródło

Odpowiedzi:

17

Jestem obecnym opiekunem Vima dla Debiana i osobą cytowaną w dyskusji na liście dyskusyjnej, do której się odwołuje.

Jak powiedziałeś, nie jest to pytanie o Vima. Chodzi o zbudowanie oprogramowania, z którym łączy Vim, w sposób odpowiadający twoim potrzebom. Bardziej szczegółowa dyskusja (przynajmniej w aspekcie Debiana) na temat błędu w błędzie żądającym włączenia Python3 w pakiecie Viana Debiana.

Sprowadza się to do

  • Pakiet Debiana w Pythonie nie łączy rozszerzeń Pythona z odpowiednią biblioteką współdzieloną libpython. To właśnie powoduje, że pakiet Viana Debiana wymaga użycia RTLD_GLOBALpodczas dlopen()dynamicznego ładowania powiązań języka Python.

  • Nie ma dobrych sposobów na wyrażenie relacji między pakietami Vima a bibliotekami ładowanymi dynamicznie, aby zapewnić ich aktualizację razem, gdy jest to właściwe. Nawet jeśli pierwszy punkt został rozwiązany, ten problem nadal uniemożliwiałby mi dynamiczne ładowanie obsługi języka Python.

    Głównym celem dynamicznego ładowania obsługi języka w Vimie jest nie wymaganie od użytkowników instalowania bibliotek, których nie będą używać. Oznacza to, że pakiet Vima nie może określić twardej zależności od minimalnej wersji biblioteki.

    Dlatego jeśli Vim jest zbudowany na nowszej wersji biblioteki, która nie jest wstecznie kompatybilna ze starszą wersją, a użytkownik nie zaktualizuje ich razem, Vim się zawiesi. To nie jest coś, co chcę spotkać użytkowników pakietów.

Chciałbym móc ponownie włączyć (było dostępne przez krótki czas w latach 2010-2011) dynamiczne ładowanie obsługi języków, ale powyższe problemy muszą zostać rozwiązane w pierwszej kolejności.


Począwszy od wersji 2: 7.4.2330-1 , pakiet Debiana przełączył się na używanie Python3 zamiast Python2 do tworzenia powiązań w Pythonie.


Alternatywnie, pakiet neovim obsługuje zarówno Python2, jak i Python3 z tego samego procesu nvim, ponieważ obsługa Pythona jest zapewniana przez moduły zewnętrzne ( pakiety python-neovim i python3-neovim ). Eksternalizacja kodu Pythona, zamiast osadzania go tak, jak robi to Vim, pozwala uniknąć problemu z budowaniem libpython.

jamessan
źródło
„Oznacza to, że pakiet Vima nie może określić twardej zależności od minimalnej wersji biblioteki.” Zakładam, że dlatego Debian nie ma osobnych pakietów dla Vima + Pythona2 i Vima + Pythona3, tak jak Arch Linux?
muru
@muru Python jest tylko jednym z dostępnych powiązań językowych. Zapewnianie kombinacji pakietów dla różnych języków i zestawów narzędzi GUI to duża liczba pakietów. Podjęto decyzję, aby włączyć tyle powiązań językowych, ile było rozsądne, i pozwolić na wybór spośród zestawów narzędzi GUI (lub nie). Użytkownik nie powinien wybierać wtyczek Vima na podstawie języka, w którym jest napisany.
jamessan
To nie jest prawdziwy argument, ponieważ tylko Python i Python3 kolidują ze sobą. Myślę, że powinieneś pożyczyć liść z książki Arch Developers. Poza wspólnym vim-runtimeopakowaniu, mają vim, gvim, vim-python3i gvim-python3. Jedyną różnicą między -python3zwykłymi pakietami a wersją jest wersja Pythona. Jasne, podwaja liczbę pakietów frontendowych, ale to wszystko, co widzę w takich opakowaniach.
muru
To dla Arch. W Debianie istnieje vim-nox, vim-gtk, vim-gnome, i vim-athena. Podwojenie ich tylko po to, aby użytkownicy nadal nie mogli używać zarówno wtyczek Python, jak i Python3, nie wydaje się opłacalne.
jamessan
Jestem raczej ciekawy, dlaczego nie wybrałeś opcji dynamicznej dla normalnych pakietów.
muru
4

Ubuntu 16.04 ma teraz vim-*-py2pakiety zawarte w repozytorium. Oznacza to, że wszyscy użytkownicy Debian Vim mogą w razie potrzeby przeprowadzić migrację do Ubuntu.

Dawne vim-*pakiety teraz zapewniają +python3, a pliki binarne są nazywane inaczej, aby uniknąć konfliktu:

I tak dalej.

dfggdfgdfgdfgdfgdfgdfgdfg
źródło
Tak więc, w dniu 16.04, mogę załadować python2 i python3 w tej samej sesji Vima?
muru
@muru nie, możesz po prostu łatwiej wybrać, który z nich dostaniesz w danej sesji;)
hobbs
@hobbs Jestem pewien, że pakiety są w konflikcie z pakietami python3.
mur
@muru, w rzeczywistości nie. Możesz zainstalować i uruchomić dowolny z nich, a także wybrać domyślny vim. To nie jest świetne, ale to poprawa.
hobbs
2
A teraz z 17.04, obsługa Python 2 i odpowiednie pakiety Vima zostały usunięte
muru