summary refs log tree commit diff
path: root/emacs/init.el
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2022-04-19 08:39:45 -0700
committerFranck Cuny <franck@fcuny.net>2022-04-19 08:39:45 -0700
commit352e373f439027f29b491cf0842dbb42c4d00db8 (patch)
tree10324abfef9680f0366390583bc13ee4cb2275de /emacs/init.el
parentfeed update (diff)
downloademacs.d-352e373f439027f29b491cf0842dbb42c4d00db8.tar.gz
start to install packages without use-package
Define a list of packages in `init.el', and then use plain `require' in
the various custom modules.

The first two packages installed that way are:
- notmuch
- exec-path-from-shell
Diffstat (limited to '')
-rw-r--r--emacs/init.el50
1 files changed, 33 insertions, 17 deletions
diff --git a/emacs/init.el b/emacs/init.el
index 26f5132..1ef3676 100644
--- a/emacs/init.el
+++ b/emacs/init.el
@@ -14,30 +14,46 @@
 	     '("melpa" .
 	       "https://melpa.org/packages/"))
 
-(progn
-  (message "initializing package")
-  (package-initialize))
+(defvar my/package-list
+  '(use-package
+     exec-path-from-shell
+     notmuch)
+  "List of packages to be installed.")
 
-(unless (package-installed-p 'use-package)
-  (package-refresh-contents)
-  (package-install 'use-package))
+(defun my/packages-installed-p ()
+  "Check if all packages in `my/package-list' are installed."
+  (cl-every #'package-installed-p my/package-list))
+
+(defun my/require-package (package)
+  "Install PACKAGE unless already installed."
+  (unless (memq package my/package-list)
+    (add-to-list 'my/package-list package))
+  (unless (package-installed-p package)
+    (package-install package)))
+
+(defun my/require-packages (packages)
+  "Ensure PACKAGES are installed.
+Missing packages are installed automatically."
+  (mapc #'my/require-package packages))
+
+(defun my/install-packages ()
+  "Install all packages listed in `my/package-list'."
+  (unless (my/packages-installed-p)
+    ;; check for new packages (package versions)
+    (message "%s" "Reloading packages DB...")
+    (package-refresh-contents)
+    (message "%s" " done.")
+    ;; install the missing packages
+    (my/require-packages my/package-list)))
+
+;; run package installation
+(my/install-packages)
 
 (eval-when-compile (require 'use-package))
 
 (setq use-package-verbose t)
 (setq use-package-always-ensure nil)
 
-(defun my/package-install-refresh-contents (&rest args)
-  "Refresh the package content, takes an optional ARGS."
-  ;; Whenever use-package statements use ensure (directly or via
-  ;; use-package-always-ensure), we need to refresh the package contents first,
-  ;; as installation fails otherwise:
-  ;; https://github.com/jwiegley/use-package/issues/256#issuecomment-263313693
-  (package-refresh-contents)
-  (advice-remove 'package-install 'my/package-install-refresh-contents))
-
-(advice-add 'package-install :before 'my/package-install-refresh-contents)
-
 (add-to-list 'load-path (expand-file-name "custom/" user-emacs-directory))
 (add-to-list 'load-path (expand-file-name "elisp/" user-emacs-directory))