Emacs 24: Carregando um pacote instalado via ELPA

12

Acabei de instalar o cmake-modepacote no Emacs 24 usando:

M-x package-install cmake-mode

Eu posso ver o pacote em: ~/.emacs.d/elpa/cmake-mode-20110824e posso carregá-lo usando as instruções na Commentary:seção ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el:

;; Add this code to your .emacs file to use the mode:
;;
;;  (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path))
;;  (require 'cmake-mode)
;;  (setq auto-mode-alist
;;        (append '(("CMakeLists\\.txt\\'" . cmake-mode)
;;                  ("\\.cmake\\'" . cmake-mode))
;;                auto-mode-alist))

No entanto, isso contradiz as instruções de uso na página EmacsWiki do ELPA:

... os pacotes são inicializados APÓS o init.el ser carregado. Isso significa que você NÃO deve colocar a inicialização específica do pacote em seu init.el ...

Costumo concordar com esta instrução, pois adicionei ao meu ~/.gnu-emacsarquivo uma linha como:

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

é feio e quebrará se e quando atualizarei o pacote. No entanto, sem essa linha, eu sou incapaz de usar cmake-mode.

Estou faltando alguma coisa aqui?

Notas:

  • Não fiz nada de estranho package-enable-at-startupe seu valor é t.
  • Eu estou usando prelúdio .
  • user-emacs-directoryvalue is "~/.emacs.d/" (Obrigado @lawlist pela sugestão)
  • package-user-dir o valor é "~/.emacs.d/elpa"
Chen Levy
fonte
1
É possível que você tenha alterado os locais do default-directoryou de user-emacs-directorytal modo que o elpadiretório não esteja sendo carregado? package-installcria um elpadiretório e o arquivo de carregamento automático criado durante a instalação é baseado nesse local.
lawlist
1
Sua última linha de código na sua pergunta sugere que você moveu o pacote para fora do elpadiretório - ou seja, ~/.emacs.d/cmake-mode-20110824/não é onde o arquivo de carregamento automático espera que esteja.
lawlist
@lawlist: Você é muito observador. Eu cometi um erro na pergunta. Agora está fixo (a pergunta) no valor correto de ~/.emacs.d/elpa/cmake-mode-20110824/. O problema persiste.
Chen Levy

Respostas:

2

Instalei o cmake-mode com o marmalade-repo e dei uma olhada no cmake-mode-autoloads.el. Parece que o autor tomou uma decisão consciente, notincluindo tudo o necessário para a instalação no arquivo de carregamentos automáticos. No entanto, as instruções nas linhas 25 a 30 do cmake-mode.el estão corretas, citadas na sua pergunta. Se você usar as linhas 25 a 30 e definir o caminho corretamente, NÃO precisará de uma linha extra de código, como (add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/").

Obviamente, você não gostaria de usar /dir/with/cmake-mode- você deseja usar ~/.emacs.d/elpa/cmake-mode-20110824sem um ataque no final.

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path))
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

Pode ser necessário excluir o diretório c-make-mode ... e tentar reinstalar se o código acima não funcionar (usando seu próprio caminho).

lista de leis
fonte
Claro, mas, a menos que esteja faltando alguma coisa, se você atualizar o modo cmake via ELPA posteriormente, o diretório será renomeado para algo que não está no seu arquivo init ou a versão mais recente terminará em um diretório que não está no seu caminho de carregamento; neste último caso, você não vê a atualização ou fica com uma estranheza indevida porque está carregando manualmente uma versão e (package-initialize)está carregando outra. Estou errado? Quero dizer, não usei muito o ELPA e ainda não atualizei nenhum pacote com ele, para poder estar errado. E, com certeza, não é uma grande preocupação em nenhum caso, mas por que não evitá-la completamente?
Aaron Miller
Você está certo. No entanto, os pacotes não se atualizam apenas sem que você saiba - se e quando você atualizar, esse será o momento de fazer a limpeza. Eu frequentemente invisto uma quantidade substancial de tempo modificando os arquivos de origem de vários pacotes e não necessariamente os quero atualizados depois de passar todo esse tempo obtendo-os da maneira certa. O Emacs está longe do que se poderia considerar "livre de manutenção".
lawlist
Um ponto excelente.
Aaron Miller
3

Dada a natureza do wiki como meio repositório de código, meio memorando para hackers do Emacs, você ignorou esse ponto:

seria mais fácil mover a inicialização do pacote para outro ponto durante a inicialização, para que você possa (exigir) pacotes ELPA; isso cuida de muitos dos problemas descritos:

Isto é o que eu faço; um dos primeiros arquivos carregados pelo meu script de inicialização personalizada (cuja criação, a partir de tudo o que eu pude perceber, é o pons Asinorum de Emacs graves usar 1 ) faz

(require 'package)
(setq package-enable-at-startup nil)
(package-initialize)

e de lá eu simplesmente do (require)que pacotes ELPA eu preciso. Isso também tem o benefício de permitir um controle mais preciso sobre o comportamento dos pacotes instalados pelo ELPA; se, por exemplo, quero desabilitar um determinado pacote no momento, mas não desinstalá-lo completamente, é uma simples questão de comentar a (require)chamada relevante , onde o comportamento padrão exigiria mover o pacote totalmente do meu diretório ELPA.

(1. Apesar da tentação quase esmagadora, eu me recusei a nomear meu script de inicialização personalizado lightsaber.el.)

Aaron Miller
fonte
Apenas um lembrete para verificar o diretório user-emacs se alterado, pois os pacotes ELPA residem nele por padrão. Eu mantenho minhas coisas no Dropbox e fiquei surpreso ao ver nenhum efeito dos comandos acima no meu script em lote até defini-lo.
Mlt
1

Você pode fazer toda a sua inicialização após o carregamento dos pacotes after-init-hook. No EmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))
Poulsbo
fonte
0

Eu tive um problema semelhante quando comecei a usar o ELPA. No meu caso, tive vários pacotes locais, pois eles não estavam presentes no ELPA.

E assim eu alterei o caminho de carregamento. Por alguma razão, o caminho de carregamento não é atualizado corretamente pelo package.el. Para resolver o problema, tive que colocar (setq load-path (cons "~/.emacs.d" load-path)) após a chamada parapackage-initialize

Dmytro
fonte