Autoinstalar paquetes de emacs con MELPA
elisp packages (5)
Quiero declarar todos los paquetes que quiero usar en emacs en un archivo init.el. Me pregunto si es posible cargar los paquetes faltantes con, por ejemplo, MELPA cuando inicio emacs sin pasar por la lista y marcar los que quiero instalar.
Nueva respuesta:
Si bien mi respuesta original sigue siendo válida, ahora uso el método sugerido por Jordon . use-package
es una herramienta fantástica para las configuraciones ordenadas de Emacs. De hecho, ya lo estaba usando para cargar paquetes limpios cuando escribí mi respuesta original.
En ese momento, me olvidé de leer todo el camino hasta la parte inferior de su README , y por lo tanto no me di cuenta de que también podía manejar la instalación de paquetes:
Para usuarios de
package.el
Puede usar
use-package
para cargar paquetes desde ELPA con package.el. Esto es particularmente útil si comparte sus .emacs entre varias máquinas; Los paquetes relevantes se descargarán automáticamente una vez colocados en sus archivos .emacs. La clave:ensure
que el paquete instalará automáticamente si no está ya presente:
(use-package tex-site :ensure auctex)
Después de cargar package.el
e inicializar mis repositorios de paquetes, mi configuración contiene
(if (not (package-installed-p ''use-package))
(progn
(package-refresh-contents)
(package-install ''use-package)))
(require ''use-package)
y posteriormente muchos fragmentos como este:
;;; Expand-region
(use-package expand-region
:ensure expand-region
:bind ("C-=" . er/expand-region))
Si encuentra útil esta información, por favor, dale un voto a Jordon.
Respuesta original:
Eche un vistazo a Cask y Pallet , que trabajan juntos para resolver este problema.
Desde el sitio web de Cask:
Cask for Emacs es lo que Bundler es para Ruby. Su objetivo es hacer que el manejo de la dependencia de ELPA en Emacs sea indoloro (tan indoloro como sea posible). Esto incluye tanto la instalación local de Emacs como el desarrollo del paquete de Emacs.
Después de instalar Cask , deberá agregar algo como esto a su configuración de Emacs:
(require ''cask)
(cask-initialize)
Cask define un lenguaje específico para las dependencias elisp. Para instalar paquetes, necesitará algo como lo que se describe aquí :
(source melpa)
(depends-on "auto-complete")
(depends-on "dash")
(depends-on "f")
(depends-on "flycheck")
(depends-on "helm")
(depends-on "magit")
(depends-on "popup")
(depends-on "projectile")
(depends-on "s")
(depends-on "smartparens")
(depends-on "yasnippet")
Tenga en cuenta que esto no se incluye en el archivo de configuración de Emacs, sino en ~/.emacs.d/Cask
.
Pallet actualiza el archivo Cask con paquetes instalados interactivamente, por ejemplo, a través de Mx package-list-packages
, de modo que no tiene que mantener manualmente el archivo anterior.
Además de las excelentes opciones sugeridas anteriormente, también puede querer echar un vistazo a el-get . Lo uso para la configuración de mi emacs y estoy muy contento con él.
¿Como es diferente?
Dos ventajas principales de el-get son
1) Puede obtener paquetes de diversas fuentes, el sitio web enumera las siguientes fuentes posibles
github, emacswiki, GNU ELPA o Marmalade, páginas privadas, git, bzr, CVS, etc.
2) Se puede usar para ejecutar comandos del sistema operativo como make
si es necesario durante la instalación del paquete. Esto facilita la instalación de paquetes que tienen partes que no tienen elisp, por ejemplo. emacs-jedi , ropemacs etc
Instalando el-get
La instalación es bastante simple, necesitará agregar el siguiente código de arranque que se le dio en su sitio web a su archivo de inicio.
(add-to-list ''load-path "~/.emacs.d/el-get/el-get")
(unless (require ''el-get nil ''noerror)
(with-current-buffer
(url-retrieve-synchronously
"https://raw.github.com/dimitri/el-get/master/el-get-install.el")
(goto-char (point-max))
(eval-print-last-sexp)))
(el-get ''sync)
Esto instalará el-get
si aún no está instalado.
Instalando paquetes
Luego puede declarar los paquetes que desea instalar y dejar que el-get
instale.
;; List of packages you want to install
(defvar my-packages ''(auto-complete flycheck smart-parens...))
;; This will install any package from my-packages which is not already installed
(el-get ''sync my-packages)
O
Siempre puede instalar los paquetes manualmente haciendo el-get-install <package-name> RET
. Dudo que desee instalar docenas de paquetes diferentes de esta manera, pero es posible.
Actualizando paquetes
Actualizar paquetes es simplemente una cuestión de hacer el-get-update
para actualizar un paquete específico o el-get-update-all
para actualizar todos los paquetes instalados.
Aquí está mi respuesta a una pregunta similar: https://.com/a/14838150/245173 . El código instalará automáticamente los paquetes faltantes, pero no actualizará los existentes, por lo que solo el primer inicio es lento.
Todas estas respuestas funcionarán, pero recomendaría encarecidamente usar use-package
encontrado aquí: use-package
use-package no solo instalará automáticamente sus paquetes faltantes, sino que simplificará enormemente su init.el.
Aquí hay un ejemplo de mi init.el
;; initial package setup
(push "path/to/use-package" load-path)
(require ''use-package)
(require ''package)
(mapc (lambda(p) (push p package-archives))
''(("marmalade" . "http://marmalade-repo.org/packages/")
("melpa" . "http://melpa.milkbox.net/packages/")))
(package-refresh-contents)
(package-initialize)
;; this will install undo-tree if it''s not there
;; and it will set it up how I want
(use-package undo-tree
:init (global-undo-tree-mode 1)
:bind (("C-c j" . undo-tree-undo)
("C-c k" . undo-tree-redo)
("C-c l" . undo-tree-switch-branch)
("C-c ;" . undo-tree-visualize))
:ensure t)
Eche un vistazo a mi init.el aquí: https://github.com/jordonbiondo/.emacs.d/blob/master/init.el
cada bloque de paquete de uso instalará el paquete especificado si no está allí, y encapsula toda mi configuración adicional para paquetes como combinaciones de teclas, enlaces y otras personalizaciones.
Un poco de código en su archivo de inicio puede hacer eso con bastante facilidad:
(setq my-onlinep nil)
(unless
(condition-case nil
(delete-process
(make-network-process
:name "my-check-internet"
:host "elpa.gnu.org"
:service 80))
(error t))
(setq my-onlinep t))
(setq my-packages
''(ack-and-a-half
ac-nrepl
... more packages here ...
web-mode
yaml-mode
yari
yasnippet))
(when my-onlinep
(package-refresh-contents)
(cl-loop for p in my-packages
unless (package-installed-p p)
do (package-install p)))
La verificación en línea no es realmente necesaria, pero ayuda a evitar un inicio atascado de Emacs cuando no hay conexión a Internet.
Para mi configuración completa, consulte aquí: http://steckerhalter.co.vu/steckemacs.html#sec-2-5