*** No =package.el=
-I can do all my package management things with Borg, and don't need
-Emacs' built-in =package.el=. Emacs 27 lets us disable =package.el= in
-the =early-init-file= (see [[https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=24acb31c04b4048b85311d794e600ecd7ce60d3b][here]]).
+I can do all my package management things with =straight.el=, and
+don't need Emacs' built-in =package.el=. Emacs 27 lets us disable
+=package.el= in the =early-init-file= (see [[https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=24acb31c04b4048b85311d794e600ecd7ce60d3b][here]]).
#+begin_src emacs-lisp :tangle early-init.el
(setq package-enable-at-startup nil)
ship in their repos, I'll still put the old workaround with the
commented call to ~package-initialize~ here anyway.
-#+begin_src emacs-lisp
+#+begin_src emacs-lisp :tangle no
(setq package-enable-at-startup nil)
;; (package-initialize)
#+end_src
-*** Borg
+Update: the above is not necessary, since =straight.el= automatically
+does that (and more). See =straight-package-neutering-mode=.
+
+*** =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")
+
+(defvar bootstrap-version)
+(let ((bootstrap-file
+ (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
+ (bootstrap-version 5))
+ (unless (file-exists-p bootstrap-file)
+ (with-current-buffer
+ (url-retrieve-synchronously
+ "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
+ 'silent 'inhibit-cookies)
+ (goto-char (point-max))
+ (eval-print-last-sexp)))
+ (load bootstrap-file nil 'nomessage))
+
+(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
Assimilate Emacs packages as Git submodules
and without compromising on performance.
#+begin_src emacs-lisp
-(require 'use-package)
+(straight-use-package 'use-package)
(if nil ; set to t when need to debug init
(setq use-package-verbose t
use-package-expand-minimally nil
use-package-expand-minimally t))
#+end_src
-*** Epkg
+*** COMMENT Epkg
#+begin_quote
Browse the Emacsmirror package database
it it's own file. While at it, treat themes as safe.
#+begin_src emacs-lisp
-(use-package custom
+(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
+(use-feature server
:defer 1
:config (or (server-running-p) (server-mode)))
#+end_src
'auto-compile-inhibit-compile-detached-git-head))
#+end_src
-*** [[https://orgmode.org/][Org mode]]
+*** [[https://orgmode.org/][Org]]
#+begin_quote
Org mode is for keeping notes, maintaining TODO lists, planning
In short, my favourite way of life.
+First, we have to resort to a [[https://github.com/raxod502/straight.el#installing-org-with-straightel][hack]] to be able to use the correct
+latest version of Org from upstream.
+
#+begin_src emacs-lisp
-(use-package org
- :defer 1
+ (use-package git)
+
+ (defun org-git-version ()
+ "The Git version of org-mode.
+ Inserted by installing org-mode or when a release is made."
+ (require 'git)
+ (let ((git-repo (expand-file-name
+ "straight/repos/org/" user-emacs-directory)))
+ (string-trim
+ (git-run "describe"
+ "--match=release\*"
+ "--abbrev=6"
+ "HEAD"))))
+
+ (defun org-release ()
+ "The release version of org-mode.
+ Inserted by installing org-mode or when a release is made."
+ (require 'git)
+ (let ((git-repo (expand-file-name
+ "straight/repos/org/" user-emacs-directory)))
+ (string-trim
+ (string-remove-prefix
+ "release_"
+ (git-run "describe"
+ "--match=release\*"
+ "--abbrev=0"
+ "HEAD")))))
+
+(provide 'org-version)
+#+end_src
+
+We will use the =org-plus-contrib= package to get the whole deal:
+
+#+begin_src emacs-lisp
+(straight-use-package 'org-plus-contrib)
+#+end_src
+
+And here's where my actual Org configurations begin:
+
+#+begin_src emacs-lisp
+(use-feature org
+ :defer 0.5
:config
(setq org-src-tab-acts-natively t
org-src-preserve-indentation nil
'(org-block ((t (:background "#1d1f21"))))
'(org-latex-and-related ((t (:foreground "#b294bb")))))
-(use-package ox-latex
+(use-feature ox-latex
:after ox
:config
(setq org-latex-listings 'listings
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
t))
-(use-package ox-beamer
+(use-feature ox-beamer
:after ox)
-
-(use-package orgalist
- :after message
- :hook (message-mode . orgalist-mode))
#+end_src
**** asynchronous tangle
:custom-face (magit-diff-file-heading ((t (:weight normal)))))
#+end_src
-*** [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
+*** COMMENT [[https://github.com/abo-abo/swiper][Ivy]] (and friends)
#+begin_quote
Ivy - a generic completion frontend for Emacs, Swiper - isearch with
(defalias 'locate #'counsel-locate))
#+end_src
-*** eshell
+*** COMMENT eshell
#+begin_src emacs-lisp
(use-package eshell
(eshell-input-filter 'eshell-input-filter-initial-space))
#+end_src
-*** Ibuffer
+*** COMMENT Ibuffer
#+begin_src emacs-lisp
(use-package ibuffer
:hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default"))))
#+end_src
-*** Outline
+*** COMMENT Outline
#+begin_src emacs-lisp
(use-package outline
("s" . outline-show-subtree)))
#+end_src
-* Borg's =layer/essentials=
+* COMMENT Borg's =layer/essentials=
:PROPERTIES:
:CUSTOM_ID: borg-essentials
:END:
#+end_src
-* Editing
+* COMMENT Editing
:PROPERTIES:
:CUSTOM_ID: editing
:END:
(global-company-mode t))
#+end_src
-* Syntax and spell checking
+* COMMENT Syntax and spell checking
:PROPERTIES:
:CUSTOM_ID: syntax-spell-checking
:END:
#'endless/replace-quote))
#+end_src
-* Programming modes
+* COMMENT Programming modes
:PROPERTIES:
:CUSTOM_ID: programming-modes
:END:
:load-path "lib/guix/elisp")
#+end_src
-* Emacs enhancements
+* COMMENT Emacs enhancements
:PROPERTIES:
:CUSTOM_ID: emacs-enhancements
:END:
#+begin_src emacs-lisp
(use-package which-key
:defer 1
- :config (which-key-mode))
+ :config
+ (which-key-add-key-based-replacements
+ ;; prefixes for global prefixes and minor modes
+ "C-c @" "outline"
+ "C-c !" "flycheck"
+ "C-c 8" "typo"
+ "C-c 8 -" "typo/dashes"
+ "C-c 8 <" "typo/left-brackets"
+ "C-c 8 >" "typo/right-brackets"
+ "C-x 8" "unicode"
+ "C-x a" "abbrev/expand"
+ "C-x r" "rectangle/register/bookmark"
+ "C-x v" "version control"
+ ;; prefixes for my personal bindings
+ "C-c a" "applications"
+ "C-c a s" "shells"
+ "C-c b" "borg"
+ "C-c c" "compile-and-comments"
+ "C-c e" "eval"
+ "C-c f" "files"
+ "C-c F" "frames"
+ "C-S-h" "help(ful)"
+ "C-c m" "multiple-cursors"
+ "C-c p" "projectile"
+ "C-c p s" "projectile/search"
+ "C-c p x" "projectile/execute"
+ "C-c p 4" "projectile/other-window"
+ "C-c q" "boxquote"
+ "s-g" "magit"
+ "s-o" "outline"
+ "s-t" "themes")
+
+ ;; prefixes for major modes
+ (which-key-add-major-mode-key-based-replacements 'message-mode
+ "C-c f" "footnote")
+ (which-key-add-major-mode-key-based-replacements 'org-mode
+ "C-c C-v" "org-babel")
+ (which-key-add-major-mode-key-based-replacements 'web-mode
+ "C-c C-a" "web/attributes"
+ "C-c C-b" "web/blocks"
+ "C-c C-d" "web/dom"
+ "C-c C-e" "web/element"
+ "C-c C-t" "web/tags")
+
+ (which-key-mode))
#+end_src
** theme
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 multi-term
:defer 1
- :bind (("C-c a s m m" . multi-term)
- ("C-c a s m p" . multi-term-dedicated-toggle)
+ :bind (("C-c a s m" . multi-term-dedicated-toggle)
:map term-mode-map
("C-c C-j" . term-char-mode)
:map term-raw-map
("a" . mc/mark-all-like-this))))
#+end_src
-* Email
+* COMMENT Email
:PROPERTIES:
:CUSTOM_ID: email
:END:
(gnus-harvest-install)))
#+end_src
-* Blogging
+* COMMENT Blogging
:PROPERTIES:
:CUSTOM_ID: blogging
:END:
* 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: