aboutsummaryrefslogtreecommitdiff
path: root/common/.config/emacs/init.el.org
diff options
context:
space:
mode:
authorjjanzen <jjanzen@jjanzen.ca>2025-01-05 21:45:28 -0600
committerjjanzen <jjanzen@jjanzen.ca>2025-01-05 21:45:28 -0600
commit166f86419833e7d39242eafe2a87228d0a2cac28 (patch)
tree19423f7fd1d113b03c121272d8402a771ef25d22 /common/.config/emacs/init.el.org
parent0c2b19417aef1735885c380bffa88692ae7c446d (diff)
refactor init.el
Diffstat (limited to 'common/.config/emacs/init.el.org')
-rw-r--r--common/.config/emacs/init.el.org962
1 files changed, 410 insertions, 552 deletions
diff --git a/common/.config/emacs/init.el.org b/common/.config/emacs/init.el.org
index a99d315..f020881 100644
--- a/common/.config/emacs/init.el.org
+++ b/common/.config/emacs/init.el.org
@@ -1,26 +1,14 @@
#+title: Emacs Configuration
-* Variables
-
-Font definitions.
-#+begin_src emacs-lisp
- (defvar jj/mono-font)
- (defvar jj/var-font)
-#+end_src
-
-* Functions
-
-** Early Setup
-=jj/force-custom-file= forces the use of a =custom.el= file instead of appending to =init.el=.
+* Early Setup
+Force the use of a =custom.el= file instead of appending to =init.el=.
#+begin_src emacs-lisp
- (defun jj/force-custom-file ()
- "Use a custom file: custom.el. Load that file if it exists."
- (setq custom-file (concat user-emacs-directory "custom.el"))
- (when (file-exists-p custom-file)
- (load custom-file)))
+ (setq custom-file (concat user-emacs-directory "custom.el"))
+ (when (file-exists-p custom-file)
+ (load custom-file))
#+end_src
-=jj/set-exec-path-from-shell-PATH= make Emacs use the correct =PATH= variable as macOS fails to load the =PATH= variable from my login shell.
+Make Emacs use the correct =PATH= variable as macOS fails to load the =PATH= variable from my login shell.
#+begin_src emacs-lisp
(defun jj/set-exec-path-from-shell-PATH ()
"Load the login shell's PATH variable manually because macOS doesn't behave well."
@@ -30,583 +18,453 @@ Font definitions.
"$SHELL --login -c 'echo $PATH'"))))
(setenv "PATH" path-from-shell)
(setq exec-path (split-string path-from-shell path-separator))))
+ (jj/set-exec-path-from-shell-PATH)
#+end_src
-=jj/suppress-nativecomp-errors= suppresses native compilation warnings and errors. Native compilation seems to be a little broken on macOS and the warnings are just annoying.
+Suppress native compilation warnings and errors. Native compilation seems to be a little broken on macOS and the warnings are just annoying.
#+begin_src emacs-lisp :tangle yes
- (defun jj/suppress-nativecomp-errors ()
- "Log errors and warnings, but don't show them on screen."
- (setq native-comp-async-report-warnings-errors 'silent))
-#+end_src
-
-=jj/setup-package-management= bootstraps package management. I use =straight= with =use-package= to allow declarative package management and include =git= repositories in addition to =elpa= / =melpa=.
-#+begin_src emacs-lisp
- (defun jj/setup-package-management ()
- "Use straight with use-package for package management"
- (defvar bootstrap-version)
- (let ((bootstrap-file
- (expand-file-name
- "straight/repos/straight.el/bootstrap.el"
- (or (bound-and-true-p straight-base-dir)
- user-emacs-directory)))
- (bootstrap-version 7))
- (unless (file-exists-p bootstrap-file)
- (with-current-buffer
- (url-retrieve-synchronously
- "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
- 'silent 'inhibit-cookies)
- (goto-char (point-max))
- (eval-print-last-sexp)))
- (load bootstrap-file nil ':nomessage))
- (straight-use-package 'use-package)
- (setq straight-use-package-by-default t))
-#+end_src
-
-Run the early setup right away.
-#+begin_src emacs-lisp
- (jj/force-custom-file)
- (jj/set-exec-path-from-shell-PATH)
- (jj/suppress-nativecomp-errors)
- (jj/setup-package-management)
-#+end_src
-
-** Appearance
-
-=jj/setup-fonts= sets up fonts. I use Source Code Pro (Nerd Font) for monospace and Computer Modern for variable width.
-#+begin_src emacs-lisp
- (defun jj/setup-fonts ()
- "Set font sizes based on the operating system. macOS expects bigger fonts than Linux"
- (pcase system-type
- (`gnu/linux
- (setq jj/mono-font "SauceCodePro Nerd Font-11"
- jj/var-font "CMU Serif-14"))
- (`darwin
- (setq jj/mono-font "SauceCodePro Nerd Font-14:weight=thin"
- jj/var-font "CMU Serif-18")))
- (add-to-list 'default-frame-alist
- `(font . ,jj/mono-font))
- (custom-set-faces
- `(variable-pitch ((t :font ,jj/var-font)))
- `(fixed-pitch ((t :font ,jj/mono-font)))))
+ (setq native-comp-async-report-warnings-errors 'silent)
+#+end_src
+
+Bootstrap package management. I use =straight= with =use-package= to allow declarative package management and include =git= repositories in addition to =elpa= / =melpa=.
+#+begin_src emacs-lisp
+ (defvar bootstrap-version)
+ (let ((bootstrap-file
+ (expand-file-name
+ "straight/repos/straight.el/bootstrap.el"
+ (or (bound-and-true-p straight-base-dir)
+ user-emacs-directory)))
+ (bootstrap-version 7))
+ (unless (file-exists-p bootstrap-file)
+ (with-current-buffer
+ (url-retrieve-synchronously
+ "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
+ 'silent 'inhibit-cookies)
+ (goto-char (point-max))
+ (eval-print-last-sexp)))
+ (load bootstrap-file nil ':nomessage))
+ (straight-use-package 'use-package)
+ (setq straight-use-package-by-default t)
+#+end_src
+
+* Appearance
+
+Set up fonts. I use Source Code Pro (Nerd Font) for monospace and Computer Modern for variable width.
+#+begin_src emacs-lisp
+ (defvar jj/mono-font)
+ (defvar jj/var-font)
+ (pcase system-type
+ (`gnu/linux
+ (setq jj/mono-font "SauceCodePro Nerd Font-11"
+ jj/var-font "CMU Serif-14"))
+ (`darwin
+ (setq jj/mono-font "SauceCodePro Nerd Font-14:weight=thin"
+ jj/var-font "CMU Serif-18")))
+ (add-to-list 'default-frame-alist
+ `(font . ,jj/mono-font))
+ (custom-set-faces
+ `(variable-pitch ((t :font ,jj/var-font)))
+ `(fixed-pitch ((t :font ,jj/mono-font))))
#+end_src
-=jj/setup-theme= is the reason I use =straight= rather than just =use-package=. I have a custom Emacs theme that comes from my own fork of =doom-themes=. I also use =doom-modeline= and =nerd-icons= for a nicer-looking user interface and remove the title bar from the window along with any other unnecessary elements from the screen. =dired= is modified to use =nerd-icons= and colours.
-#+begin_src emacs-lisp
- (defun jj/setup-theme ()
- "Install theming for Emacs from my fork of the doom-themes repo"
- (use-package doom-themes
- :straight
- (doom-themes :type git
- :host github
- :repo "doomemacs/themes"
- :fork
- (:host github
- :repo "JacobJanzen/emacs-doom-themes"))
- :config
- (setq doom-themes-enable-bold t
- doom-themes-enable-italic t)
- (load-theme 'doom-pink t)
- (doom-themes-org-config))
- (use-package doom-modeline
- :init
- (doom-modeline-mode 1))
- (use-package nerd-icons)
- (use-package nerd-icons-dired
- :after
- (nerd-icons)
- :hook
- (dired-mode . nerd-icons-dired-mode))
- (use-package nerd-icons-completion
- :config
- (nerd-icons-completion-mode))
- (use-package diredfl
- :init
- (diredfl-global-mode 1))
- (add-to-list 'default-frame-alist '(undecorated . t))
- (scroll-bar-mode -1)
- (tool-bar-mode -1)
- (menu-bar-mode -1))
+This block is the reason I use =straight= rather than just =use-package=. I have a custom Emacs theme that comes from my own fork of =doom-themes=. I also use =doom-modeline= and =nerd-icons= for a nicer-looking user interface and remove the title bar from the window along with any other unnecessary elements from the screen. =dired= is modified to use =nerd-icons= and colours.
+#+begin_src emacs-lisp
+ (use-package doom-themes
+ :straight
+ (doom-themes :type git
+ :host github
+ :repo "doomemacs/themes"
+ :fork
+ (:host github
+ :repo "JacobJanzen/emacs-doom-themes"))
+ :config
+ (setq doom-themes-enable-bold t
+ doom-themes-enable-italic t)
+ (load-theme 'doom-pink t)
+ (doom-themes-org-config))
+ (use-package doom-modeline
+ :init
+ (doom-modeline-mode 1))
+ (use-package nerd-icons)
+ (use-package nerd-icons-dired
+ :after
+ (nerd-icons)
+ :hook
+ (dired-mode . nerd-icons-dired-mode))
+ (use-package nerd-icons-completion
+ :config
+ (nerd-icons-completion-mode))
+ (use-package diredfl
+ :init
+ (diredfl-global-mode 1))
+ (add-to-list 'default-frame-alist '(undecorated . t))
+ (scroll-bar-mode -1)
+ (tool-bar-mode -1)
+ (menu-bar-mode -1)
+#+end_src
+
+Disable the default startup screen so Emacs starts in the =scratch= buffer and also defaults to an empty =scratch= buffer.
+#+begin_src emacs-lisp
+ (setq inhibit-startup-screen t
+ initial-scratch-message nil)
+#+end_src
+
+Tell Emacs to use line numbers by default.
+#+begin_src emacs-lisp
+ (global-display-line-numbers-mode 1)
+#+end_src
+
+Configure Emacs to default to spaces over tabs and use a width of 4 by default.
+#+begin_src emacs-lisp
+ (setq-default indent-tabs-mode nil)
+ (setq tab-width 4
+ c-basic-offset tab-width)
#+end_src
-=jj/clean-startup-screen= disables the default startup screen so Emacs starts in the =scratch= buffer and also defaults to an empty =scratch= buffer.
+Install and configure =visual-fill-column= to make some file types display with a narrow window centred in the frame.
#+begin_src emacs-lisp
- (defun jj/clean-startup-screen ()
- "Remove default startup screen; clean scratch buffer"
- (setq inhibit-startup-screen t
- initial-scratch-message nil))
+ (defun jj/run-visual-line-mode ()
+ "run visual-line-mode"
+ (visual-line-mode)
+ (visual-fill-column-mode)
+ (setq visual-fill-column-width 100
+ visual-fill-column-center-text t))
+ (use-package visual-fill-column
+ :hook
+ (org-mode . jj/run-visual-line-mode)
+ (markdown-mode . jj/run-visual-line-mode)
+ :config
+ (setq visual-fill-column-width 100
+ visual-fill-column-center-text t))
#+end_src
-=jj/enable-line-numbers= tells Emacs to use line numbers by default.
+* Behaviour
+
+Make Emacs scroll one line at a time instead of big jumps.
#+begin_src emacs-lisp
- (defun jj/enable-line-numbers ()
- "Enable line numbers by default"
- (global-display-line-numbers-mode 1))
+ (setq scroll-conservatively most-positive-fixnum)
#+end_src
-=jj/setup-whitespace= configures Emacs to default to spaces over tabs and use a width of 4 by default.
+Make Emacs delete trailing whitspace on save. This does not happen in =markdown-mode= which sometimes needs trailing whitespace.
#+begin_src emacs-lisp
- (defun jj/setup-whitespace ()
- (setq-default indent-tabs-mode nil)
- (setq tab-width 4
- c-basic-offset tab-width))
+ (add-hook 'before-save-hook
+ (lambda ()
+ (unless (eql (with-current-buffer (current-buffer) major-mode)
+ 'markdown-mode)
+ (delete-trailing-whitespace))))
#+end_src
-=jj/setup-visual-fill-column= installs and configures =visual-fill-column= to make some file types display with a narrow window centred in the frame.
+Make Emacs create directories if they don't exist if the user selects that answer.
#+begin_src emacs-lisp
- (defun jj/setup-visual-fill-column ()
- "configure and install visual-fill-column"
- (defun jj/run-visual-line-mode ()
- "run visual-line-mode"
- (visual-line-mode)
- (visual-fill-column-mode)
- (setq visual-fill-column-width 100
- visual-fill-column-center-text t))
- (use-package visual-fill-column
- :hook
- (org-mode . jj/run-visual-line-mode)
- (markdown-mode . jj/run-visual-line-mode)
- :config
- (setq visual-fill-column-width 100
- visual-fill-column-center-text t)))
+ (add-to-list 'find-file-not-found-functions
+ (lambda ()
+ (let ((parent-directory (file-name-directory buffer-file-name)))
+ (when (and (not (file-exists-p parent-directory))
+ (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory)))
+ (make-directory parent-directory t)))))
#+end_src
-=jj/appearance= runs all appearance functions.
+Disable the creation of backup files which pollute the file system.
#+begin_src emacs-lisp
- (defun jj/appearance ()
- "Run appearance functions"
- (jj/setup-fonts)
- (jj/setup-theme)
- (jj/clean-startup-screen)
- (jj/enable-line-numbers)
- (jj/setup-whitespace)
- (jj/setup-visual-fill-column))
+ (setq make-backup-files nil)
+#+end_src
+Make PDFs save where in the document it was last.
+#+begin_src emacs-lisp
+ (use-package saveplace-pdf-view
+ :config
+ (save-place-mode 1))
#+end_src
-** Behaviour
+* Tools
-=jj/nicer-scroll= makes Emacs scroll one line at a time instead of big jumps.
+Configure =dumb-jump= for better lookup.
#+begin_src emacs-lisp
- (defun jj/nicer-scroll ()
- "Scroll one line at a time"
- (setq scroll-conservatively most-positive-fixnum))
+ (use-package dumb-jump
+ :init
+ (add-hook 'xref-backend-functions #'dumb-jump-xref-activate))
#+end_src
-=jj/setup-delete-trailing-whitespace= make Emacs delete trailing whitspace on save. This does not happen in =markdown-mode= which sometimes needs trailing whitespace.
+Configure and install =magit= as a =git= front end.
#+begin_src emacs-lisp
- (defun jj/setup-delete-trailing-whitespace ()
- "Delete trailing whitespace on save"
- (add-hook 'before-save-hook
- (lambda ()
- (unless (eql (with-current-buffer (current-buffer) major-mode)
- 'markdown-mode)
- (delete-trailing-whitespace)))))
+ (use-package magit)
#+end_src
-=jj/setup-auto-make-directory= makes Emacs create directories if they don't exist if the user selects that answer.
+Install a better PDF viewer than =DocView=.
#+begin_src emacs-lisp
- (defun jj/setup-auto-make-directory ()
- (add-to-list 'find-file-not-found-functions
- (lambda ()
- (let ((parent-directory (file-name-directory buffer-file-name)))
- (when (and (not (file-exists-p parent-directory))
- (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory)))
- (make-directory parent-directory t))))))
+ (use-package pdf-tools
+ :config
+ (pdf-tools-install)
+ :hook
+ (pdf-view-mode . (lambda () (display-line-numbers-mode -1)))
+ :init
+ (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
+ :config
+ (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
+ TeX-view-program-list '(("PDF Tools" TeX-pdf-tools-sync-view))
+ TeX-source-correlate-start-server t))
#+end_src
-=jj/setup-disable-backup-files= disables the creation of backup files which pollute the file system.
+Install and configure =fzf= to be used as a fuzzy finder.
#+begin_src emacs-lisp
- (defun jj/setup-disable-backup-files ()
- "disable creation of backup files"
- (setq make-backup-files nil))
+ (use-package fzf
+ :bind
+ ("C-c C-f" . fzf)
+ :config
+ (setq fzf/args "-x --color 16 --print-query --margin=1,0 --no-hscroll"
+ fzf/executable "fzf"
+ fzf/git-grep-args "-i --line-number %s"
+ fzf/grep-command "grep -nrH"
+ fzf/position-bottom nil
+ fzf/window-height 15))
#+end_src
-=jj/save-place-in-pdf= makes PDFs save where in the document it was last.
+Install and configure =vterm= as a terminal emulator in Emacs.
#+begin_src emacs-lisp
- (defun jj/save-place-in-pdf ()
- "keep position in PDF files"
- (use-package saveplace-pdf-view
- :config
- (save-place-mode 1)))
+ (use-package vterm
+ :bind
+ ("C-c v" . vterm))
#+end_src
-=jj/behaviour= runs all behaviour setup functions.
-#+begin_src emacs-lisp :tangle yes
- (defun jj/behaviour ()
- "Setup behaviour for Emacs"
- (jj/nicer-scroll)
- (jj/setup-delete-trailing-whitespace)
- (jj/setup-auto-make-directory)
- (jj/setup-disable-backup-files)
- (jj/save-place-in-pdf))
-#+end_src
-
-** Tools
-
-=jj/setup-dumb-jump= configures =dumb-jump= for better lookup.
-#+begin_src emacs-lisp
- (defun jj/setup-dumb-jump ()
- "install and configure dumb-jump"
- (use-package dumb-jump
- :init (add-hook 'xref-backend-functions #'dumb-jump-xref-activate)))
-#+end_src
-
-=jj/setup-magit= configures and installs =magit= as a =git= front end.
-#+begin_src emacs-lisp
- (defun jj/setup-magit ()
- "install magit"
- (use-package magit))
-#+end_src
-
-=jj/setup-pdf-tools= installs a better PDF viewer than =DocView=.
-#+begin_src emacs-lisp
- (defun jj/setup-pdf-tools ()
- "install pdf-tools"
- (use-package pdf-tools
- :config
- (pdf-tools-install)
- :hook
- (pdf-view-mode . (lambda () (display-line-numbers-mode -1)))
- :init
- (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
- :config
- (setq TeX-view-program-selection '((output-pdf "PDF Tools"))
- TeX-view-program-list '(("PDF Tools" TeX-pdf-tools-sync-view))
- TeX-source-correlate-start-server t)))
-#+end_src
-
-=jj/setup-fzf= installs and configures =fzf= to be used as a fuzzy finder.
-#+begin_src emacs-lisp
- (defun jj/setup-fzf ()
- "install and configure fzf"
- (use-package fzf
- :bind
- ("C-c C-f" . fzf)
- :config
- (setq fzf/args "-x --color 16 --print-query --margin=1,0 --no-hscroll"
- fzf/executable "fzf"
- fzf/git-grep-args "-i --line-number %s"
- fzf/grep-command "grep -nrH"
- fzf/position-bottom nil
- fzf/window-height 15)))
-#+end_src
-
-=jj/setup-vterm= configures and installs =vterm= as a terminal emulator in Emacs.
-#+begin_src emacs-lisp
- (defun jj/setup-vterm ()
- "install and configure vterm"
- (use-package vterm
- :bind
- ("C-c v" . vterm)))
-#+end_src
-
-=jj/setup-completions= installs =company= for completions. It is configured to start with no delay immediately after the first key press. =vertico= is used as a front end for completions. =orderless= is used to allow searching in any portion of a string and =marginalia= gives descriptions of items in the list.
-#+begin_src emacs-lisp
- (defun jj/setup-completions ()
- "configure and install company"
- (use-package company
- :config
- (add-hook 'after-init-hook 'global-company-mode)
- (setq company-idle-delay 0
- company-minimum-prefix-length 1
- company-selection-wrap-around t))
- (use-package vertico
- :custom
- (vertico-cycle t)
- :init
- (vertico-mode 1))
- (use-package orderless
- :custom
- (completion-styles '(orderless basic))
- (completion-category-overrides '((file (styles basic partial-completion)))))
- (use-package marginalia
- :bind
- (:map minibuffer-local-map
- ("M-A" . marginalia-cycle))
- :init
- (marginalia-mode 1)))
-#+end_src
-
-=jj/setup-checkers= sets up =flycheck= and =flyspell= for syntax and spell checking respectively.
-#+begin_src emacs-lisp
- (defun jj/setup-checkers ()
- "Configure and install flycheck and flyspell"
- (use-package flycheck
- :config
- (add-hook 'after-init-hook #'global-flycheck-mode))
- (use-package flyspell
- :hook
- (text-mode . flyspell-mode))
- (use-package flyspell-correct
- :after flyspell
- :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper))))
-#+end_src
-
-=jj/setup-snippets= installs =yasnippet= for managing snippets and =yasnippet-snippets= for a collection of useful snippets.
-#+begin_src emacs-lisp
- (defun jj/setup-snippets ()
- "install snippets"
- (use-package yasnippet
- :init
- (yas-global-mode 1)
- :bind
- ("C-c s" . yas-insert-snippet))
- (use-package yasnippet-snippets))
-#+end_src
-
-=jj/setup-formatting= installs =apheleia= and =clang-format= to automatically format code on save.
-#+begin_src emacs-lisp
- (defun jj/setup-formatting ()
- "setup auto-formatters"
+Install =company= for completions. It is configured to start with no delay immediately after the first key press. =vertico= is used as a front end for completions. =orderless= is used to allow searching in any portion of a string and =marginalia= gives descriptions of items in the list.
+#+begin_src emacs-lisp
+ (use-package company
+ :config
+ (add-hook 'after-init-hook 'global-company-mode)
+ (setq company-idle-delay 0
+ company-minimum-prefix-length 1
+ company-selection-wrap-around t))
+ (use-package vertico
+ :custom
+ (vertico-cycle t)
+ :init
+ (vertico-mode 1))
+ (use-package orderless
+ :custom
+ (completion-styles '(orderless basic))
+ (completion-category-overrides '((file (styles basic partial-completion)))))
+ (use-package marginalia
+ :bind
+ (:map minibuffer-local-map
+ ("M-A" . marginalia-cycle))
+ :init
+ (marginalia-mode 1))
+#+end_src
+
+Set up =flycheck= and =flyspell= for syntax and spell checking respectively.
+#+begin_src emacs-lisp
+ (use-package flycheck
+ :config
+ (add-hook 'after-init-hook #'global-flycheck-mode))
+ (use-package flyspell
+ :hook
+ (text-mode . flyspell-mode))
+ (use-package flyspell-correct
+ :after flyspell
+ :bind (:map flyspell-mode-map ("C-;" . flyspell-correct-wrapper)))
+#+end_src
+
+Install =yasnippet= for managing snippets and =yasnippet-snippets= for a collection of useful snippets.
+#+begin_src emacs-lisp
+ (use-package yasnippet
+ :init
+ (yas-global-mode 1)
+ :bind
+ ("C-c s" . yas-insert-snippet))
+ (use-package yasnippet-snippets)
+#+end_src
+
+Install =apheleia= and =clang-format= to automatically format code on save.
+#+begin_src emacs-lisp
(use-package apheleia
:init (apheleia-global-mode 1))
- (use-package clang-format))
-#+end_src
-
-=jj/setup-rss= configures and installs =elfeed= to serve as an =rss= feed reader. It stores the feed [[./feed.org.org][here]].
-#+begin_src emacs-lisp
- (defun jj/setup-rss ()
- "configure elfeed for rss"
- (use-package elfeed
- :bind
- ("C-c e f" . elfeed)
- ("C-c e u" . elfeed-update))
- (use-package elfeed-goodies
- :after
- elfeed
- :config
- (elfeed-goodies/setup))
- (use-package elfeed-org
- :config
- (elfeed-org)
- (setq rmh-elfeed-org-files (list "~/.config/emacs/feed.org"))))
-#+end_src
-
-=jj/setup-note-management= sets up =deft= for quick notes.
-#+begin_src emacs-lisp
- (defun jj/setup-note-management ()
- "configure and install deft"
- (use-package deft
- :bind
- ("C-c d" . deft)
- :config
- (setq deft-directory "~/notes/"
- deft-default-extension "org")))
-#+end_src
-
-=jj/tools= installs and configures all tools specified above.
-#+begin_src emacs-lisp
- (defun jj/tools ()
- "configure and install tools"
- (jj/setup-dumb-jump)
- (jj/setup-magit)
- (jj/setup-fzf)
- (jj/setup-pdf-tools)
- (jj/setup-vterm)
- (jj/setup-completions)
- (jj/setup-checkers)
- (jj/setup-snippets)
- (jj/setup-formatting)
- (jj/setup-rss)
- (jj/setup-note-management))
-#+end_src
-
-** Languages
-
-=jj/setup-org-mode= configures =org-mode=. I use =~/org= as my =org= directory and hide emphasis markers because it's much easier to read that way. I enable =org-crypt= to allow reading and writing encrypted =org= files. I also replace bullets in bulleted lists with nicer looking icons. I configure faces to default to variable-width font, but switching to monospace where it is necessary. Finally, I use =visual-fill-column= to make =org= files display with a relatively narrow window centred in the frame.
-#+begin_src emacs-lisp
- (defun jj/setup-org-mode ()
- "setup org-mode"
- (use-package org
- :hook
- (org-mode . (lambda ()
- (variable-pitch-mode)
- (display-line-numbers-mode -1)))
- :config
- (org-crypt-use-before-save-magic)
- (setq org-directory "~/org"
- org-hide-emphasis-markers t
- org-format-latex-options (plist-put org-format-latex-options :scale 2.0)
- org-return-follows-link t
- org-tags-exclude-from-inheritance '("crypt")
- org-crypt-key nil
- auto-save-default nil)
- (font-lock-add-keywords 'org-mode
- '(("^ *\\([-]\\) "
- (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
- :custom-face
- (org-block ((t :font ,jj/mono-font)))
- (org-code ((t :font ,jj/mono-font (:inherit (shadow)))))
- (org-document-info-keyword ((t :font ,jj/mono-font (:inherit (shadow)))))
- (org-meta-line ((t :font ,jj/mono-font (:inherit (font-lock-comment-face)))))
- (org-verbatim ((t :font ,jj/mono-font (:inherit (shadow)))))
- (org-table ((t :font ,jj/mono-font (:inherit (shadow)))))
- (org-document-title ((t (:inherit title :height 2.0 :underline nil))))
- (org-level-1 ((t (:inherit outline-1 :weight bold :height 1.75))))
- (org-level-2 ((t (:inherit outline-2 :weight bold :height 1.5))))
- (org-level-3 ((t (:inherit outline-3 :weight bold :height 1.25))))
- (org-level-4 ((t (:inherit outline-4 :weight bold :height 1.1))))
- (org-level-5 ((t (:inherit outline-5 :height 1.1))))
- (org-level-6 ((t (:inherit outline-6))))))
-#+end_src
-
-=jj/setup-cmake= installs =cmake-mode=.
-#+begin_src emacs-lisp
- (defun jj/setup-cmake ()
- "install cmake-mode"
- (use-package cmake-mode))
-#+end_src
-
-=jj/setup-go= installs =go-mode= and tools for =go= source code. Namely, =go-eldoc= gets documentation for =go= variables, functions, and arguments, =go-gen-tests= automatically generates tests for =go= code, and =go-guru= helps with refactoring =go= code.
-#+begin_src emacs-lisp
- (defun jj/setup-go ()
- "install go-mode and tools for go"
- (use-package go-mode)
- (use-package go-eldoc
- :hook
- (go-mode . go-eldoc-setup))
- (use-package go-gen-test)
- (use-package go-guru
- :hook
- (go-mode . go-guru-hl-identifier-mode)))
-#+end_src
-
-=jj/setup-lua= installs =lua-mode=.
-#+begin_src emacs-lisp
- (defun jj/setup-lua ()
- "install lua-mode"
- (use-package lua-mode))
-#+end_src
-
-=jj/setup-lisp= installs tools for Emacs Lisp. Namely =parinfer-rust-mode= which handles parentheses nicely in Emacs Lisp.
+ (use-package clang-format)
+#+end_src
+
+Configure and install =elfeed= to serve as an =rss= feed reader. It stores the feed [[./feed.org.org][here]].
+#+begin_src emacs-lisp
+ (use-package elfeed
+ :bind
+ ("C-c e f" . elfeed)
+ ("C-c e u" . elfeed-update))
+ (use-package elfeed-goodies
+ :after
+ elfeed
+ :config
+ (elfeed-goodies/setup))
+ (use-package elfeed-org
+ :config
+ (elfeed-org)
+ (setq rmh-elfeed-org-files (list "~/.config/emacs/feed.org")))
+#+end_src
+
+Set up =deft= for quick notes.
+#+begin_src emacs-lisp
+ (use-package deft
+ :bind
+ ("C-c d" . deft)
+ :config
+ (setq deft-directory "~/notes/"
+ deft-default-extension "org"))
+#+end_src
+
+* Languages
+
+Configure =org-mode=. I use =~/org= as my =org= directory and hide emphasis markers because it's much easier to read that way. I enable =org-crypt= to allow reading and writing encrypted =org= files. I also replace bullets in bulleted lists with nicer looking icons. I configure faces to default to variable-width font, but switching to monospace where it is necessary. Finally, I use =visual-fill-column= to make =org= files display with a relatively narrow window centred in the frame.
+#+begin_src emacs-lisp
+ (use-package org
+ :hook
+ (org-mode . (lambda ()
+ (variable-pitch-mode)
+ (display-line-numbers-mode -1)))
+ :config
+ (org-crypt-use-before-save-magic)
+ (setq org-directory "~/org"
+ org-hide-emphasis-markers t
+ org-format-latex-options (plist-put org-format-latex-options :scale 2.0)
+ org-return-follows-link t
+ org-tags-exclude-from-inheritance '("crypt")
+ org-crypt-key nil
+ auto-save-default nil)
+ (font-lock-add-keywords 'org-mode
+ '(("^ *\\([-]\\) "
+ (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
+ :custom-face
+ (org-block ((t :font ,jj/mono-font)))
+ (org-code ((t :font ,jj/mono-font (:inherit (shadow)))))
+ (org-document-info-keyword ((t :font ,jj/mono-font (:inherit (shadow)))))
+ (org-meta-line ((t :font ,jj/mono-font (:inherit (font-lock-comment-face)))))
+ (org-verbatim ((t :font ,jj/mono-font (:inherit (shadow)))))
+ (org-table ((t :font ,jj/mono-font (:inherit (shadow)))))
+ (org-document-title ((t (:inherit title :height 2.0 :underline nil))))
+ (org-level-1 ((t (:inherit outline-1 :weight bold :height 1.75))))
+ (org-level-2 ((t (:inherit outline-2 :weight bold :height 1.5))))
+ (org-level-3 ((t (:inherit outline-3 :weight bold :height 1.25))))
+ (org-level-4 ((t (:inherit outline-4 :weight bold :height 1.1))))
+ (org-level-5 ((t (:inherit outline-5 :height 1.1))))
+ (org-level-6 ((t (:inherit outline-6)))))
+#+end_src
+
+Install =cmake-mode=.
+#+begin_src emacs-lisp
+ (use-package cmake-mode)
+#+end_src
+
+Install =go-mode= and tools for =go= source code. Namely, =go-eldoc= gets documentation for =go= variables, functions, and arguments, =go-gen-tests= automatically generates tests for =go= code, and =go-guru= helps with refactoring =go= code.
+#+begin_src emacs-lisp
+ (use-package go-mode)
+ (use-package go-eldoc
+ :hook
+ (go-mode . go-eldoc-setup))
+ (use-package go-gen-test)
+ (use-package go-guru
+ :hook
+ (go-mode . go-guru-hl-identifier-mode))
+#+end_src
+
+Install tools for LaTeX. Namely, =auctex= for better integration with Emacs and =cdlatex= for environment and macro insertion.
+#+begin_src emacs-lisp
+ (use-package auctex
+ :hook
+ (LaTeX-mode . (lambda () (put 'LaTeX-mode 'eglot-language-id "latex"))))
+ (use-package cdlatex
+ :hook
+ (LaTeX-mode . turn-on-cdlatex))
+#+end_src
+
+Install tools for Emacs Lisp. Namely =parinfer-rust-mode= which handles parentheses nicely in Emacs Lisp.
#+begin_src emacs-lisp :tangle yes
- (defun jj/setup-lisp ()
- "install tools for lisp"
- (use-package parinfer-rust-mode
- :hook
- (emacs-lisp-mode . parinfer-rust-mode)
- :init
- (setq parinfer-rust-auto-download t)))
-#+end_src
-
-=jj/setup-markdown= configures how Markdown is displayed (default to variable-width font and use monospace where necessary) and installs =markdown-mode=.
-#+begin_src emacs-lisp
- (defun jj/setup-markdown ()
- "configure and install markdown-mode"
- (use-package markdown-mode
- :hook
- (markdown-mode . (lambda ()
- (variable-pitch-mode)
- (display-line-numbers-mode -1)))
- :config
- (setq markdown-hide-markup t)
- :custom-face
- (markdown-header-face ((t :font ,jj/var-font :weight bold)))
- (markdown-header-face-1 ((t (:inherit markdown-header-face :height 2.0))))
- (markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.75))))
- (markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5))))
- (markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.25))))
- (markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.1))))
- (markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.1))))
- (markdown-blockquote-face ((t :font ,jj/var-font)))
- (markdown-code-face ((t :font ,jj/mono-font)))
- (markdown-html-attr-name-face ((t :font ,jj/mono-font)))
- (markdown-html-attr-value-face ((t :font ,jj/mono-font)))
- (markdown-html-entity-face ((t :font ,jj/mono-font)))
- (markdown-html-tag-delimiter-face ((t :font ,jj/mono-font)))
- (markdown-html-tag-name-face ((t :font ,jj/mono-font)))
- (markdown-html-comment-face ((t :font ,jj/mono-font)))
- (markdown-header-delimiter-face ((t :font ,jj/mono-font)))
- (markdown-hr-face ((t :font ,jj/mono-font)))
- (markdown-inline-code-face ((t :font ,jj/mono-font)))
- (markdown-language-info-face ((t :font ,jj/mono-font)))
- (markdown-language-keyword-face ((t :font ,jj/mono-font)))
- (markdown-link-face ((t :font ,jj/mono-font)))
- (markdown-markup-face ((t :font ,jj/mono-font)))
- (markdown-math-face ((t :font ,jj/mono-font)))
- (markdown-metadata-key-face ((t :font ,jj/mono-font)))
- (markdown-metadata-value-face ((t :font ,jj/mono-font)))
- (markdown-missing-link-face ((t :font ,jj/mono-font)))
- (markdown-plain-url-face ((t :font ,jj/mono-font)))
- (markdown-reference-face ((t :font ,jj/mono-font)))
- (markdown-table-face ((t :font ,jj/mono-font)))
- (markdown-url-face ((t :font ,jj/mono-font)))))
-#+end_src
-
-=jj/setup-latex= installs tools for LaTeX. Namely, =auctex= for better integration with Emacs and =cdlatex= for environment and macro insertion.
-#+begin_src emacs-lisp
- (defun jj/setup-latex ()
- "install tools for LaTeX"
- (use-package auctex
- :hook
- (LaTeX-mode . (lambda () (put 'LaTeX-mode 'eglot-language-id "latex"))))
- (use-package cdlatex
- :hook
- (LaTeX-mode . turn-on-cdlatex)))
-#+end_src
-
-=jj/setup-yaml= installs =yaml-mode=.
-#+begin_src emacs-lisp :tangle yes
- (defun jj/setup-yaml ()
- "install yaml-mode"
- (use-package yaml-mode))
-#+end_src
-
-=jj/setup-nix= installs =nix-mode=.
+ (use-package parinfer-rust-mode
+ :hook
+ (emacs-lisp-mode . parinfer-rust-mode)
+ :init
+ (setq parinfer-rust-auto-download t))
+#+end_src
+
+Install =lua-mode=.
+#+begin_src emacs-lisp
+ (use-package lua-mode)
+#+end_src
+
+Configure how Markdown is displayed (default to variable-width font and use monospace where necessary) and installs =markdown-mode=.
+#+begin_src emacs-lisp
+ (use-package markdown-mode
+ :hook
+ (markdown-mode . (lambda ()
+ (variable-pitch-mode)
+ (display-line-numbers-mode -1)))
+ :config
+ (setq markdown-hide-markup t)
+ :custom-face
+ (markdown-header-face ((t :font ,jj/var-font :weight bold)))
+ (markdown-header-face-1 ((t (:inherit markdown-header-face :height 2.0))))
+ (markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.75))))
+ (markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5))))
+ (markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.25))))
+ (markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.1))))
+ (markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.1))))
+ (markdown-blockquote-face ((t :font ,jj/var-font)))
+ (markdown-code-face ((t :font ,jj/mono-font)))
+ (markdown-html-attr-name-face ((t :font ,jj/mono-font)))
+ (markdown-html-attr-value-face ((t :font ,jj/mono-font)))
+ (markdown-html-entity-face ((t :font ,jj/mono-font)))
+ (markdown-html-tag-delimiter-face ((t :font ,jj/mono-font)))
+ (markdown-html-tag-name-face ((t :font ,jj/mono-font)))
+ (markdown-html-comment-face ((t :font ,jj/mono-font)))
+ (markdown-header-delimiter-face ((t :font ,jj/mono-font)))
+ (markdown-hr-face ((t :font ,jj/mono-font)))
+ (markdown-inline-code-face ((t :font ,jj/mono-font)))
+ (markdown-language-info-face ((t :font ,jj/mono-font)))
+ (markdown-language-keyword-face ((t :font ,jj/mono-font)))
+ (markdown-link-face ((t :font ,jj/mono-font)))
+ (markdown-markup-face ((t :font ,jj/mono-font)))
+ (markdown-math-face ((t :font ,jj/mono-font)))
+ (markdown-metadata-key-face ((t :font ,jj/mono-font)))
+ (markdown-metadata-value-face ((t :font ,jj/mono-font)))
+ (markdown-missing-link-face ((t :font ,jj/mono-font)))
+ (markdown-plain-url-face ((t :font ,jj/mono-font)))
+ (markdown-reference-face ((t :font ,jj/mono-font)))
+ (markdown-table-face ((t :font ,jj/mono-font)))
+ (markdown-url-face ((t :font ,jj/mono-font))))
+#+end_src
+
+Install =nix-mode=.
#+begin_src emacs-lisp
- (defun jj/setup-nix ()
- "install nix-mode"
(use-package nix-mode
:mode
- "\\.nix\\'"))
-#+end_src
-
-=jj/languages= installs language modes and tools in addition to setting up =eglot= to run on those languages.
-#+begin_src emacs-lisp
- (defun jj/languages ()
- "install language tools and configure eglot"
- (jj/setup-org-mode)
- (jj/setup-cmake)
- (jj/setup-go)
- (jj/setup-lua)
- (jj/setup-lisp)
- (jj/setup-markdown)
- (jj/setup-latex)
- (jj/setup-yaml)
- (jj/setup-nix)
-
- (global-set-key (kbd "C-c r") 'eglot-rename)
- (global-set-key (kbd "C-c a") 'eglot-code-actions)
- (use-package tree-sitter)
- (use-package tree-sitter-langs)
- (dolist (lang-hook '(sh-mode-hook
- c-mode-hook
- c++-mode-hook
- cc-mode-hook
- cmake-mode-hook
- html-mode-hook
- css-mode-hook
- js-json-mode-hook
- js-mode-hook
- python-mode-hook
- go-mode-hook
- lua-mode-hook
- markdown-mode-hook
- tex-mode-hook
- LaTeX-mode-hook
- yaml-mode-hook
- nix-mode-hook))
- (add-hook lang-hook (lambda ()
- (eglot-ensure)
- (tree-sitter-mode 1)
- (tree-sitter-hl-mode 1)))))
-#+end_src
-
-** Main
-
-#+begin_src emacs-lisp
- (jj/appearance)
- (jj/behaviour)
- (jj/tools)
- (jj/languages)
+ "\\.nix\\'")
+#+end_src
+
+Install =yaml-mode=.
+#+begin_src emacs-lisp :tangle yes
+ (use-package yaml-mode)
+#+end_src
+
+Set up =eglot= to run on languages that have been configured.
+#+begin_src emacs-lisp
+ (global-set-key (kbd "C-c r") 'eglot-rename)
+ (global-set-key (kbd "C-c a") 'eglot-code-actions)
+ (use-package tree-sitter)
+ (use-package tree-sitter-langs)
+ (dolist (lang-hook '(sh-mode-hook
+ c-mode-hook
+ c++-mode-hook
+ cc-mode-hook
+ cmake-mode-hook
+ html-mode-hook
+ css-mode-hook
+ js-json-mode-hook
+ js-mode-hook
+ python-mode-hook
+ go-mode-hook
+ lua-mode-hook
+ markdown-mode-hook
+ tex-mode-hook
+ LaTeX-mode-hook
+ yaml-mode-hook
+ nix-mode-hook))
+ (add-hook lang-hook (lambda ()
+ (eglot-ensure)
+ (tree-sitter-mode 1)
+ (tree-sitter-hl-mode 1))))
#+end_src