Jak mogę odłożyć ładowanie elpy za pomocą pakietu use?

9

Zaktualizowałem teraz wszystkie moje wywołania pakietu use, co :idlenie jest już dobrym sposobem na odroczenie rzeczy. W tej chwili jednym z największych trafień w moim czasie ładowania jest elpyładowanie całej gamy dodatkowych modułów. W tej chwili moje wywołanie jest raczej podstawowe:

(use-package elpy
  :commands elpy-enable
  :init (elpy-enable)
  :config
  (progn
    (setq elpy-rpc-backend "jedi"
          elpy-rpc-project-specific 't)
    (when (fboundp 'flycheck-mode)
      (setq elpy-modules (delete 'elpy-module-flymake elpy-modules)))))

Jest to jednak raczej marnotrawstwo, jeśli nigdy nie edytuję żadnych modułów Pythona. Problem polega na tym, że elpy to zbiór trybów, więc nie mogę po prostu użyć formularza powiązania trybu, ponieważ elpy-enabletrzeba go wywołać . Więc jakiego podejścia powinienem użyć. Czy to tylko przypadek wyzwolenia zaczepu w trybie python?

stsquad
źródło
Właśnie przestałem śledzić wersję pakietu use MELPA. Wygląda na to, że bezczynność została usunięta i nic nie zastąpi. Poczekam tylko, aż pojawi się zamiennik.
abo-abo
@ abo-abo: Rozumiem dlaczego: bezczynność to trochę hack. Naprawdę, aby poprawnie załadować na żądanie, powinno zostać uruchomione przez zdarzenie inne niż „upłynęło trochę czasu”.
stsquad
2
:idlemożna zastąpić czymś takim, jak :defer 30gdzie liczba to opóźnienie w sekundach, po którym paczka powinna zostać załadowana.
Kaushal Modi
@kaushalmodi, czy to już działa?
abo-abo
@ abo-abo Nie próbowałem, ale prawdopodobnie powinno. Przeczytałem tę aktualizację z wczorajszego zatwierdzenia. Plik README jest również aktualizowany o te informacje.
Kaushal Modi

Odpowiedzi:

6

Nie znam Elpy, więc nie jestem pewien, czy dobrze rozumiem twój problem. Wiem use-packagejednak, a ostatnio cierpiał na ten sam problem, a mianowicie usunięcie :idle.

Zasadniczo istnieją dwa wyjścia, w zależności od tego, jak musisz korzystać z Elpy. Można użyć biedaka :idle, z run-with-idle-timer, na przykład

:init (run-with-idle-timer 10 nil #'elpy-enable)

Alternatywnie możesz polegać na starym dobrym with-eval-after-loadlub używać python-mode-hooki opóźniać Elpy do momentu, gdy Tryb Python zostanie załadowany lub włączony odpowiednio:

:init (add-hook 'python-mode-hook #'elpy-enable)
;; or
:init (with-eval-after-load 'python (elpy-enable))
księżycowy
źródło
Gdyby elpy był prostym trybem, byłoby dobrze. Jednak tak naprawdę to kilka drobnych trybów połączonych ze sobą, aby bardziej zintegrować doświadczenie Pythona. W związku z tym należy uruchomić krok włączania elpy przed załadowaniem pierwszego pliku Pythona, aby wszystkie moduły zostały skonfigurowane i były gotowe.
stsquad
@stsquad with-eval-after-load powinien zrobić dokładnie to.
lunaryorn,
1
Muszę dodać, :commands elpy-enableaby to działało. :init (with-eval-after-load 'python (elpy-enable)) :commands elpy-enable
azzamsa
3

Autor elpy sugeruje zrobienie tego za pomocą porady, ponieważ elpy-enablemodyfikuje python-mode-hookzmienną, więc wywołanie jej wewnątrz hook-mode jest za późno: https://github.com/jorgenschaefer/elpy/wiki/Configuration

proste podejście:

(package-initialize)
(advice-add 'python-mode :before 'elpy-enable)

za pomocą use-package:

(use-package elpy :ensure t
  :defer t
  :init
  (advice-add 'python-mode :before 'elpy-enable))
T Nierath
źródło
1
Dzięki za znalezienie tego, kiedy nie mogłem. Dałem zwrotne do opiekuna, który IMHO jest to złe miejsce, aby ukryć tę informację. Znajduje się również w oficjalnym README.rst, ale nie w pierwszym i najbardziej oczywistym miejscu: sekcja instalacji dokumentacji . Zgłosiłem to w numerze 1606 .
Adam Spiers
2

Myślę, że jest to możliwe dzięki: po

(use-package python
  :ensure t
  :defer t
  :mode ("\\.py\\'" . python-mode))

(use-package elpy
  :ensure t
  :after python
  :config (elpy-enable))
Jaime Arias
źródło
1
Nie działało dla mnie. Również nie potrzebujesz, :deferjeśli już używasz :mode. github.com/jwiegley/use-package#notes-about-lazy-loading
azzamsa