Como automatizar a instalação de pacotes com o arquivo .emacs?

9

Meu arquivo ~/.emacs(que você pode encontrar no GitHub ) carrega vários pacotes Emacs diferentes e eu gostaria que eles fossem instalados automaticamente assim que o Emacs iniciar, se ainda não estiverem instalados. Dessa forma, se eu precisar reinstalar meu sistema operacional Ubuntu 16.04 novamente, não precisarei instalar cada pacote manualmente manualmente M-x package-install. Existe uma maneira de gravar um ~/.emacsarquivo para que ele instale automaticamente todos os pacotes carregados na inicialização? Eu gostaria que isso fosse feito com o mínimo de linhas, pois tenho mais de dez pacotes diferentes carregados; portanto, se eu tiver que adicionar linhas extras para cada pacote individual, isso me tornará ~/.emacsbastante longo.

BH2017
fonte
3
Existem várias maneiras, mas você deve usar github.com/jwiegley/use-package
bertfred
É possível carregar vários pacotes em uma única linha use-package, como faço na linha 61 do meu arquivo .emacs?
BH2017
Veja package-install-selected-packages(requer o Emacs 25.1).
politza
Por curiosidade, por que é uma propriedade tão desejável ter todos os seus pacotes listados em uma única linha? A única razão que você fornece é impedir que seu ~/.emacsarquivo fique "longo". Mas se você está carregando apenas uma dúzia de pacotes, está realmente preocupado com as 11 linhas extras na sua configuração?
Nispio 4/07
Bem, isso foi há alguns meses atrás, então não me lembro do meu pensamento específico, mas desconfio que isso tenha ocorrido na tentativa de minimizar a quantidade de trabalho necessária ao adicionar ou subtrair um pacote da lista que é instalada automaticamente. Não queria que várias linhas fossem adicionadas ao arquivo para cada pacote separado instalado.
BH2017

Respostas:

11

A maneira mais fácil é instalar use-package.

(package-initialize)
(require 'package)
(add-to-list 'package-archives
    '("melpa" . "http://melpa.milkbox.net/packages/") t)

(dolist (package '(use-package))
   (unless (package-installed-p package)
       (package-install package)))

Então

 (use-package paredit
   :ensure t)

O :ensure té o que garante que o pacote é instalado.

Para carregar apenas garantir a instalação de vários pacotes

(dolist (package '(package-a package-b package-c))
 (unless (package-installed-p package)
   (package-install package))
   (require package))))
njdan5691
fonte
Você pode especificar vários pacotes para carregar em uma única linha?
BH2017
Se você quer dizer use-package, então não, mas a expressão acima pode ser
njdan5691
Bem, minha pergunta é sobre vários pacotes; portanto, edite sua resposta para que ele faça exatamente isso: carrega e, se não estiver presente, instala automaticamente vários pacotes.
BH2017
o dolist pode ser alterado para '(use-package' some-other-package), mas nenhuma outra configuração pode ser feita. Eu recomendaria ter uma linha para cada pacote com use-package.
njdan5691
Tenho mais de dez pacotes diferentes carregados, portanto uma solução mais compacta seria desejável.
BH2017
4

package.elmantém o controle dos pacotes que você pediu para instalar (em oposição aos que são instalados automaticamente como dependências) na variável personalizada package-selected-packages.

Portanto, se você copiar ~/.emacs(em que o Custom normalmente grava configurações como a de package-selected-packages) em outro sistema, tudo o que você precisa fazer é M-x package-install-selected-packages.

Obviamente, isso não instala automaticamente os pacotes se eles estiverem ausentes, mas considero um recurso (acho que é um erro de um programa como o Emacs fazer conexões de rede sem uma solicitação explícita). E economiza o trabalho de instalar cada pacote, um por um.

Stefan
fonte
Obrigado. Eu só quero compartilhar meu caso de uso, que é diferente do do OP: geralmente estou transferindo meus arquivos de ponto entre máquinas (especialmente na nuvem, onde eles são criados e eliminados o tempo todo). O diretório do pacote é bastante robusto, com o elpy v-env e a pia da cozinha, especialmente considerando que as versões antigas não são auto-aparadas, o AFAIK. É muito mais fácil inserir alguns arquivos pequenos e reinstalar pacotes do que carregá-los.
kkm
Esqueci de mencionar uma coisa: (package-refresh-contents)precisa ser invocada uma vez antes, (package-install-selected-packages)quando o diretório do pacote local está totalmente ausente, para que os diretórios do archive de distribuição de pacotes sejam armazenados em cache primeiro nos subdiretórios do archive/diretório.
kkm