;;; init.el --- Package bootstrapping. -*- lexical-binding: t; -*- ;; This file bootstraps the Emacs setup by going through package installations. ;; After all packages are installed, local configuration is loaded. (require 'package) (require 'seq) ;; Configure Marmalade and MELPA repositories. Packages available on Marmalade ;; will have precedence. (add-to-list 'package-archives '("marmalade" . "https://marmalade-repo.org/packages/")) (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/")) (package-initialize) ;; This variable controls all packages that should be installed. (defvar desired-packages '(;; elisp libraries dash dash-functional ht s ;; editor packages ace-jump-mode ace-window browse-kill-ring cargo company dockerfile-mode erlang exwm flycheck geiser go-mode gruber-darker-theme haskell-mode helm helm-exwm helm-pass hi2 idle-highlight-mode magit markdown-mode+ multi-term multiple-cursors nix-mode paredit password-store pg puppet-mode racer racket-mode rainbow-delimiters rainbow-mode restclient rust-mode smart-mode-line string-edit switch-window terraform-mode undo-tree uuidgen yaml-mode which-key )) (defun installable-packages (pkg-list) "Filter out not-yet installed packages from package list." (seq-filter (lambda (p) (not (package-installed-p p))) pkg-list)) (defun install-needed-packages (pkg-list) (let ((to-install (installable-packages pkg-list))) (if (< 0 (length to-install)) (progn (package-refresh-contents) (mapcar #'package-install to-install)) (message "No new packages to install.")))) ;; Run package installation! (install-needed-packages desired-packages) ;; Configure a few basics before moving on to package-specific initialisation. (setq custom-file (concat user-emacs-directory "init/custom.el")) (load custom-file) (defvar home-dir) (setq home-dir (expand-file-name "~")) ;; Seed RNG (random t) ;; Add 'init' folder that contains other settings to load. (add-to-list 'load-path (concat user-emacs-directory "init")) ;; Load configuration that makes use of installed packages: ;; Emacs will automatically initialise all installed packages. ;; After initialisation, proceed to load configuration that requires packages: (defun load-other-settings () (mapc 'require '(nixos look-and-feel functions settings modes bindings eshell-setup haskell-setup rust-setup ))) (add-hook 'after-init-hook 'load-other-settings)