aboutsummaryrefslogtreecommitdiff
path: root/share/home/emacs/emacs.org
diff options
context:
space:
mode:
authorMiran Bastaja <miran.bastaja04@gmail.com>2023-12-10 17:26:26 +0100
committerMiran Bastaja <miran.bastaja04@gmail.com>2023-12-10 17:26:26 +0100
commitdd0cfef2ef6c77c396fb71f968ee9762e648f0c7 (patch)
tree32a15c0de712b85dd45791311c6f47b7dcba75c5 /share/home/emacs/emacs.org
parent871cd5454bdfdac51efc8c2243603592ecbe8bf3 (diff)
WIP: improve emacs config
Diffstat (limited to 'share/home/emacs/emacs.org')
-rw-r--r--share/home/emacs/emacs.org155
1 files changed, 155 insertions, 0 deletions
diff --git a/share/home/emacs/emacs.org b/share/home/emacs/emacs.org
new file mode 100644
index 0000000..aa5dbae
--- /dev/null
+++ b/share/home/emacs/emacs.org
@@ -0,0 +1,155 @@
+#+TITLE: Miran Bastaja's Emacs Configuration
+#+PROPERTY: header-args :tangle init.el
+#+TOC: headlines 2
+
+* Preface
+
+** Inspiration
+
+The current structure of this config was pretty much entirely copied from
+[[https://rossabaker.com/configs/emacs/][Ross A. Baker's configuration]]. Many other resources such as stack overflow,
+and other peoples configs were used. Here's some of the more notable ones:
+- [[https://sanemacs.com/][sanemacs]]
+- [https://idiomdrottning.org/bad-emacs-defaults]
+
+** TODO Licensing
+
+* Startup
+
+** Early Init
+
+From preliterate items.
+#+begin_src emacs-lisp :tangle early-init.el
+ ;; All our packages come from Nix
+ (setq package-enable-at-startup nil
+ package-archives nil)
+ (provide 'early-init)
+ ;;; early-init.el ends here
+#+end_src
+
+** Packages
+
+*** Ensuring packages
+
+Most of this config is broken down into [[https://github.com/jwiegley/use-package][~use-package~]] stanzas. All
+dependencies are managed by [[https://nixos.org/][Nix]]. Any package with a true ~:ensure~
+keyword is found by [[https://github.com/nix-community/emacs-overlay#extra-library-functionality][~emacsWithPackagesFromUsePackage~]] to generate
+the set of Emacs packages to install with Nix.
+
+In the brutish non-Nix world, ~:ensure~ triggers Emacs' own package
+manager with willy nilly downloads. To prevent this, we tell
+~use-package~ to assume the package is there and merely look for its
+autoloads.
+
+#+begin_src emacs-lisp
+(defun ross/use-package-ensure-already-installed
+ (name _ensure state &optional _context)
+ "Value for `use-package-ensure-function` that assumes the package
+ is already installed. This is true in our Nix environment."
+ (let ((autoloads-file-name (format "%s-autoloads" name)))
+ (with-demoted-errors "Error loading autoloads: %s"
+ (load autoloads-file-name t t))))
+
+(setq use-package-ensure-function #'ross/use-package-ensure-already-installed)
+#+end_src
+
+*** Hook naming
+
+~use-package~ also by default appends ~"-hook"~ to all its hooks.
+This impairs ripgreppability. Let's be explicit:
+
+#+begin_src emacs-lisp
+(setq use-package-hook-name-suffix nil)
+#+end_src
+
+*** Load it
+
+~use-package~ doesn't use itself. (Well, I think it could, but this
+is the recommended approach...)
+
+#+begin_src emacs-lisp
+(eval-when-compile
+ (require 'use-package))
+#+end_src
+
+** Helpers
+
+*** General
+
+[[https://github.com/noctuid/general.el][General]] is known for keybindings, particularly among [[https://github.com/emacs-evil/evil][the evil]]. A
+lesser known feature is [[https://github.com/noctuid/general.el#settings][~general-setq~]], which understands the ~:set~
+hooks of custom variables. [[https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21695][#21695]] raged on for a half decade without
+a consensus, and I find this solution as tidy as any,
+
+#+begin_src emacs-lisp
+(use-package general :ensure)
+#+end_src
+
+* Personalization
+
+#+begin_src emacs-lisp
+(general-setq user-full-name "Miran Bastaja"
+ user-mail-address "miran.bastaja04@gmail.com")
+#+end_src
+
+* Display
+
+** Scrolling
+
+Emacs' default scrolling behavior feels a bit janky in the 2020s.
+
+- ~scroll-conservatively~ has a magic number of ~100~. Greater than
+ this scrolls just enough to get the point back on screen without
+ recentering.
+
+- ~scroll-margin~ specifies how many lines of context to keep above
+ and below the point.
+
+#+begin_src emacs-lisp
+(use-package emacs
+ :custom
+ (frame-inhibit-implied-resize t)
+ (scroll-conservatively 101)
+ (scroll-margin 2)
+ (scroll-preserve-screen-position t))
+#+end_src
+
+* Customization
+
+** Theme
+
+I use [[https://github.com/doomemacs/themes][Doom emacs' theme pack]] to source my themes.
+
+#+begin_src emacs-lisp
+(use-package doom-themes
+ :ensure t
+ :config
+ ;; Global settings (defaults)
+ (setq doom-themes-enable-bold t ; if nil, bold is universally disabled
+ doom-themes-enable-italic t) ; if nil, italics is universally disabled
+ (load-theme 'doom-one t)
+
+ ;; Enable flashing mode-line on errors
+ (doom-themes-visual-bell-config)
+ ;; Corrects (and improves) org-mode's native fontification.
+ (doom-themes-org-config))
+#+end_src
+
+* Languages
+
+** Emacs Lisp
+
+I use local variables in this config to keep the code from indenting
+two spaces. Without this, we get prompted the first time we read
+this file:
+
+#+begin_src emacs-lisp
+(dolist (pair '((org-src-preserve-indentation . t) (org-src-tab-acts-natively . t)))
+ (add-to-list 'safe-local-variable-values pair))
+#+end_src
+
+** Org
+
+#+begin_src emacs-lisp
+
+#+end_src