Как я могу отложить загрузку elpy, используя use-package?

9

Я обновляю все свои вызовы пакета использования теперь, когда :idleэто уже не приличный способ отложить вещи. На данный момент одним из самых больших ударов в моем времени загрузки является elpyзагрузка целого ряда дополнительных модулей. На данный момент мой вызов довольно прост:

(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)))))

Однако это довольно расточительно, если я никогда не редактирую модули Python. Проблема в том, что elpy - это набор режимов, поэтому я не могу просто использовать форму привязки к режиму при elpy-enableнеобходимости вызова. Так какой подход я должен использовать. Это просто случай срабатывания на хуке режима Python?

stsquad
источник
Я просто перестал отслеживать версию пакета использования MELPA. Кажется: холостой ход убрали ни с чем, чтобы заменить его. Я просто подожду, пока не появится замена.
Або-або
@ abo-abo: я могу понять, почему: простоя это немного взломать. Действительно, для правильной загрузки по требованию он должен запускаться событием, отличным от «прошло некоторое время».
Stsquad
2
:idleможет быть заменено чем-то вроде, :defer 30где число - это задержка в секундах, после которой пакет должен быть загружен.
Каушал Моди
@kaushalmodi, это уже работает?
Або-або
@ abo-abo Я не пробовал, но, вероятно, должен. Я прочитал это обновление во вчерашнем коммите. README также обновляется с этой информацией.
Каушал Моди

Ответы:

6

Я не знаю Elpy, поэтому я не уверен, правильно ли я понимаю вашу проблему. Я знаю use-package, хотя и в последнее время страдал от той же самой проблемы, а именно удаления :idle.

По сути, есть два выхода, в зависимости от того, как вам нужно использовать Elpy. Вы можете использовать бедного человека :idle, run-with-idle-timerнапример, с

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

В качестве альтернативы, вы можете положиться на старый with-eval-after-loadили использовать python-mode-hookи отложить Elpy до тех пор, пока Python Mode не будет загружен или включен соответственно:

:init (add-hook 'python-mode-hook #'elpy-enable)
;; or
:init (with-eval-after-load 'python (elpy-enable))
lunaryorn
источник
Если бы elpy был простым режимом, это было бы хорошо. Однако на самом деле это куча второстепенных режимов, соединенных вместе, чтобы сделать взаимодействие с Python более интегрированным. Таким образом, шаг elpy-enable необходимо выполнить до загрузки первого файла python, чтобы все модули были настроены и готовы.
Stsquad
@stsquad with-eval-after-load должен делать именно это.
lunaryorn
1
Мне нужно добавить, :commands elpy-enableчтобы это работало. :init (with-eval-after-load 'python (elpy-enable)) :commands elpy-enable
Аззамса
3

Автор elpy предлагает сделать это через совет, потому что elpy-enableизменяет python-mode-hookпеременную, поэтому вызывать ее внутри ловушки режима слишком поздно: https://github.com/jorgenschaefer/elpy/wiki/Configuration

простой подход:

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

используя use-package:

(use-package elpy :ensure t
  :defer t
  :init
  (advice-add 'python-mode :before 'elpy-enable))
Тиерат
источник
1
Спасибо, что нашел это, когда я не смог. Я дал отзыв сопровождающему, что ИМХО это неподходящее место, чтобы скрывать эту информацию. Это также в официальном README.rst, но не в первом и наиболее очевидном месте, чтобы посмотреть: раздел установки документации . Я сообщил об этом в выпуске № 1606 .
Адам
2

Я думаю, что это возможно с: после

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

(use-package elpy
  :ensure t
  :after python
  :config (elpy-enable))
Хайме Арии
источник
1
Не работал для меня Также вам не нужно, :deferесли вы уже используете :mode. github.com/jwiegley/use-package#notes-about-lazy-loading
Аззамса