Eu tenho a seguinte configuração para pacotes (não tenho certeza se há uma melhor recomendada):
(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")
("marmalade" . "http://marmalade-repo.org/packages/")))
; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)
(setq url-http-attempt-keepalives nil)
Eu tenho três perguntas relacionadas à instalação e atualização de pacotes.
Q1 Existe uma maneira de atualizar a lista de pacotes disponíveis (e versões mais recentes) e atualizar um pacote específico?
Q.2 Qual é a diferença entre as seguintes fontes de pacotes:
- ELPA,
- GNU
- marmelada
- melpa
Q.3 Importa a ordem em que são adicionados package-archives
?
package-archives
. Livre-se do arquivo ELPA, que não é mais mantido, e do arquivo marmelada, que é uma bagunça de pacotes desatualizados e duplicados sem orientação e manutenção claras. Use apenas o arquivo GNU padrão e MELPA>(setq package-enable-at-startup nil)
se quiser se chamar(package-initialize)
.Respostas:
Para atualizar automaticamente a lista de pacotes, apenas se ainda não houver uma lista de pacotes , use o seguinte:
Para atualizar todos os pacotes instalados, digite
package-list-packages
, que o levará ao*Packages*
buffer (e também atualize a lista de pacotes) e, em seguida, digite U x.package-refresh-contents
incondicionalmente tenta baixar uma lista de pacotes de todos os repositórios que você adicionoupackage-archives
;package-archive-contents
não é nulo se você já baixou a lista de pacotes.ELPA é o original. Acho que não é mais mantido, mas não tenho certeza. Eu não uso.
GNU é "oficial". Ele é mantido junto com o Emacs, o que significa que as coisas sempre devem funcionar, mas as atualizações e os novos pacotes não vêm com muita frequência.
Marmalade é basicamente um site no qual você pode fazer o upload de um pacote completo, que será adicionado ao repositório de marmeladas. Você não envia apenas um link para o upstream do pacote e isso não automatiza completamente a criação do pacote. Eu acho que essa é a coisa certa, porque você não necessariamente deseja acompanhar a montante. Infelizmente, ele não foi mantido por um tempo, mas alguém recentemente assumiu o controle, de modo que deveria estar de volta e melhor em algum momento.
O Melpa pega um URL, por exemplo, na área EmacsWiki lisp ou em um repositório do github, e cria um pacote automaticamente a partir dele. Assim, geralmente fica no máximo um dia atrás do que quer que esteja rastreando. Embora ele rastreie a montante, nunca tive um problema na prática, e é daí que vem a maioria dos meus pacotes. Há também o Melpa Stable , que é como o Melpa, mas pega revisões marcadas do repositório upstream, em vez da revisão mais recente. Melpa estável tem menos pacotes que Melpa.
O modo organizacional possui seu próprio
package.el
repositório ( http://orgmode.org/elpa/ ).Todos os repositórios de pacotes funcionam da mesma maneira, basta adicioná-los ao seu
package-archives
.Aqui está um post de blog mais aprofundado sobre esse assunto, com o qual concordo principalmente.
Não tenho certeza, mas acho que se um pacote for duplicado em diferentes repositórios, a ordem em que os repositórios aparecerão
package-archives
determina a precedência. Não sei se a maior precedência está no início ou no final da lista.Atualização: No Emacs 25, há uma variável
package-archive-priorities
que você pode usar para priorizar seus repositórios de pacotes (por exemplo, prefira ELPA sobre MELPA).Aqui está a seção relevante da minha
init.el
, se você estiver interessado:fonte
when (not package-archive-contents)
verifica?(refresh-package-contents)
incondicionalmente antes de baixar novos pacotes, caso contrário, o Emacs pode tentar fazer o download de uma versão antiga do pacote (que já é 404), falhar e parar de carregar.No Emacs, use
M-x list-packages
para listar todos os pacotes que atualizarão automaticamente o conteúdo do arquivo. Depois, useU
para marcar todos os pacotes atualizáveis a serem atualizados ex
realmente executar as novas atualizações. O Emacs buscará e instalará todas as atualizações e solicitará a remoção das versões antigas e obsoletas posteriormente.Você também pode dar uma olhada no Carton, que fornece uma maneira mais conveniente de gerenciar seus pacotes, declarando-os em um arquivo dedicado, e inclui um cliente de linha de comando conveniente para instalar e atualizar automaticamente os pacotes declarados dessa maneira.
A fim de
package-archives
que não importa. O Emacs agrega o conteúdo de todos os arquivos em uma única lista coerente de pacotes disponíveis e suas versões, armazenados empackage-archive-contents
.Em
package-install
seguida, o Emacs simplesmente escolherá a versão mais recente de um pacote, independentemente do arquivo de origem. Para obter mais controle sobre a origem do pacote, o MELPA fornece o pacote melpa, que permite pacotes em lista negra ou na lista branca de arquivos especificados.fonte
S-u
para ser mais preciso.S-u
? O menu do pacote não usa essa ligação.Shift-u
com isso.No terminal:
isso coloca você no buffer * packages *
O emacs solicitará (s / n), aguarde atualizações
isso matará o buffer * packages * e retornará você de volta ao * scratch *
isso sairá do emacs e permitirá que você reinicie via, mas talvez seja necessário depurar :(
meus 2 ¢
fonte
M-x package-refresh-contents
, ele me levou a digitar “U” para marcar todos os itens para atualização e, em seguida, fui capaz de digitar “x” para executar as atualizações.Este é mais um comentário estendido sobre a resposta de jpkotta.
Este é um ajuste que estou experimentando para a resposta de jpkotta acima:
(substituindo
(when (not package-archive-contents) (package-refresh-contents))
).A lista de pacotes não era atualizada o suficiente para o meu caso de uso.
Não considerei se existe uma solução mais eficiente para o meu problema; primeiro, tenho que ver se o problema desaparece com esse ajuste.
fonte
package-archive-contents
é atualizado apenas se não existir. A idéia é que você copie seu arquivo .emacs.d para uma nova máquina e instale automaticamente todos os seus pacotes, mas depois disso você precisará atualizar manualmente. Eu tento atualizar uma vez a cada duas semanas. Acho que você adicionou um pacote à sua lista, mas vocêpackage-archive-contents
era muito velho para tê-lo?~/.emacs.d/elpa/
para localização de pacotes. No entanto, minha versão do seu código de instalação de pacotes está em uma "terceira" partição, (e:/emacs-config
ou/e/emacs-config/
). Portanto, adiciono um pacote à lista enquanto estiver em um sistema operacional e ele deve ser atualizado quando carregarEmacs
no outro sistema operacional. Com certeza há algum elemento de exagero na minha solução, mas parece estar funcionando pelo menos.package-archive-contents
parecia estar tão fora de moda me escapa. Essa é uma questão que não reduzi. Se eu procurar e encontrar uma solução "mais elegante" no futuro, vou adicioná-la à minha postagem.(package-refresh-contents)
escreve para~/.emacs.d/elpa/archives
. Não está claro se você possui esse diretório compartilhado entre sistemas operacionais. Eu recomendaria não compartilhar oselpa/
diretórios, porque o bytecode do Emacs (o código inelpa/
é compilado) não é compatível com versões anteriores ( gnu.org/software/emacs/manual/html_node/elisp/… ). Você precisaria garantir que ambas as instalações tenham a mesma versão do Emacs. Eu mantenho meu.emacs.d
controle de versão e sincronizo diferentes instalações com isso.