Como adiar o carregamento do elpy usando o pacote de uso?

9

Estou atualizando todas as minhas chamadas de pacote de uso agora que :idlenão são mais uma maneira decente de adiar coisas. No momento, um dos maiores hits do meu tempo de carregamento é o elpycarregamento de vários módulos adicionais. No momento, minha invocação é bastante básica:

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

No entanto, isso é um desperdício se eu nunca estiver editando nenhum módulo python. O problema é que elpy é uma coleção de modos, então não posso simplesmente usar o formulário de ligação de modo, pois elpy-enableprecisa ser chamado. Então, qual abordagem devo usar. É apenas um caso de acionamento no gancho do modo python?

stsquad
fonte
Acabei de parar de rastrear a versão MELPA do pacote de uso. Parece: ocioso foi removido com nada para substituí-lo. Vou esperar até a substituição aparecer.
abo-abo
@ abo-abo: Eu posso entender o porquê:: ocioso é meio que um hack. Realmente para o carregamento sob demanda adequado, ele deve ser acionado por um evento que não seja "algum tempo passado".
Stsquad 17/03/2015
2
:idlepode ser substituído por algo como :defer 30onde o número é o atraso em segundos após o qual o pacote deve ser carregado.
precisa
@kaushalmodi, isso já funciona?
abo-abo
@ abo-abo Eu não tentei, mas provavelmente deveria. Eu li essa atualização no commit de ontem. O README também é atualizado com essas informações.
precisa

Respostas:

6

Não conheço Elpy, por isso não tenho certeza se entendi seu problema corretamente. Eu sei use-package, porém, e recentemente sofri do mesmo problema, a saber, a remoção de :idle.

Basicamente, existem duas maneiras, dependendo de como você precisa usar o Elpy. Você pode usar um homem pobre :idle, com run-with-idle-timer, por exemplo

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

Como alternativa, você pode confiar na boa idade with-eval-after-loadou usar python-mode-hooke atrasar o Elpy até que o Modo Python seja carregado ou ativado, respectivamente:

:init (add-hook 'python-mode-hook #'elpy-enable)
;; or
:init (with-eval-after-load 'python (elpy-enable))
lunaryorn
fonte
Se elpy fosse um modo simples, tudo bem. No entanto, na verdade, são vários modos menores reunidos para tornar a experiência do python mais integrada. Como tal, a etapa elpy-enable deve ser executada antes do carregamento do primeiro arquivo python para que todos os módulos estejam configurados e prontos.
Stsquad 17/03/2015
O @stsquad with-eval-after-load deve fazer exatamente isso.
lunaryorn
11
Eu preciso adicionar :commands elpy-enablepara fazê-lo funcionar. :init (with-eval-after-load 'python (elpy-enable)) :commands elpy-enable
Azzamsa 30/10/19
3

O autor de elpy sugere fazer isso por meio de um conselho, porque elpy-enablemodifica a python-mode-hookvariável, portanto, chamá-la dentro do gancho de modo é muito tarde: https://github.com/jorgenschaefer/elpy/wiki/Configuration

abordagem simples:

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

usando use-package:

(use-package elpy :ensure t
  :defer t
  :init
  (advice-add 'python-mode :before 'elpy-enable))
T Nierath
fonte
11
Obrigado por encontrar isso quando não consegui. Eu dei feedback ao mantenedor que IMHO este é o lugar errado para ocultar essas informações. Também está no local oficial README.rst, mas não no primeiro e mais óbvio local: a seção de instalação da documentação . Eu relatei isso na edição # 1606 .
Adam Spiers
2

Eu acho que é possível com: depois

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

(use-package elpy
  :ensure t
  :after python
  :config (elpy-enable))
Jaime Arias
fonte
11
Não funcionou para mim. Além disso, você não precisa :deferse você já usa :mode. github.com/jwiegley/use-package#notes-about-lazy-loading
azzamsa