*** =straight.el=
+#+begin_quote
+Next-generation, purely functional package manager for the Emacs
+hacker.
+#+end_quote
+
+=straight.el= allows me to have a fully reproducible Emacs setup.
+
#+begin_src emacs-lisp
(setq straight-repository-branch "develop")
(setq straight-use-package-by-default t)
#+end_src
+Since we enable =straight.el='s =straight-use-package-by-default=
+integration, we will define a =use-feature= for plain ole
+=use-package= without any of the =straight.el= stuff.
+
+#+begin_src emacs-lisp
+(defmacro use-feature (name &rest args)
+ "Like `use-package', but with `straight-use-package-by-default' disabled."
+ (declare (indent defun))
+ `(use-package ,name
+ :straight nil
+,@args))
+#+end_src
+
*** COMMENT Borg
#+begin_quote
debug-on-error t)
(setq use-package-verbose nil
use-package-expand-minimally t))
+
+(setq use-package-always-defer t)
#+end_src
*** COMMENT Epkg
it it's own file. While at it, treat themes as safe.
#+begin_src emacs-lisp
-(use-package custom
- :straight nil
+(use-feature custom
:no-require t
:config
(setq custom-file (no-littering-expand-etc-file-name "custom.el"))
See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server][Using Emacs as a Server]].
#+begin_src emacs-lisp
-(use-package server
- :straight nil
+(use-feature server
:defer 1
:config (or (server-running-p) (server-mode)))
#+end_src
(setq-default cursor-type 'bar)
#+end_src
+*** Allow scrolling in Isearch
+
+#+begin_src emacs-lisp
+(setq isearch-allow-scroll t)
+#+end_src
+
** Bindings
#+begin_src emacs-lisp
+(require 'bind-key)
(bind-keys
("C-c a i" . ielm)
And here's where my actual Org configurations begin:
#+begin_src emacs-lisp
-(use-package org
- :straight nil
+(use-feature org
:defer 0.5
:config
(setq org-src-tab-acts-natively t
'(org-block ((t (:background "#1d1f21"))))
'(org-latex-and-related ((t (:foreground "#b294bb")))))
-(use-package ox-latex
- :straight nil
+(use-feature ox-latex
:after ox
:config
(setq org-latex-listings 'listings
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
t))
-(use-package ox-beamer
- :straight nil
+(use-feature ox-beamer
+ :demand
:after ox)
-
-(use-package orgalist
- :after message
- :hook (message-mode . orgalist-mode))
#+end_src
**** asynchronous tangle
(defvar a/show-async-tangle-time nil
"Show the time spent tangling the file.")
- (defvar a/async-tangle-post-compile "make ti"
+ (defvar a/async-tangle-post-compile nil
"If non-nil, pass to `compile' after successful tangle.")
+ (defvar a/async-tangle-byte-recompile t
+ "If non-nil, byte-recompile the file on successful tangle.")
+
(defun a/async-babel-tangle ()
"Tangle org file asynchronously."
(interactive)
(file (buffer-file-name))
(file-nodir (file-name-nondirectory file))
;; (async-quiet-switch "-q")
- )
+ (file-noext (file-name-sans-extension file)))
(async-start
`(lambda ()
(require 'org)
`(lambda (result)
(if result
(progn
+ (setq byte-compile-warnings '(not noruntime unresolved))
(message "Tangled %s%s"
,file-nodir
(if a/show-async-tangle-time
',file-tangle-start-time)))
""))
(when a/async-tangle-post-compile
- (compile a/async-tangle-post-compile)))
+ (compile a/async-tangle-post-compile))
+ (when a/async-tangle-byte-recompile
+ (byte-recompile-file (concat ,file-noext ".el"))))
(message "Tangling %s failed" ,file-nodir))))))))
(add-to-list
:custom-face (magit-diff-file-heading ((t (:weight normal)))))
#+end_src
-*** COMMENT [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
+*** recentf
+
+Recently opened files.
+
+#+begin_src emacs-lisp
+(use-feature recentf
+ :defer 0.5
+ :config
+ (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+ (setq recentf-max-saved-items 40))
+#+end_src
+
+*** smex
+
+#+begin_quote
+A smart M-x enhancement for Emacs.
+#+end_quote
+
+Mostly because =counsel= needs it to remember history.
+
+#+begin_src emacs-lisp
+(use-package smex)
+#+end_src
+
+*** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
#+begin_quote
Ivy - a generic completion frontend for Emacs, Swiper - isearch with
#+begin_src emacs-lisp
(use-package ivy
- :defer 1
+ :defer 0.6
:bind
(:map ivy-minibuffer-map
([escape] . keyboard-escape-quit)
#+begin_src emacs-lisp
(use-package swiper
+ :after ivy
:bind (("C-s" . swiper)
("C-r" . swiper)
("C-S-s" . isearch-forward)))
#+begin_src emacs-lisp
(use-package counsel
- :defer 1
+ :after ivy
:bind (([remap execute-extended-command] . counsel-M-x)
([remap find-file] . counsel-find-file)
("s-r" . counsel-recentf)
(defalias 'locate #'counsel-locate))
#+end_src
-*** COMMENT eshell
+*** eshell
#+begin_src emacs-lisp
-(use-package eshell
+(use-feature eshell
:defer 1
:commands eshell
:bind ("C-c a s e" . eshell)
(eshell-input-filter 'eshell-input-filter-initial-space))
#+end_src
-*** COMMENT Ibuffer
+*** Ibuffer
#+begin_src emacs-lisp
-(use-package ibuffer
- :defer t
+(use-feature ibuffer
:bind
(("C-x C-b" . ibuffer-other-window)
:map ibuffer-mode-map
:hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
#+end_src
-*** COMMENT Outline
+*** Outline
#+begin_src emacs-lisp
-(use-package outline
- :defer t
+(use-feature outline
:hook (prog-mode . outline-minor-mode)
:bind
(:map
("s" . outline-show-subtree)))
#+end_src
-* COMMENT Borg's =layer/essentials=
-:PROPERTIES:
-:CUSTOM_ID: borg-essentials
-:END:
-
-TODO: break this giant source block down into individual org sections.
+*** Dired
#+begin_src emacs-lisp
-(use-package dash
- :config (dash-enable-font-lock))
-
-(use-package diff-hl
- :config
- (setq diff-hl-draw-borders nil)
- (global-diff-hl-mode)
- (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh t))
-
-(use-package ls-lisp
+(use-feature ls-lisp
:custom (ls-lisp-dirs-first t))
-(use-package dired
- :defer t
+(use-feature dired
:config
(setq dired-listing-switches "-alh"
ls-lisp-use-insert-directory-program nil)
;; https://oremacs.com/2017/03/18/dired-ediff/
(defun dired-ediff-files ()
(interactive)
+ (require 'dired-aux)
(defvar ediff-after-quit-hook-internal)
(let ((files (dired-get-marked-files))
(wnd (current-window-configuration)))
(set-window-configuration wnd))))
(error "no more than 2 files should be marked"))))
:bind (:map dired-mode-map
+ ("b" . dired-up-directory)
("e" . dired-ediff-files)
("E" . dired-toggle-read-only)
("\\" . dired-hide-details-mode)
(interactive)
(a/dired-start-process "zathura"))))
:hook (dired-mode . dired-hide-details-mode))
+#+end_src
-(use-package eldoc
- :when (version< "25" emacs-version)
- :config (global-eldoc-mode))
+*** Help
-(use-package help
- :defer t
+#+begin_src emacs-lisp
+(use-feature help
:config
(temp-buffer-resize-mode)
(setq help-window-select t))
+#+end_src
-(progn ; `isearch'
- (setq isearch-allow-scroll t))
+*** Tramp
-(use-package lisp-mode
+#+begin_src emacs-lisp
+(use-feature tramp
:config
- (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode)
- (add-hook 'emacs-lisp-mode-hook 'reveal-mode)
- (defun indent-spaces-mode ()
- (setq indent-tabs-mode nil))
- (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
+ (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:"))
+ (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil))
+ (add-to-list 'tramp-default-proxies-alist
+ (list (regexp-quote (system-name)) nil nil)))
+#+end_src
-(use-package man
- :defer t
- :config (setq Man-width 80))
+*** Dash
-(use-package paren
- :config (show-paren-mode))
+#+begin_src emacs-lisp
+(use-package dash
+ :config (dash-enable-font-lock))
+#+end_src
-(use-package prog-mode
- :config (global-prettify-symbols-mode)
- (defun indicate-buffer-boundaries-left ()
- (setq indicate-buffer-boundaries 'left))
- (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left))
+* Editing
+:PROPERTIES:
+:CUSTOM_ID: editing
+:END:
-(use-package recentf
- :defer 0.5
+** =diff-hl=
+
+Highlight uncommitted changes in the left fringe.
+
+#+begin_src emacs-lisp
+(use-package diff-hl
:config
- (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
- (setq recentf-max-saved-items 40))
+ (setq diff-hl-draw-borders nil)
+ (global-diff-hl-mode)
+ :hook (magit-post-refresh . diff-hl-magit-post-refresh))
+#+end_src
+
+** ElDoc
-(use-package savehist
+Display Lisp objects at point in the echo area.
+
+#+begin_src emacs-lisp
+(use-feature eldoc
+ :when (version< "25" emacs-version)
+ :config (global-eldoc-mode))
+#+end_src
+
+** paren
+
+Highlight matching parens.
+
+#+begin_src emacs-lisp
+(use-feature paren
+ :config (show-paren-mode))
+#+end_src
+
+** =savehist=
+
+Save minibuffer history.
+
+#+begin_src emacs-lisp
+(use-feature savehist
:config (savehist-mode))
+#+end_src
+
+** =saveplace=
+
+Automatically save place in each file.
-(use-package saveplace
+#+begin_src emacs-lisp
+(use-feature saveplace
:when (version< "25" emacs-version)
:config (save-place-mode))
+#+end_src
-(use-package simple
- :config (column-number-mode))
+** =prog-mode=
-(progn ; `text-mode'
- (add-hook 'text-mode-hook #'indicate-buffer-boundaries-left)
- (add-hook 'text-mode-hook #'abbrev-mode))
+#+begin_src emacs-lisp
+(use-feature prog-mode
+ :config (global-prettify-symbols-mode)
+ (defun indicate-buffer-boundaries-left ()
+ (setq indicate-buffer-boundaries 'left))
+ (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left))
+#+end_src
-(use-package tramp
- :defer t
- :config
- (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:"))
- (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil))
- (add-to-list 'tramp-default-proxies-alist
- (list (regexp-quote (system-name)) nil nil)))
+** =text-mode=
+#+begin_src emacs-lisp
+(use-feature text-mode
+ :hook ((text-mode . indicate-buffer-boundaries-left)
+ (text-mode . abbrev-mode)))
#+end_src
-* COMMENT Editing
-:PROPERTIES:
-:CUSTOM_ID: editing
-:END:
-
** Company
#+begin_src emacs-lisp
(global-company-mode t))
#+end_src
-* COMMENT Syntax and spell checking
-:PROPERTIES:
-:CUSTOM_ID: syntax-spell-checking
-:END:
+** Flycheck
#+begin_src emacs-lisp
(use-package flycheck
#'endless/replace-quote))
#+end_src
-* COMMENT Programming modes
+* Programming modes
:PROPERTIES:
:CUSTOM_ID: programming-modes
:END:
+** Lisp
+
+#+begin_src emacs-lisp
+(use-feature lisp-mode
+ :config
+ (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode)
+ (add-hook 'emacs-lisp-mode-hook 'reveal-mode)
+ (defun indent-spaces-mode ()
+ (setq indent-tabs-mode nil))
+ (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
+#+end_src
+
** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]])
#+begin_src emacs-lisp
(use-package alloy-mode
- :defer t
+ :straight (:host github :repo "dwwmmn/alloy-mode")
:config (setq alloy-basic-offset 2))
#+end_src
** [[https://coq.inria.fr][Coq]] (with [[https://github.com/ProofGeneral/PG][Proof General]])
#+begin_src emacs-lisp
-(use-package proof-site ; Proof General
- :defer t
- :load-path "lib/proof-site/generic/")
+(use-package proof-site
+ :straight proof-general)
#+end_src
** [[https://leanprover.github.io][Lean]] (with [[https://github.com/leanprover/lean-mode][lean-mode]])
#+begin_src emacs-lisp
(use-package haskell-mode
- :defer t
:config
(setq haskell-indentation-layout-offset 4
haskell-indentation-left-offset 4
("C-c l l" . hs-lint)))
#+end_src
-** Web dev
+** Web
*** SGML and HTML
#+begin_src emacs-lisp
(use-package sgml-mode
- :defer t
:config
(setq sgml-basic-offset 2))
#+end_src
#+begin_src emacs-lisp
(use-package css-mode
- :defer t
:config
(setq css-indent-offset 2))
#+end_src
#+begin_src emacs-lisp
(use-package web-mode
- :defer t
:mode "\\.html\\'"
:config
(a/setq-every 2
:after (treemacs))
#+end_src
-** geiser
+** COMMENT geiser
#+begin_src emacs-lisp
(use-package geiser)
-(use-package geiser-guile
+(use-feature geiser-guile
:config
(setq geiser-guile-load-path "~/src/git/guix"))
#+end_src
-** guix
+** COMMENT guix
#+begin_src emacs-lisp
-(use-package guix
- :load-path "lib/guix/elisp")
+(use-package guix)
#+end_src
-* COMMENT Emacs enhancements
+* Emacs enhancements
:PROPERTIES:
:CUSTOM_ID: emacs-enhancements
:END:
+** man
+
+#+begin_src emacs-lisp
+(use-feature man
+ :config (setq Man-width 80))
+#+end_src
+
** [[https://github.com/justbur/emacs-which-key][which-key]]
#+begin_quote
#+begin_src emacs-lisp
(use-package smart-mode-line
+ :commands (sml/apply-theme)
:config
(sml/setup))
#+end_src
** [[https://github.com/bbatsov/crux][crux]]
#+begin_src emacs-lisp
-(use-package crux
+(use-package crux ; results in Waiting for git... [2 times]
:defer 1
:bind (("C-c b k" . crux-kill-other-buffers)
("C-c d" . crux-duplicate-current-line-or-region)
#+begin_src emacs-lisp
(use-package projectile
- :defer t
:bind-keymap ("C-c p" . projectile-command-map)
:config
(projectile-mode)
Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]].
+** orgalist
+
+#+begin_src emacs-lisp
+(use-package orgalist
+ :after message
+ :hook (message-mode . orgalist-mode))
+#+end_src
+
** typo.el
#+begin_src emacs-lisp
#+begin_src emacs-lisp
(use-package shrink-path
- :after eshell
+ :defer 2
:config
(setq eshell-prompt-regexp "\\(.*\n\\)*λ "
eshell-prompt-function #'+eshell/prompt)
#+begin_src emacs-lisp
(use-package eshell-up
+ :commands eshell-up
:after eshell)
#+end_src
("a" . mc/mark-all-like-this))))
#+end_src
-* COMMENT Email
+* Email
:PROPERTIES:
:CUSTOM_ID: email
:END:
mail-user-agent 'gnus-user-agent
read-mail-command 'gnus)
-(use-package gnus
+(use-feature gnus
:bind (("s-m" . gnus)
("s-M" . gnus-unplugged))
:init
gnus-interactive-exit nil
gnus-gcc-mark-as-read t))
-(use-package gnus-art
+(use-feature gnus-art
:config
(setq
gnus-visible-headers
("R" . gnus-article-wide-reply-with-original)
("M-L" . org-store-link)))
-(use-package gnus-sum
+(use-feature gnus-sum
:bind (:map gnus-summary-mode-map
:prefix-map a/gnus-summary-prefix-map
:prefix "v"
("M-L" . org-store-link))
:hook (gnus-summary-mode . a/no-mouse-autoselect-window))
-(use-package gnus-msg
+(use-feature gnus-msg
:config
(setq gnus-posting-styles
'((".*"
(address "abandali@uwaterloo.ca")
(gcc "\"nnimap+uwaterloo:Sent Items\"")))))
-(use-package gnus-topic
+(use-feature gnus-topic
:hook (gnus-group-mode . gnus-topic-mode))
-(use-package gnus-agent
+(use-feature gnus-agent
:config
(setq gnus-agent-synchronize-flags 'ask)
:hook (gnus-group-mode . gnus-agent-mode))
-(use-package gnus-group
+(use-feature gnus-group
:config
(setq gnus-permanently-visible-groups "\\((INBOX\\|gnu$\\)"))
-(use-package mm-decode
+(use-feature mm-decode
:config
(setq mm-discouraged-alternatives '("text/html" "text/richtext")))
#+end_src
** sendmail
#+begin_src emacs-lisp
-(use-package sendmail
+(use-feature sendmail
:config
(setq sendmail-program "/usr/bin/msmtp"
;; message-sendmail-extra-arguments '("-v" "-d")
** message
#+begin_src emacs-lisp
-(use-package message
+(use-feature message
:config
(defconst a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
(defconst message-cite-style-bandali
Convenient footnotes in =message-mode=.
#+begin_src emacs-lisp
-(use-package footnote
+(use-feature footnote
:after message
:bind
(:map message-mode-map
#+begin_src emacs-lisp
(use-package ebdb
- :defer 1
+ :straight (:host github :repo "girzel/ebdb")
+ :after gnus
:bind (:map gnus-group-mode-map ("e" . ebdb))
:config
(setq ebdb-sources (no-littering-expand-var-file-name "ebdb"))
(with-eval-after-load 'swiper
(add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
-(use-package ebdb-com
+(use-feature ebdb-com
:after ebdb)
;; (use-package ebdb-complete
(add-to-list (make-local-variable 'company-backends)
'company-ebdb))))
-(use-package ebdb-gnus
+(use-feature ebdb-gnus
:after ebdb
+ :demand
:custom
(ebdb-gnus-window-configuration
'(article
(article 1.0)
(ebdb-gnus 0.3))))))
-(use-package ebdb-mua
+(use-feature ebdb-mua
:after ebdb
+ :demand
;; :custom (ebdb-mua-pop-up nil)
)
(gnus-harvest-install)))
#+end_src
-* COMMENT Blogging
+* Blogging
:PROPERTIES:
:CUSTOM_ID: blogging
:END:
(use-package ox-hugo
:after ox)
-(use-package ox-hugo-auto-export
- :load-path "lib/ox-hugo")
+(use-feature ox-hugo-auto-export
+ :after ox-hugo)
#+end_src
* Post initialization
* COMMENT Local Variables :ARCHIVE:
# Local Variables:
-# eval: ;; (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
+# eval: (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local)
# eval: (typo-mode -1)
# End: