aboutsummaryrefslogtreecommitdiff
path: root/Emacs
diff options
context:
space:
mode:
Diffstat (limited to 'Emacs')
-rw-r--r--Emacs/.config/emacs/.config/elfeed/feeds.org36
-rw-r--r--Emacs/.config/emacs/.var/gamegrid-user-score/tetris-scores7
-rw-r--r--Emacs/.config/emacs/config.org1933
-rw-r--r--Emacs/.config/emacs/elisp/elfeed-org.el20
-rw-r--r--Emacs/.config/emacs/elisp/eshell-additions.el15
-rw-r--r--Emacs/.config/emacs/elisp/eshell-prompt.el103
-rw-r--r--Emacs/.config/emacs/elisp/personal-light-theme.el13
-rw-r--r--Emacs/.config/emacs/elisp/personal-solarized-theme.el96
-rw-r--r--Emacs/.config/emacs/straight/versions/default.el10
9 files changed, 1132 insertions, 1101 deletions
diff --git a/Emacs/.config/emacs/.config/elfeed/feeds.org b/Emacs/.config/emacs/.config/elfeed/feeds.org
deleted file mode 100644
index 80921e7..0000000
--- a/Emacs/.config/emacs/.config/elfeed/feeds.org
+++ /dev/null
@@ -1,36 +0,0 @@
-#+title: RSS Feeds
-#+author: Aryadev Chavali
-#+date: 2025-02-17
-
-* News :news:
-** [[https://www.archlinux.org/feeds/news/][Arch Linux]]
-** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCEDEqT7DeUJyVNc5QpwSTgQ][Barely Informed]]
-* Social :social:
-** [[https://news.ycombinator.com/rss][Hacker News]] :tech:
-** [[https://www.theonion.com/rss][The Onion]]
-** [[https://www.hackerfactor.com/blog/index.php?/feeds/index.rss2][Hacker Factor]] :tech:
-* YouTube :youtube:
-** Educational :educational:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g][Protesilaos Stavrou]] :tech:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg][Tsoding Daily]] :tech:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCrqM0Ym_NbK1fqeQG2VIohg][Tsoding]] :tech:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCaTznQhurW5AaiYPbhEA-KA][Molly Rocket]] :tech:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCYO_jab_esuFRV4b17AJtAw][3B1B]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC6_J0wZdqcoRVs0Mck922SQ][Sheafification of G]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCr_Q-bPpcw5fJ-Oow1BW1NQ][Kraut]] :news:
-** Tech :tech:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCfJRkBBiPtKZyZn_3PxWaiQ][Internet of Bugs]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC7YOGHUfC1Tb6E4pudI9STA][Mental Outlaw]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCgBVkKoOAr3ajSdFFLp13_A][KRAZAM]]
-** Stories :stories:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCbWcXB0PoqOsAvAdfzWMf0w][Fredrik Knusden]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC9PIn6-XuRKZ5HmYeu46AIw][Barely Sociable]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCn8OYopT9e8tng-CGEWzfmw][Atrocity Guide]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC7dHBh9QmYF1L0TOeGIzZgw][Lazy Masquerade]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCjDQKxiTVpXutZc2Ra9wCAg][Oki's Weird Stories]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCyNtlmLB73-7gtlBz00XOQQ][Folding Ideas]]
-** Misc :misc:
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCZ1q3ZqXAFCvym4jrGozdRg][The Elephant Graveyard]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UC3cpN6gcJQqcCM6mxRUo_dA][Wendigoon]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCm22FAXZMw1BaWeFszZxUKw][Kitboga]]
-*** [[https://www.youtube.com/feeds/videos.xml?channel_id=UCxSwqqnJp9HsW0hBrHcp1FQ][Flesh Simulator]]
diff --git a/Emacs/.config/emacs/.var/gamegrid-user-score/tetris-scores b/Emacs/.config/emacs/.var/gamegrid-user-score/tetris-scores
index a85dc51..9184e6e 100644
--- a/Emacs/.config/emacs/.var/gamegrid-user-score/tetris-scores
+++ b/Emacs/.config/emacs/.var/gamegrid-user-score/tetris-scores
@@ -1,5 +1,6 @@
00458 Tue Oct 1 18:22:44 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
00424 Tue Oct 1 14:20:22 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
+00288 Sun Jun 1 14:24:57 2025 Aryadev Chavali <aryadev@aryadevchavali.com>
00281 Thu Jul 13 03:07:51 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00267 Fri Aug 16 10:54:52 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
00253 Fri Dec 2 14:00:06 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
@@ -9,8 +10,8 @@
00204 Wed Dec 28 14:50:42 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
00187 Thu Jan 12 01:30:09 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00172 Mon Jan 9 12:59:13 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
-00166 Fri Aug 16 11:05:23 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
00166 Mon May 6 02:40:23 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
+00166 Fri Aug 16 11:05:23 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
00120 Thu Aug 29 18:45:32 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
00114 Fri Jul 21 11:58:31 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00096 Sat Dec 3 16:21:40 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
@@ -26,12 +27,12 @@
00048 Sun May 5 19:34:16 2024 Aryadev Chavali <aryadev@aryadevchavali.com>
00046 Wed Oct 12 11:27:19 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
00042 Tue Aug 1 19:58:49 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
-00038 Tue Oct 11 16:47:44 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
00038 Fri Oct 14 13:05:44 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
+00038 Tue Oct 11 16:47:44 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
00037 Thu Aug 17 18:11:59 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00027 Thu Jan 12 01:14:32 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00024 Thu Jan 12 01:14:54 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00012 Tue Jan 17 13:58:01 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
-00006 Thu Jun 22 23:16:42 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00006 Mon Jan 9 11:04:43 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
+00006 Thu Jun 22 23:16:42 2023 Aryadev Chavali <aryadev@aryadevchavali.com>
00000 Fri Dec 2 13:58:02 2022 Aryadev Chavali <aryadev@aryadevchavali.com>
diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org
index b1c2763..56e2bf9 100644
--- a/Emacs/.config/emacs/config.org
+++ b/Emacs/.config/emacs/config.org
@@ -15,6 +15,7 @@
Welcome to my Emacs configuration. You may be confused by the fact
it's a readable document with prose; this file serves as both
documentation *and* code. Here's an example of some Emacs Lisp code:
+
#+begin_src emacs-lisp
;;; config.el --- Compiled configuration from config.org -*- lexical-binding: t; -*-
@@ -263,15 +264,16 @@ also added to `enable-theme-functions` such that loading a theme will
forcefully adjust the font size.
#+begin_src emacs-lisp
+(defun +oreo/--font-multiplier ()
+ (pcase (display-pixel-width)
+ ((pred (>= 1920)) 0.9)
+ ((pred (>= 2560)) 1.24)))
+
(defun +oreo/font-reset (&optional theme)
(let ((font-size (thread-first
- (pcase (system-name)
- ("rhmaiden" 140)
- (_ 120))
- (*
- (pcase (display-pixel-width)
- ((pred (>= 1920)) 0.90)
- ((pred (>= 2560)) 1.24)))
+ (system-name)
+ (pcase ("rhmaiden" 140) (_ 120))
+ (* (+oreo/--font-multiplier))
floor)))
(set-face-attribute 'default nil :height font-size)
(set-face-attribute 'mode-line nil :height font-size)))
@@ -427,6 +429,7 @@ set of examples on how to use general.
"SPC" #'execute-extended-command
"R" #'revert-buffer
":" (proc-int (switch-to-buffer "*scratch*"))
+ ";" #'eval-expression
"!" #'async-shell-command
"h" #'help-command)
@@ -731,8 +734,8 @@ vertico for specific forms.
*** Embark
I'm very late to the party here - mostly because I didn't see much
point in this. However, after seeing that [[*empv][empv]] had some
-embark bindings for cool behaviours (such as altering playlists) I had
-to try it out - and I was not disappointed.
+embark bindings for cool behaviours (such as moving tracks around on
+the live playlist) I had to try it out - and I was not disappointed.
~embark-act~ is the entry point to using embark, and you can use it
basically anywhere to great effect. Searching a buffer via
@@ -763,7 +766,7 @@ embark act more like how you wish, which I've barely touch on here.
(side . bottom)
(window-height . 0.25)
(window-parameters (mode-line-format . none)))
- embark-prompter 'embark-completing-read-prompter
+ embark-prompter 'embark-keymap-prompter
embark-indicators '(embark-highlight-indicator)
embark-help-key "?"
embark-keymap-prompter-key "#"
@@ -786,7 +789,13 @@ search system.
:init
(setq consult-preview-excluded-buffers nil
consult-preview-excluded-files '("\\`/[^/|:]+:")
- consult-preview-key "M-'")
+ consult-preview-key 'any
+ consult-ripgrep-args "rg --null --line-buffered --color=never \
+ --max-columns=1000 --path-separator / \
+ --smart-case --no-heading \
+ --with-filename --line-number \
+ --search-zip --hidden"
+ consult-fd-args "fd --full-path --color=never -H")
:general
([remap imenu] #'consult-imenu
[remap switch-to-buffer] #'consult-buffer
@@ -794,7 +803,11 @@ search system.
(leader
"'" #'consult-register)
(search-leader
- "s" #'consult-line)
+ "s" #'consult-line
+ "r" #'consult-ripgrep
+ "f" #'consult-fd
+ "o" #'consult-org-agenda
+ "e" #'consult-compile-error)
:config
(with-eval-after-load "vertico-multiform"
(add-multiple-to-list vertico-multiform-commands
@@ -884,6 +897,49 @@ the keyword ~:hydra~ in use-package declarations.
:general
(leader "wr" #'evil-window-resize-hydra/body))
#+end_src
+** Project.el
+An out of the box system for managing projects. Where possible we
+should try to use Emacs defaults, so when setting up on a new computer
+it takes a bit less time.
+
+Here I:
++ Bind ~project-prefix-map~ to "<leader>p"
++ Bind a tags generation command to "<leader>pr"
+ + mimics projectile's one, so I can quickly generate them.
+ + mimicking
+
+#+begin_src emacs-lisp
+(use-package project
+ :straight t
+ :defer t
+ :general
+ (:keymaps 'project-prefix-map
+ "r" #'+project/generate-tags)
+ (leader
+ "p" project-prefix-map)
+ :config
+ (setq project-vc-extra-root-markers '(".project"))
+ (defun +project/command (folder)
+ (format "ctags -Re -f %sTAGS %s*"
+ folder folder))
+
+ (defun +project/root ()
+ (if (project-current)
+ (project-root (project-current))
+ default-directory))
+
+ (defun +project/generate-tags ()
+ (interactive)
+ (set-process-sentinel
+ (start-process-shell-command
+ "PROJECT-GENERATE-TAGS"
+ "*tags*"
+ (+project/command (+project/root)))
+ (lambda (p event)
+ (when (string= event "finished\n")
+ (message "Finished generating tags!")
+ (visit-tags-table (format "%sTAGS" (+project/root))))))))
+#+end_src
* Aesthetics
General look and feel of Emacs, perhaps the most important of all the
sections here.
@@ -904,25 +960,20 @@ other themes in a list.
:hook (after-init-hook . +oreo/load-theme)
:init
(setq custom-theme-directory (concat user-emacs-directory "elisp/"))
- (defvar +oreo/theme-list `(personal-solarized tsdh-light))
+ (defvar +oreo/theme-list `(personal-solarized leuven))
(defvar +oreo/theme 0)
:config
(defun +oreo/load-theme ()
"Load `+oreo/theme', disabling all other themes to reduce conflict."
(mapc #'disable-theme custom-enabled-themes)
- (cl-loop
- for theme in +oreo/theme-list
- for i from 0
- if (not (= i +oreo/theme))
- do (disable-theme theme))
(load-theme (nth +oreo/theme +oreo/theme-list) t))
(defun +oreo/switch-theme ()
"Flip between different themes set in `+oreo/theme-alist'."
- (setq +oreo/theme (mod (+ 1 +oreo/theme) (length +oreo/theme-list)))
- (+oreo/load-theme))
-
- (+oreo/load-theme))
+ (thread-last (length +oreo/theme-list)
+ (mod (+ 1 +oreo/theme))
+ (setq +oreo/theme))
+ (+oreo/load-theme)))
#+end_src
** Startup screen
The default startup screen is quite bad in all honesty. While for a
@@ -957,10 +1008,10 @@ fundamental mode and call it a day.
(proc
(with-current-buffer "*scratch*"
(goto-char (point-max))
- (-->
- (emacs-init-time)
- (format "Emacs v%s - %s\n" emacs-version it)
- (insert it))))))
+ (thread-last
+ (emacs-init-time)
+ (format "Emacs v%s - %s\n" emacs-version)
+ (insert))))))
#+end_src
** Blinking cursor
Configure the blinking cursor.
@@ -1085,10 +1136,16 @@ I also setup the ~pixel-scroll-mode~ to make scrolling nicer looking.
(pixel-scroll-precision-mode t))
#+end_src
** Display line numbers
-I don't really like line numbers, I find them similar to
-[[*Fringes][fringes]] (useless space), but at least it provides some
-information. Sometimes it can help with doing repeated commands so a
-toggle option is necessary.
+Line numbers are nice - not for referencing specific lines by hand
+(why not use [[*compile-mode][compile-mode]] or ~M-x goto-line~?) but
+for relative vim motions: for example, d3j deletes 3 lines down and
+having the number of lines directly in front of you can be invaluable.
+
+2025-06-02: there's a specific option,
+~display-line-numbers-width-start~, which when set to ~t~
+automatically calculates the maximum width required to display all
+line numbers. This solves all the weird artifacting issues I was
+having with really large documents (such as this one).
#+begin_src emacs-lisp
(use-package display-line-numbers
@@ -1099,7 +1156,8 @@ toggle option is necessary.
(mode-leader
"l" #'display-line-numbers-mode)
:init
- (setq-default display-line-numbers-type 'relative))
+ (setq-default display-line-numbers-type 'relative
+ display-line-numbers-width-start t))
#+end_src
** Pulsar
Similar to how [[*Evil goggles][Evil goggles]] highlights Evil
@@ -1267,882 +1325,6 @@ any prog language of choice. Mostly for reference and copying.
("<=" . "≤")
(">=" . "≥")
#+end_example
-* Text packages
-Standard packages and configurations for dealing with text, usually
-prose.
-** Flyspell
-Flyspell allows me to spell check text documents. I use it primarily
-in org mode, as that is my preferred prose writing software, but I
-also need it in commit messages and so on, thus it should really hook
-into text-mode.
-
-#+begin_src emacs-lisp
-(use-package flyspell
- :defer t
- :hook ((org-mode-hook text-mode-hook) . flyspell-mode)
- :general
- (nmmap
- :keymaps 'text-mode-map
- "M-C" #'flyspell-correct-word-before-point
- "M-c" #'flyspell-auto-correct-word)
- (mode-leader
- "s" #'flyspell-mode))
-#+end_src
-** Whitespace
-I hate inconsistencies in whitespace. If I'm using tabs, I better be
-using them everywhere, and if I'm using whitespace, it better be well
-formed. Furthermore, hard character limits are important (enforced by
-[[*Filling and displaying fills][auto-fill-mode]]) which is why I like
-to have some kind of highlighting option.
-
-I don't want to highlight whitespace for general mode categories (Lisp
-shouldn't really have an 80 character limit), so set it for specific
-modes that need the help.
-
-#+begin_src emacs-lisp
-(use-package whitespace
- :defer t
- :general
- (nmmap
- "M--" #'whitespace-cleanup)
- (mode-leader
- "w" #'whitespace-mode)
- :hook
- (before-save-hook . whitespace-cleanup)
- ((c-mode-hook c++-mode-hook haskell-mode-hook python-mode-hook
- org-mode-hook text-mode-hook js-mode-hook
- nasm-mode-hook)
- . whitespace-mode)
- :init
- (setq whitespace-line-column nil
- whitespace-style '(face empty spaces tabs newline trailing
- lines-char tab-mark)))
-#+end_src
-** Filling and displaying fills
-The fill-column is the number of characters that should be in a single
-line of text before doing a hard wrap. The default case is 80
-characters for that l33t Unix hard terminal character limit. I like
-different fill-columns for different modes: text modes should really
-use 70 fill columns while code should stick to 80.
-
-#+begin_src emacs-lisp
-(use-package emacs
- :hook
- (text-mode-hook . auto-fill-mode)
- ((c-mode-hook c++-mode-hook haskell-mode-hook python-mode-hook
- org-mode-hook text-mode-hook js-mode-hook)
- . display-fill-column-indicator-mode)
- :init
- (setq-default fill-column 80)
- (add-hook 'text-mode-hook (proc (setq-local fill-column 70))))
-#+end_src
-** Visual line mode
-When dealing with really long lines I have a specific taste. I don't
-want text to just go off the screen, such that I have to move the
-cursor forward in the line to see later content - I want line
-wrapping. Emacs provides ~truncate-lines~ for line wrapping but it
-cuts words, which isn't very nice as that cut word spans two lines.
-Instead I want Emacs to cut by word, which is where visual-line-mode
-comes in. Since I may experience really long lines anywhere, it
-should be enabled globally.
-
-#+begin_src emacs-lisp
-(use-package emacs
- :demand t
- :config
- (global-visual-line-mode t))
-#+end_src
-** Show-paren-mode
-When the cursor is over a parenthesis, highlight the other member of
-the pair.
-
-#+begin_src emacs-lisp
-(use-package paren
- :hook (prog-mode-hook . show-paren-mode))
-#+end_src
-** Smartparens
-Smartparens is a smarter electric-parens, it's much more aware of
-context and easier to use.
-
-#+begin_src emacs-lisp
-(use-package smartparens
- :straight t
- :defer t
- :hook
- (prog-mode-hook . smartparens-mode)
- (text-mode-hook . smartparens-mode)
- :config
- (setq sp-highlight-pair-overlay nil
- sp-highlight-wrap-overlay t
- sp-highlight-wrap-tag-overlay t)
-
- (let ((unless-list '(sp-point-before-word-p
- sp-point-after-word-p
- sp-point-before-same-p)))
- (sp-pair "'" nil :unless unless-list)
- (sp-pair "\"" nil :unless unless-list))
- (sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p))
- (require 'smartparens-config))
-#+end_src
-** Powerthesaurus
-Modern package for thesaurus in Emacs with a transient + hydra.
-#+begin_src emacs-lisp
-(use-package powerthesaurus
- :defer t
- :straight t
- :general
- (search-leader
- "w" #'powerthesaurus-transient))
-#+end_src
-** lorem ipsum
-Sometimes you need placeholder text for some UI or document. Pretty
-easy to guess what text I'd use.
-
-#+begin_src emacs-lisp
-(use-package lorem-ipsum
- :straight t
- :general
- (insert-leader
- "p" #'lorem-ipsum-insert-paragraphs))
-#+end_src
-** Auto insert
-Allows inserting text immediately upon creating a new buffer with a
-given name, similar to template. Supports skeletons for inserting
-text. To make it easier for later systems to define their own auto
-inserts, I define a ~use-package~ keyword (~:auto-insert~) which
-allows one to define an entry for ~auto-insert-alist~.
-
-#+begin_src emacs-lisp
-(use-package autoinsert
- :demand t
- :hook (after-init-hook . auto-insert-mode)
- :config
- (with-eval-after-load "use-package-core"
- (add-to-list 'use-package-keywords ':auto-insert)
- (defun use-package-normalize/:auto-insert (_name-symbol _keyword args)
- args)
- (defun use-package-handler/:auto-insert (name _keyword args rest state)
- (use-package-concat
- (use-package-process-keywords name rest state)
- (mapcar
- #'(lambda (arg)
- `(add-to-list
- 'auto-insert-alist
- ',arg))
- args)))))
-#+end_src
-* Programming packages
-Packages that help with programming.
-** Eldoc
-Eldoc presents documentation to the user upon placing ones cursor upon
-any symbol. This is very useful when programming as it:
-- presents the arguments of functions while writing calls for them
-- presents typing and documentation of variables
-
-Eldoc box makes the help buffer a hovering box instead of printing it
-in the minibuffer. A lot cleaner.
-
-2024-05-31: Eldoc box is a bit useless now that I'm not using frames.
-I prefer the use of the minibuffer for printing documentation now.
-
-#+begin_src emacs-lisp
-(use-package eldoc
- :defer t
- :hook (prog-mode-hook . eldoc-mode)
- :init
- (global-eldoc-mode 1)
- :general
- (leader
- "h>" #'eldoc-doc-buffer))
-#+end_src
-** Flycheck
-Flycheck is the checking system for Emacs. I don't necessarily like
-having all my code checked all the time, so I haven't added a hook to
-prog-mode as it would be better for me to decide when I want checking
-and when I don't. Many times Flycheck is annoying when checking a
-program, particularly one which isn't finished yet.
-
-#+begin_src emacs-lisp
-(use-package flycheck
- :straight t
- :defer t
- :commands (flycheck-mode flycheck-list-errors)
- :general
- (mode-leader
- "f" #'flycheck-mode)
- (code-leader
- "x" #'flycheck-list-errors
- "j" #'flycheck-next-error
- "k" #'flycheck-previous-error)
- :display
- ("\\*Flycheck.*"
- (display-buffer-at-bottom)
- (window-height . 0.25))
- :init
- (setq-default flycheck-check-syntax-automatically
- '(save idle-change mode-enabled)
- flycheck-idle-change-delay 1.0
- flycheck-buffer-switch-check-intermediate-buffers t
- flycheck-display-errors-delay 0.25)
- :config
- (with-eval-after-load "evil-collection"
- (evil-collection-flycheck-setup)))
-#+end_src
-** Eglot
-Eglot is package to communicate with LSP servers for better
-programming capabilities. Interactions with a server provide results
-to the client, done through JSON.
-
-NOTE: Emacs 28.1 comes with better JSON parsing, which makes Eglot
-much faster.
-
-2023-03-26: I've found Eglot to be useful sometimes, but many of the
-projects I work on don't require a heavy server setup to efficiently
-edit and check for errors; Emacs provides a lot of functionality. So
-by default I've disabled it, using =M-x eglot= to startup the LSP
-server when I need it.
-
-2024-06-27: In projects where I do use eglot and I know I will need it
-regardless of file choice, I prefer setting it at the dir-local level
-via an eval form. So I add to the safe values for the eval variable
-to be set.
-
-#+begin_src emacs-lisp
-(use-package eglot
- :defer t
- :general
- (code-leader
- :keymaps 'eglot-mode-map
- "f" #'eglot-format
- "a" #'eglot-code-actions
- "R" #'eglot-reconnect)
- :init
- (setq eglot-auto-shutdown t
- eglot-stay-out-of '(flymake)
- eglot-ignored-server-capabilities '(:documentHighlightProvider
- :documentOnTypeFormattingProvider
- :inlayHintProvider))
- (add-to-list 'safe-local-variable-values '(eval eglot-ensure)))
-#+end_src
-** Indentation
-By default, turn off tabs and set the tab width to two.
-
-#+begin_src emacs-lisp
-(setq-default indent-tabs-mode nil
- tab-width 2)
-#+end_src
-
-However, if necessary later, define a function that may activate tabs locally.
-#+begin_src emacs-lisp
-(defun +oreo/use-tabs ()
- (interactive)
- (setq-local indent-tabs-mode t))
-#+end_src
-** Highlight todo items
-TODO items are highlighted in org-mode, but not necessarily in every
-mode. This minor mode highlights all TODO like items via a list of
-strings to match. It also configures faces to use when highlighting.
-I hook it to prog-mode.
-
-#+begin_src emacs-lisp
-(use-package hl-todo
- :straight t
- :after prog-mode
- :hook (prog-mode-hook . hl-todo-mode)
- :init
- (setq hl-todo-keyword-faces
- '(("TODO" . "#E50000")
- ("WIP" . "#ffa500")
- ("NOTE" . "#00CC00")
- ("FIXME" . "#d02090"))))
-#+end_src
-** Hide-show mode
-Turn on ~hs-minor-mode~ for all prog-mode. This provides folds for
-free.
-
-#+begin_src emacs-lisp
-(use-package hideshow
- :defer t
- :hook (prog-mode-hook . hs-minor-mode))
-#+end_src
-** Aggressive indenting
-Essentially my dream editing experience: when I type stuff in, try and
-indent it for me on the fly. Just checkout the
-[[https://github.com/Malabarba/aggressive-indent-mode][page]], any
-description I give won't do it justice.
-
-#+begin_src emacs-lisp
-(use-package aggressive-indent
- :straight t
- :hook (emacs-lisp-mode-hook . aggressive-indent-mode)
- :hook (scheme-mode-hook . aggressive-indent-mode)
- :hook (lisp-mode-hook . aggressive-indent-mode))
-#+end_src
-** Compilation
-Compilation mode is an incredibly useful subsystem of Emacs which
-allows one to run arbitrary commands. If those commands produce
-errors (particularly errors that have a filename, column and line)
-compilation-mode can colourise these errors and help you navigate to
-them.
-
-Here I add some bindings and a filter which colourises the output of
-compilation mode for ANSI escape sequences; the eyecandy is certainly
-nice but it's very useful when dealing with tools that use those codes
-so you can actually read the text.
-
-#+begin_src emacs-lisp
-(use-package compile
- :defer t
- :display
- ("\\*compilation\\*"
- (display-buffer-reuse-window display-buffer-at-bottom)
- (window-height . 0.3)
- (reusable-frames . t))
- :hydra
- (move-error-hydra
- (:hint nil) "Hydra for moving between errors"
- ("j" #'next-error)
- ("k" #'previous-error))
- :general
- (leader
- "j" #'move-error-hydra/next-error
- "k" #'move-error-hydra/previous-error)
- (code-leader
- "c" #'compile
- "r" #'recompile)
- (nmap
- "M-r" #'recompile)
- (:keymaps 'compilation-mode-map
- "g" nil ;; by default this is recompile
- "M-j" #'compilation-next-error
- "M-k" #'compilation-previous-error)
- (nmmap
- :keymaps 'compilation-mode-map
- "c" #'recompile)
- :init
- (setq compilation-scroll-output 'first-error
- compilation-context-lines nil
- next-error-highlight 'fringe-arrow)
- :config
- (add-hook 'compilation-filter-hook #'ansi-color-compilation-filter))
-#+end_src
-** xref
-Find definitions, references and general objects using tags without
-external packages. Provided out of the box with Emacs, but requires a
-way of generating a =TAGS= file for your project (look at
-[[*Project.el][Project.el]] for my way of doing so). A critical
-component in a minimal setup for programming without heavier systems
-like [[*Eglot][Eglot]].
-
-#+begin_src emacs-lisp
-(use-package xref
- :defer t
- :display
- ("\\*xref\\*"
- (display-buffer-at-bottom)
- (inhibit-duplicate-buffer . t)
- (window-height . 0.3))
- :general
- (code-leader
- "t" #'nil)
- (code-leader
- :infix "t"
- "t" #'xref-find-apropos
- "d" #'xref-find-definitions
- "r" #'xref-find-references)
- (nmmap
- :keymaps 'xref--xref-buffer-mode-map
- "RET" #'xref-goto-xref
- "J" #'xref-next-line
- "K" #'xref-prev-line
- "r" #'xref-query-replace-in-results
- "gr" #'xref-revert-buffer
- "q" #'quit-window))
-#+end_src
-** Project.el
-An out of the box system for managing projects. Where possible we
-should try to use Emacs defaults, so when setting up on a new computer
-it takes a bit less time.
-
-Here I:
-+ Bind ~project-prefix-map~ to "<leader>p"
-+ Bind a tags generation command to "<leader>pr"
- + mimics projectile's one, so I can quickly generate them.
- + mimicking
-
-#+begin_src emacs-lisp
-(use-package project
- :defer t
- :general
- (:keymaps 'project-prefix-map
- "r" #'+project/generate-tags)
- (leader
- "p" project-prefix-map)
- :config
- (setq project-vc-extra-root-markers '(".project"))
- (defun +project/command (folder)
- (format "ctags -Re -f %sTAGS %s*"
- folder folder))
-
- (defun +project/root ()
- (if (project-current)
- (project-root (project-current))
- default-directory))
-
- (defun +project/generate-tags ()
- (interactive)
- (set-process-sentinel
- (start-process-shell-command
- "PROJECT-GENERATE-TAGS"
- "*tags*"
- (+project/command (+project/root)))
- (lambda (p event)
- (when (string= event "finished\n")
- (message "Finished generating tags!")
- (visit-tags-table (format "%sTAGS" (+project/root))))))))
-#+end_src
-** devdocs
-When man pages aren't enough, you need some documentation lookup
-system (basically whenever your using anything but C/C++/Bash).
-[[https://devdocs.io][Devdocs]] is a great little website that
-provides a ton of documentation sets. There's an Emacs package for it
-which works well and downloads documentation sets to my machine, which
-is nice.
-
-#+begin_src emacs-lisp
-(use-package devdocs
- :straight t
- :defer t
- :general
- (file-leader
- "d" #'devdocs-lookup))
-#+end_src
-** rainbow-delimiters
-Makes colours delimiters (parentheses) based on their depth in an
-expression. Rainbow flag in your Lisp source code.
-
-#+begin_src emacs-lisp
-(use-package rainbow-delimiters
- :defer t
- :straight t
- :general
- (mode-leader "r" #'rainbow-delimiters-mode)
- :hook
- ((lisp-mode-hook emacs-lisp-mode-hook racket-mode-hook) . rainbow-delimiters-mode))
-#+end_src
-** Licensing
-Loads [[file:elisp/license.el][license.el]] for inserting licenses.
-Licenses are important for distribution and attribution to be defined
-clearly.
-
-#+begin_src emacs-lisp
-(use-package license
- :demand t
- :load-path "elisp/"
- :general
- (insert-leader
- "l" #'+license/insert-copyright-notice
- "L" #'+license/insert-complete-license))
-#+end_src
-** diff mode
-Good diff management is essentially mandatory in development. Emacs
-comes with functionality out of the box to generate, manipulate, and
-apply diffs - here I configure a small subset.
-#+begin_src emacs-lisp
-(use-package diff-mode
- :general
- (nmmap
- :keymaps 'diff-mode-map
- "J" #'diff-hunk-next
- "K" #'diff-hunk-prev
- "M-RET" #'diff-apply-hunk
- "RET" #'diff-goto-source))
-#+end_src
-* Org mode
-Org is, at its most basic, a markup language. =org-mode= is a major
-mode for Emacs to interpret org buffers. org-mode provides a lot of
-capabilities, some are:
-+ A complete table based spreadsheet system, with formulas (including
- [[*Calculator][calc-mode]] integration)
-+ Code blocks with proper syntax highlighting and editing experience
- + Evaluation
- + Export of code blocks to a variety of formats
- + Export of code blocks to a code file (so called "tangling", which
- is what occurs in this document)
-+ Feature complete scheduling system with [[*Calendar][calendar]]
- integration
- + A clock-in system to time tasks
-+ TODO system
-+ Export to a variety of formats or make your own export engine using
- the org AST.
-+ Inline $\LaTeX$, with the ability to render the fragments on
- demand within the buffer
-+ Links to a variety of formats:
- + Websites (via http or https)
- + FTP
- + SSH
- + Files (even to a specific line)
- + Info pages
-
-I'd argue this is a bit more than a markup language. Like
-[[*Magit][Magit]], some use Emacs just for this system.
-** Org Essentials
-Org has a ton of settings to tweak, which change your experience quite
-a bit. Here are mine, but this took a lot of just reading other
-people's configurations and testing. I don't do a good job of
-explaining how this works in all honesty, but it works well for me so
-I'm not very bothered.
-
-+ By default =~/Text= is my directory for text files. I actually have
- a repository that manages this directory for agenda files and other
- documents
-+ Indentation in file should not be allowed, i.e. text indentation, as
- that forces other editors to read it a certain way as well. It's
- obtrusive hence it's off.
-+ Org startup indented is on by default as most documents do benefit
- from the indentation, but I do turn it off for some files via
- ~#+startup:noindent~
-+ When opening an org document there can be a lot of headings, so I
- set folding to just content
-+ Org documents can also have a lot of latex previews, which make
- opening some after a while a massive hassle. If I want to see the
- preview, I'll do it myself, so turn it off.
-+ Org manages windowing itself, to some extent, so I set those options
- to be as unobtrusive as possible
-+ Load languages I use in =src= blocks in org-mode (Emacs-lisp for
- this configuration, C and Python)
-
-#+begin_src emacs-lisp
-(use-package org
- :defer t
- :init
- (setq org-directory "~/Text/"
- org-adapt-indentation nil
- org-indent-mode nil
- org-startup-indented nil
- org-startup-folded 'showeverything
- org-startup-with-latex-preview nil
- org-imenu-depth 10
- org-src-window-setup 'current-window
- org-indirect-buffer-display 'current-window
- org-link-frame-setup '((vm . vm-visit-folder-other-frame)
- (vm-imap . vm-visit-imap-folder-other-frame)
- (file . find-file))
- org-babel-load-languages '((emacs-lisp . t)
- (lisp . t)
- (shell . t))))
-#+end_src
-** Org Latex
-Org mode has deep integration with latex, can export to PDF and even
-display latex fragments in the document directly. I setup the
-pdf-process, code listing options via minted and the format options
-for latex fragments.
-
-#+begin_src emacs-lisp
-(use-package org
- :defer t
- :init
- (setq org-format-latex-options
- '(:foreground default :background "Transparent" :scale 2
- :html-foreground "Black" :html-background "Transparent"
- :html-scale 1.0 :matchers ("begin" "$1" "$" "$$" "\\(" "\\["))
- org-latex-src-block-backend 'minted
- org-latex-minted-langs '((emacs-lisp "common-lisp")
- (ledger "text")
- (cc "c++")
- (cperl "perl")
- (shell-script "bash")
- (caml "ocaml"))
- org-latex-packages-alist '(("" "minted"))
- org-latex-pdf-process
- (list (concat "latexmk -f -bibtex -pdf "
- "-shell-escape -%latex -interaction=nonstopmode "
- "-output-directory=%o %f"))
- org-latex-minted-options
- '(("style" "colorful")
- ("linenos")
- ("frame" "single")
- ("mathescape")
- ("fontfamily" "courier")
- ("samepage" "false")
- ("breaklines" "true")
- ("breakanywhere" "true"))))
-#+end_src
-** Org Core Variables
-Tons of variables for org-mode, including a ton of latex ones. Can't
-really explain because it sets up quite a lot of local stuff. Also I
-copy pasted the majority of this, tweaking it till it felt good. Doom
-Emacs was very helpful here.
-
-#+begin_src emacs-lisp
-(use-package org
- :defer t
- :init
- (setq org-edit-src-content-indentation 0
- org-bookmark-names-plist nil
- org-eldoc-breadcrumb-separator " → "
- org-enforce-todo-dependencies t
- org-export-backends '(ascii html latex odt icalendar)
- org-fontify-quote-and-verse-blocks t
- org-fontify-whole-heading-line t
- org-footnote-auto-label t
- org-hide-emphasis-markers nil
- org-hide-leading-stars t
- org-image-actual-width nil
- org-imenu-depth 10
- org-link-descriptive nil
- org-priority-faces '((?A . error) (?B . warning) (?C . success))
- org-refile-targets '((nil . (:maxlevel . 2)))
- org-tags-column 0
- org-todo-keywords '((sequence "TODO" "WIP" "DONE")
- (sequence "PROJ" "WAIT" "COMPLETE"))
- org-use-sub-superscripts '{}))
-#+end_src
-** Org Core Functionality
-Hooks, prettify-symbols and records for auto insertion.
-
-#+begin_src emacs-lisp
-(use-package org
- :defer t
- :hook
- (org-mode-hook . prettify-symbols-mode)
- :display
- ("\\*Org Src.*"
- (display-buffer-same-window))
- :auto-insert
- (("\\.org\\'" . "Org skeleton")
- "Enter title: "
- "#+title: " str | (buffer-file-name) "\n"
- "#+author: " (read-string "Enter author: ") | user-full-name "\n"
- "#+description: " (read-string "Enter description: ") | "Description" "\n"
- "#+date: " (format-time-string "%Y-%m-%d" (current-time)) "\n"
- "* " _))
-#+end_src
-** Org Core Bindings
-A load of bindings for org-mode which binds together a lot of
-functionality. It's best to read it yourself; to describe it is to
-write the code.
-
-#+begin_src emacs-lisp
-(use-package org
- :defer t
- :init
- (with-eval-after-load "consult"
- (general-def
- :keymaps 'org-mode-map
- [remap imenu] #'consult-outline))
- :general
- (nmmap
- "M-F" #'org-open-at-point)
- (nmmap
- :keymaps 'org-mode-map
- "TAB" #'org-cycle)
- (file-leader
- "l" #'org-store-link)
- (insert-leader
- "o" #'org-insert-last-stored-link)
- (code-leader
- :keymaps 'emacs-lisp-mode-map
- "D" #'org-babel-detangle)
- (local-leader
- :states '(normal motion)
- :keymaps 'org-mode-map
- "r" #'org-list-repair
- "d" #'org-date-from-calendar
- "t" #'org-todo
- "," #'org-priority
- "T" #'org-babel-tangle
- "i" #'org-insert-structure-template
- "p" #'org-latex-preview
- "s" #'org-property-action
- "e" #'org-export-dispatch
- "o" #'org-edit-special
- "R" #'org-refile
- "O" #'org-open-at-point)
- (local-leader
- :keymaps 'org-mode-map
- :infix "l"
- "i" #'org-insert-link
- "l" #'org-open-at-point
- "f" #'org-footnote-action)
- (local-leader
- :keymaps 'org-mode-map
- :infix "'"
- "a" #'org-table-align
- "c" #'org-table-create
- "f" #'org-table-edit-formulas
- "t" #'org-table-toggle-coordinate-overlays
- "s" #'org-table-sum
- "e" #'org-table-calc-current-TBLFM
- "E" #'org-table-eval-formula)
- (local-leader
- :keymaps 'org-src-mode-map
- "o" #'org-edit-src-exit))
-#+end_src
-** Org Agenda
-Org agenda provides a nice viewing for schedules. With org mode it's
-a very tidy way to manage your time.
-
-#+begin_src emacs-lisp
-(use-package org-agenda
- :defer t
- :init
- (defconst +org/agenda-root "~/Text/"
- "Root directory for all agenda files")
- (setq org-agenda-files (list (expand-file-name +org/agenda-root))
- org-agenda-window-setup 'current-window
- org-agenda-skip-deadline-prewarning-if-scheduled t
- org-agenda-skip-scheduled-if-done t
- org-agenda-skip-deadline-if-done t
- org-agenda-start-with-entry-text-mode nil)
- :config
- (evil-set-initial-state 'org-agenda-mode 'normal)
- :general
- (file-leader
- "a" (proc-int
- (--> (directory-files (car org-agenda-files))
- (mapcar #'(lambda (x) (concat (car org-agenda-files) x)) it)
- (completing-read "Enter directory: " it nil t)
- (find-file it))))
- (app-leader
- "a" #'org-agenda)
- (nmmap
- :keymaps 'org-agenda-mode-map
- "zd" #'org-agenda-day-view
- "zw" #'org-agenda-week-view
- "zm" #'org-agenda-month-view
- "gd" #'org-agenda-goto-date
- "RET" #'org-agenda-switch-to
- "J" #'org-agenda-later
- "K" #'org-agenda-earlier
- "t" #'org-agenda-todo
- "." #'org-agenda-goto-today
- "," #'org-agenda-goto-date
- "q" #'org-agenda-quit
- "r" #'org-agenda-redo))
-#+end_src
-** Org capture
-Org capture provides a system for quickly "capturing" some information
-into an org file. A classic example is creating a new TODO in a
-todo file, where the bare minimum to record one is:
-+ where was it recorded?
-+ when was it recorded?
-+ what is it?
-Org capture provides a way to do that seamlessly without opening the
-todo file directly.
-
-#+begin_src emacs-lisp
-(use-package org-capture
- :defer t
- :init
- (setq
- org-default-notes-file (concat org-directory "todo.org")
- org-capture-templates
- '(("t" "Todo" entry
- (file "")
- "* TODO %?
-%T
-%a")
- ("q" "Quote" entry
- (file "quotes.org")
- "* %^{Title}
-,#+caption: %^{Origin} %t
-,#+begin_quote
-%?
-,#+end_quote")))
- :general
- (leader
- "C" #'org-capture)
- (nmmap
- :keymaps 'org-capture-mode-map
- "ZZ" #'org-capture-finalize
- "ZR" #'org-capture-refile
- "ZQ" #'org-capture-kill))
-#+end_src
-** WAIT Org clock-in
-:PROPERTIES:
-:header-args:emacs-lisp: :tangle no :results none
-:END:
-2025-02-15: I haven't found much use for this yet but the system is
-quite expressive. If I needed time-keeping somewhere, I know where to
-go.
-
-Org provides a nice timekeeping system that allows for managing how
-much time is taken per task. It even has an extensive reporting
-system to see how much time you spend on specific tasks or overall.
-
-#+begin_src emacs-lisp
-(use-package org-clock
- :after org
- :general
- (local-leader
- :keymaps 'org-mode-map
- :infix "c"
- "d" #'org-clock-display
- "c" #'org-clock-in
- "o" #'org-clock-out
- "r" #'org-clock-report))
-#+end_src
-** WAIT Org ref
-:PROPERTIES:
-:header-args:emacs-lisp: :tangle no :results none
-:END:
-For bibliographic stuff in $\LaTeX$ export.
-
-#+begin_src emacs-lisp
-(use-package org-ref
- :straight t
- :defer t
- :init
- (setq bibtex-files '("~/Text/bibliography.bib")
- bibtex-completion-bibliography '("~/Text/bibliography.bib")
- bibtex-completion-additional-search-fields '(keywords)))
-#+end_src
-*** Org ref ivy integration
-Org ref requires ivy-bibtex to work properly with ivy, so we need to
-set that up as well
-
-#+begin_src emacs-lisp
-(use-package ivy-bibtex
- :straight t
- :after org-ref
- :config
- (require 'org-ref-ivy))
-#+end_src
-** Org message
-Org message allows for the use of org mode when composing mails,
-generating HTML multipart emails. This integrates the WYSIWYG
-experience with mail in Emacs while also providing powerful text
-features with basically no learning curve (as long as you've already
-learnt the basics of org).
-
-#+begin_src emacs-lisp
-(use-package org-msg
- :straight t
- :hook
- (message-mode-hook . org-msg-mode)
- (notmuch-message-mode-hook . org-msg-mode)
- :config
- (setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t tex:dvipng"
- org-msg-greeting-name-limit 3)
-
- (add-to-list
- 'org-msg-enforce-css
- '(img latex-fragment-inline
- ((transform . ,(format "translateY(-1px) scale(%.3f)"
- (/ 1.0 (if (boundp 'preview-scale)
- preview-scale 1.4))))
- (margin . "0 -0.35em")))))
-#+end_src
-** Org for evil
-Evil org for some nice bindings.
-
-#+begin_src emacs-lisp
-(use-package evil-org
- :straight t
- :defer t
- :hook (org-mode-hook . evil-org-mode))
-#+end_src
* Applications
Emacs is an operating system, now with a good text editor through
[[*Evil - Vim emulation][Evil]]. Let's configure some apps for it.
@@ -2160,7 +1342,6 @@ In this case I just need to setup the bindings for it.
:straight t)
(use-package magit
- :after transient
:straight t
:defer t
:display
@@ -2179,9 +1360,10 @@ In this case I just need to setup the bindings for it.
"g" #'magit-dispatch)
(code-leader
"b" #'magit-blame)
- (nmap :keymaps 'magit-status-mode-map
- "}" #'magit-section-forward-sibling
- "{" #'magit-section-backward-sibling)
+ (nmap
+ :keymaps 'magit-status-mode-map
+ "M-j" #'magit-section-forward-sibling
+ "M-k" #'magit-section-backward-sibling)
:init
(setq vc-follow-symlinks t
magit-blame-echo-style 'lines
@@ -2200,6 +1382,8 @@ need to imagine any more, with Magit Forge.
(use-package forge
:after magit
:straight t
+ :init
+ (setq forge-add-default-bindings nil)
:config
(with-eval-after-load "evil-collection"
(evil-collection-forge-setup)))
@@ -2218,7 +1402,10 @@ engine, which makes sense as it's primarily a text interface.
(nmmap
:keymaps 'eww-mode-map
"w" #'evil-forward-word-begin
- "Y" #'eww-copy-page-url))
+ "Y" #'eww-copy-page-url)
+ :config
+ (with-eval-after-load "evil-collection"
+ (evil-collection-eww-setup)))
#+end_src
** Calendar
Calendar is a simple inbuilt application that helps with date
@@ -2249,7 +1436,9 @@ to the kill ring and bind it to "Y".
(let ((date (calendar-cursor-to-date)))
(when date
(setq date (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date)))
- (kill-new (format-time-string "%Y-%m-%d" date)))))))
+ (kill-new (format-time-string "%Y-%m-%d" date))))))
+ (with-eval-after-load "evil-collection"
+ (evil-collection-calendar-setup)))
#+end_src
** Mail
Mail is a funny thing; most people use it just for business or
@@ -2293,7 +1482,10 @@ from the remote server.
(notmuch-search-tag
(notmuch-tag-change-list '("-inbox" "+flagged") unflag) beg end)
(when (eq beg end)
- (notmuch-search-next-thread))))
+ (notmuch-search-next-thread)))
+
+ (with-eval-after-load "evil-collection"
+ (evil-collection-notmuch-setup)))
#+end_src
*** Smtpmail
Setup the smtpmail package, which is used when sending mail. Mostly
@@ -2365,7 +1557,8 @@ Here I setup dired with a few niceties
dired-omit-files "^\\." ; dotfiles
dired-omit-verbose nil
dired-dwim-target t
- dired-kill-when-opening-new-dired-buffer t)
+ dired-kill-when-opening-new-dired-buffer t
+ dired-auto-revert-buffer t)
:general
(nmmap
:keymaps 'dired-mode-map
@@ -2486,7 +1679,7 @@ Here I setup dired with a few niceties
(dired-mark-directories nil)
(let* ((subdirs-inserted (mapcar #'car dired-subdir-alist))
(subdirs-available (mapcar #'(lambda (x) (concat x "/"))
- (dired-get-marked-files))))
+ (dired-get-marked-files))))
(dired-unmark-all-marks)
(cl-remove-if #'(lambda (f) (member f subdirs-inserted)) subdirs-available)))
@@ -2785,7 +1978,6 @@ most distribution nowadays.
:general
(search-leader
"g" #'grep-this-file
- "c" #'grep-config-file
"d" #'rgrep)
(nmmap
:keymaps 'grep-mode-map
@@ -2802,23 +1994,18 @@ most distribution nowadays.
;; Without this wgrep doesn't work properly
(evil-set-initial-state 'grep-mode 'normal)
- (defun grep-file (query filename)
- (grep (format "grep --color=auto -nIiHZEe \"%s\" -- %s"
- query filename)))
+ (defmacro grep-file (query filename)
+ `(grep (format "grep --color=auto -nIiHE --null -e \"%s\" %s"
+ ,query ,filename)))
(defun grep-this-file ()
(interactive)
- (let ((query (read-string "Search for: ")))
- (if (buffer-file-name (current-buffer))
- (grep-file query (buffer-file-name (current-buffer)))
- (let ((temp-file (make-temp-file "temp-grep")))
- (write-region (point-min) (point-max) temp-file)
- (grep-file query temp-file)))))
-
- (defun grep-config-file ()
- (interactive)
- (let ((query (read-string "Search for: " "^[*]+ .*")))
- (grep-file query (concat user-emacs-directory "config.org")))))
+ (let ((query (read-string "Search for: "))
+ (filename (or (buffer-file-name (current-buffer))
+ (let ((temp-file (make-temp-file "temp-grep")))
+ (write-region (point-min) (point-max) temp-file)
+ temp-file))))
+ (grep-file query filename))))
#+end_src
*** rg
#+begin_src emacs-lisp
@@ -2832,7 +2019,7 @@ most distribution nowadays.
(window-height . 0.35))
:general
(search-leader
- "r" #'rg)
+ "R" #'rg-menu)
(:keymaps 'project-prefix-map
"t" #'+rg/project-todo)
(nmmap
@@ -2913,14 +2100,14 @@ to elfeed for loading the system.
(funcall option url)))))
#+end_src
*** Elfeed-org
+A small self-written package to load an org file as a set of elfeed
+feeds.
#+begin_src emacs-lisp
(use-package elfeed-org
:load-path "elisp/"
:after elfeed
:init
- (thread-last "elfeed/feeds.org"
- no-littering-expand-etc-file-name
- (setq elfeed-org/file))
+ (setq elfeed-org/file (concat org-directory "feeds.org"))
:config
(elfeed-org))
#+end_src
@@ -2932,7 +2119,10 @@ IBuffer is the dired of buffers. Nothing much else to be said.
:defer t
:general
(buffer-leader
- "i" #'ibuffer))
+ "i" #'ibuffer)
+ :config
+ (with-eval-after-load "evil-collection"
+ (evil-collection-ibuffer-setup)))
#+end_src
** Proced
Emacs has two systems for process management:
@@ -2957,7 +2147,10 @@ Core Proced config, just a few bindings and evil collection setup.
(display-buffer-at-bottom)
(window-height . 0.25))
:init
- (setq proced-auto-update-interval 5))
+ (setq proced-auto-update-interval 5)
+ :config
+ (with-eval-after-load "evil-collection"
+ (evil-collection-proced-setup)))
#+end_src
** Calculator
~calc-mode~ is a calculator system within Emacs that provides a
@@ -2988,7 +2181,10 @@ current buffer to perform some quick mathematics in it.
(app-leader
"c" #'calc-dispatch)
:init
- (setq calc-algebraic-mode t))
+ (setq calc-algebraic-mode t)
+ :config
+ (with-eval-after-load "evil-collection"
+ (evil-collection-calc-setup)))
#+end_src
** Zone
Emacs' out of the box screensaver software.
@@ -3128,6 +2324,9 @@ playing.
(use-package empv
:straight t
:defer t
+ :general
+ (app-leader
+ "e" #'empv-hydra/body)
:init
(setq empv-audio-dir (list (expand-file-name "~/Media/audio")
;; "/sshx:oldboy:/media/hdd/content/Audio"
@@ -3146,12 +2345,6 @@ playing.
("SomaFM - Vaporwaves" . "http://www.somafm.com/vaporwaves.pls")
("SomaFM - DEFCON" . "http://www.somafm.com/defcon.pls")
("SomaFM - The Trip" . "http://www.somafm.com/thetrip.pls"))))
-
-(use-package empv-hydra
- :after hydra
- :general
- (app-leader
- "e" #'empv-hydra/body))
#+end_src
** Grand Unified Debugger (GUD)
GUD is a system for debugging, hooking into processes and
@@ -3212,10 +2405,842 @@ in an Emacs-only map.
:keymaps 'jira-issues-mode-map
"M-RET" #'jira-issues-actions-menu))
#+end_src
+* Text packages
+Standard packages and configurations for dealing with text, usually
+prose.
+** Flyspell
+Flyspell allows me to spell check text documents. I use it primarily
+in org mode, as that is my preferred prose writing software, but I
+also need it in commit messages and so on, thus it should really hook
+into text-mode.
+
+#+begin_src emacs-lisp
+(use-package flyspell
+ :defer t
+ :hook ((org-mode-hook text-mode-hook) . flyspell-mode)
+ :general
+ (nmmap
+ :keymaps 'text-mode-map
+ "M-C" #'flyspell-correct-word-before-point
+ "M-c" #'flyspell-auto-correct-word)
+ (mode-leader
+ "s" #'flyspell-mode))
+#+end_src
+** Whitespace
+I hate inconsistencies in whitespace. If I'm using tabs, I better be
+using them everywhere, and if I'm using whitespace, it better be well
+formed. Furthermore, hard character limits are important (enforced by
+[[*Filling and displaying fills][auto-fill-mode]]) which is why I like
+to have some kind of highlighting option.
+
+I don't want to highlight whitespace for general mode categories (Lisp
+shouldn't really have an 80 character limit), so set it for specific
+modes that need the help.
+
+#+begin_src emacs-lisp
+(use-package whitespace
+ :defer t
+ :general
+ (nmmap
+ "M--" #'whitespace-cleanup)
+ (mode-leader
+ "w" #'whitespace-mode)
+ :hook
+ (before-save-hook . whitespace-cleanup)
+ ((c-mode-hook c++-mode-hook haskell-mode-hook python-mode-hook
+ org-mode-hook text-mode-hook js-mode-hook
+ nasm-mode-hook)
+ . whitespace-mode)
+ :init
+ (setq whitespace-line-column nil
+ whitespace-style '(face empty spaces tabs newline trailing
+ lines-char tab-mark)))
+#+end_src
+** Filling and displaying fills
+The fill-column is the number of characters that should be in a single
+line of text before doing a hard wrap. The default case is 80
+characters for that l33t Unix hard terminal character limit. I like
+different fill-columns for different modes: text modes should really
+use 70 fill columns while code should stick to 80.
+
+#+begin_src emacs-lisp
+(use-package emacs
+ :hook
+ (text-mode-hook . auto-fill-mode)
+ ((c-mode-hook c++-mode-hook haskell-mode-hook python-mode-hook
+ org-mode-hook text-mode-hook js-mode-hook)
+ . display-fill-column-indicator-mode)
+ :init
+ (setq-default fill-column 80)
+ (add-hook 'text-mode-hook (proc (setq-local fill-column 70))))
+#+end_src
+** Visual line mode
+When dealing with really long lines I have a specific taste. I don't
+want text to just go off the screen, such that I have to move the
+cursor forward in the line to see later content - I want line
+wrapping. Emacs provides ~truncate-lines~ for line wrapping but it
+cuts words, which isn't very nice as that cut word spans two lines.
+Instead I want Emacs to cut by word, which is where visual-line-mode
+comes in. Since I may experience really long lines anywhere, it
+should be enabled globally.
+
+#+begin_src emacs-lisp
+(use-package emacs
+ :demand t
+ :config
+ (global-visual-line-mode t))
+#+end_src
+** Show-paren-mode
+When the cursor is over a parenthesis, highlight the other member of
+the pair.
+
+#+begin_src emacs-lisp
+(use-package paren
+ :hook (prog-mode-hook . show-paren-mode))
+#+end_src
+** Smartparens
+Smartparens is a smarter electric-parens, it's much more aware of
+context and easier to use.
+
+#+begin_src emacs-lisp
+(use-package smartparens
+ :straight t
+ :defer t
+ :hook
+ (prog-mode-hook . smartparens-mode)
+ (text-mode-hook . smartparens-mode)
+ :config
+ (setq sp-highlight-pair-overlay nil
+ sp-highlight-wrap-overlay t
+ sp-highlight-wrap-tag-overlay t)
+
+ (let ((unless-list '(sp-point-before-word-p
+ sp-point-after-word-p
+ sp-point-before-same-p)))
+ (sp-pair "'" nil :unless unless-list)
+ (sp-pair "\"" nil :unless unless-list))
+ (sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p))
+ (require 'smartparens-config))
+#+end_src
+** Powerthesaurus
+Modern package for thesaurus in Emacs with a transient + hydra.
+#+begin_src emacs-lisp
+(use-package powerthesaurus
+ :defer t
+ :straight t
+ :general
+ (search-leader
+ "w" #'powerthesaurus-transient))
+#+end_src
+** lorem ipsum
+Sometimes you need placeholder text for some UI or document. Pretty
+easy to guess what text I'd use.
+
+#+begin_src emacs-lisp
+(use-package lorem-ipsum
+ :straight t
+ :general
+ (insert-leader
+ "p" #'lorem-ipsum-insert-paragraphs))
+#+end_src
+** Auto insert
+Allows inserting text immediately upon creating a new buffer with a
+given name, similar to template. Supports skeletons for inserting
+text. To make it easier for later systems to define their own auto
+inserts, I define a ~use-package~ keyword (~:auto-insert~) which
+allows one to define an entry for ~auto-insert-alist~.
+
+#+begin_src emacs-lisp
+(use-package autoinsert
+ :demand t
+ :hook (after-init-hook . auto-insert-mode)
+ :config
+ (with-eval-after-load "use-package-core"
+ (add-to-list 'use-package-keywords ':auto-insert)
+ (defun use-package-normalize/:auto-insert (_name-symbol _keyword args)
+ args)
+ (defun use-package-handler/:auto-insert (name _keyword args rest state)
+ (use-package-concat
+ (use-package-process-keywords name rest state)
+ (mapcar
+ #'(lambda (arg)
+ `(add-to-list
+ 'auto-insert-alist
+ ',arg))
+ args)))))
+#+end_src
+* Programming packages
+Packages that help with programming.
+** Eldoc
+Eldoc presents documentation to the user upon placing ones cursor upon
+any symbol. This is very useful when programming as it:
+- presents the arguments of functions while writing calls for them
+- presents typing and documentation of variables
+
+Eldoc box makes the help buffer a hovering box instead of printing it
+in the minibuffer. A lot cleaner.
+
+2024-05-31: Eldoc box is a bit useless now that I'm not using frames.
+I prefer the use of the minibuffer for printing documentation now.
+
+#+begin_src emacs-lisp
+(use-package eldoc
+ :defer t
+ :hook (prog-mode-hook . eldoc-mode)
+ :init
+ (global-eldoc-mode 1)
+ :general
+ (leader
+ "h>" #'eldoc-doc-buffer))
+#+end_src
+** Flycheck
+Flycheck is the checking system for Emacs. I don't necessarily like
+having all my code checked all the time, so I haven't added a hook to
+prog-mode as it would be better for me to decide when I want checking
+and when I don't. Many times Flycheck is annoying when checking a
+program, particularly one which isn't finished yet.
+
+#+begin_src emacs-lisp
+(use-package flycheck
+ :straight t
+ :defer t
+ :commands (flycheck-mode flycheck-list-errors)
+ :general
+ (mode-leader
+ "f" #'flycheck-mode)
+ (code-leader
+ "x" #'flycheck-list-errors
+ "j" #'flycheck-next-error
+ "k" #'flycheck-previous-error)
+ :display
+ ("\\*Flycheck.*"
+ (display-buffer-at-bottom)
+ (window-height . 0.25))
+ :init
+ (setq-default flycheck-check-syntax-automatically
+ '(save idle-change mode-enabled)
+ flycheck-idle-change-delay 1.0
+ flycheck-buffer-switch-check-intermediate-buffers t
+ flycheck-display-errors-delay 0.25)
+ :config
+ (with-eval-after-load "evil-collection"
+ (evil-collection-flycheck-setup)))
+#+end_src
+** Eglot
+Eglot is package to communicate with LSP servers for better
+programming capabilities. Interactions with a server provide results
+to the client, done through JSON.
+
+NOTE: Emacs 28.1 comes with better JSON parsing, which makes Eglot
+much faster.
+
+2023-03-26: I've found Eglot to be useful sometimes, but many of the
+projects I work on don't require a heavy server setup to efficiently
+edit and check for errors; Emacs provides a lot of functionality. So
+by default I've disabled it, using =M-x eglot= to startup the LSP
+server when I need it.
+
+2024-06-27: In projects where I do use eglot and I know I will need it
+regardless of file choice, I prefer setting it at the dir-local level
+via an eval form. So I add to the safe values for the eval variable
+to be set.
+
+#+begin_src emacs-lisp
+(use-package eglot
+ :defer t
+ :general
+ (code-leader
+ :keymaps 'eglot-mode-map
+ "f" #'eglot-format
+ "a" #'eglot-code-actions
+ "R" #'eglot-reconnect)
+ :init
+ (setq eglot-auto-shutdown t
+ eglot-stay-out-of '(flymake)
+ eglot-ignored-server-capabilities '(:documentHighlightProvider
+ :documentOnTypeFormattingProvider
+ :inlayHintProvider))
+ (add-to-list 'safe-local-variable-values '(eval eglot-ensure)))
+#+end_src
+** Indentation
+By default, turn off tabs and set the tab width to two.
+
+#+begin_src emacs-lisp
+(setq-default indent-tabs-mode nil
+ tab-width 2)
+#+end_src
+
+However, if necessary later, define a function that may activate tabs locally.
+#+begin_src emacs-lisp
+(defun +oreo/use-tabs ()
+ (interactive)
+ (setq-local indent-tabs-mode t))
+#+end_src
+** Highlight todo items
+TODO items are highlighted in org-mode, but not necessarily in every
+mode. This minor mode highlights all TODO like items via a list of
+strings to match. It also configures faces to use when highlighting.
+I hook it to prog-mode.
+
+#+begin_src emacs-lisp
+(use-package hl-todo
+ :straight t
+ :after prog-mode
+ :hook (prog-mode-hook . hl-todo-mode)
+ :init
+ (setq hl-todo-keyword-faces
+ '(("TODO" . "#E50000")
+ ("WIP" . "#ffa500")
+ ("NOTE" . "#00CC00")
+ ("FIXME" . "#d02090"))))
+#+end_src
+** Hide-show mode
+Turn on ~hs-minor-mode~ for all prog-mode. This provides folds for
+free.
+
+#+begin_src emacs-lisp
+(use-package hideshow
+ :defer t
+ :hook (prog-mode-hook . hs-minor-mode))
+#+end_src
+** Aggressive indenting
+Essentially my dream editing experience: when I type stuff in, try and
+indent it for me on the fly. Just checkout the
+[[https://github.com/Malabarba/aggressive-indent-mode][page]], any
+description I give won't do it justice.
+
+#+begin_src emacs-lisp
+(use-package aggressive-indent
+ :straight t
+ :hook ((scheme-mode-hook lisp-mode-hook emacs-lisp-mode-hook)
+ . aggressive-indent-mode))
+#+end_src
+** compile-mode
+Compilation mode is an incredibly useful subsystem of Emacs which
+allows one to run arbitrary commands. If those commands produce
+errors (particularly errors that have a filename, column and line)
+compilation-mode can colourise these errors and help you navigate to
+them.
+
+Here I add some bindings and a filter which colourises the output of
+compilation mode for ANSI escape sequences; the eyecandy is certainly
+nice but it's very useful when dealing with tools that use those codes
+so you can actually read the text.
+
+#+begin_src emacs-lisp
+(use-package compile
+ :defer t
+ :display
+ ("\\*compilation\\*"
+ (display-buffer-reuse-window display-buffer-at-bottom)
+ (window-height . 0.3)
+ (reusable-frames . t))
+ :hydra
+ (move-error-hydra
+ (:hint nil) "Hydra for moving between errors"
+ ("j" #'next-error)
+ ("k" #'previous-error))
+ :general
+ (leader
+ "j" #'move-error-hydra/next-error
+ "k" #'move-error-hydra/previous-error)
+ (code-leader
+ "c" #'compile
+ "r" #'recompile)
+ (nmap
+ "M-r" #'recompile)
+ (:keymaps 'compilation-mode-map
+ "g" nil ;; by default this is recompile
+ "M-j" #'compilation-next-error
+ "M-k" #'compilation-previous-error)
+ (nmmap
+ :keymaps 'compilation-mode-map
+ "c" #'recompile)
+ :init
+ (setq compilation-scroll-output 'first-error
+ compilation-context-lines nil
+ next-error-highlight 'fringe-arrow)
+ :config
+ (add-hook 'compilation-filter-hook #'ansi-color-compilation-filter))
+#+end_src
+** xref
+Find definitions, references, and general objects using TAGS without
+external packages. Provided out of the box with Emacs, but requires a
+way of generating a =TAGS= file for your project (look at
+[[*Project.el][Project.el]] for my way of doing so). The heaviest
+lifter in a minimal setup for programming without more extensive
+systems like [[*Eglot][Eglot]].
+
+#+begin_src emacs-lisp
+(use-package xref
+ :defer t
+ :display
+ ("\\*xref\\*"
+ (display-buffer-at-bottom)
+ (inhibit-duplicate-buffer . t)
+ (window-height . 0.3))
+ :general
+ (code-leader
+ "t" #'nil)
+ (code-leader
+ :infix "t"
+ "t" #'xref-find-apropos
+ "d" #'xref-find-definitions
+ "r" #'xref-find-references)
+ (nmmap
+ :keymaps 'xref--xref-buffer-mode-map
+ "RET" #'xref-goto-xref
+ "J" #'xref-next-line
+ "K" #'xref-prev-line
+ "r" #'xref-query-replace-in-results
+ "gr" #'xref-revert-buffer
+ "q" #'quit-window))
+#+end_src
+** devdocs
+When man pages aren't enough, you need some documentation lookup
+system. [[https://devdocs.io][Devdocs]] is a great little website
+that provides a ton of documentation sets. There's an Emacs package
+for it which works well and downloads documentation sets to my
+machine, which is nice.
+
+#+begin_src emacs-lisp
+(use-package devdocs
+ :straight t
+ :defer t
+ :general
+ (file-leader
+ "d" #'devdocs-lookup))
+#+end_src
+** rainbow-delimiters
+Makes colours delimiters (parentheses) based on their depth in an
+expression. LGBTQIA+ flag in your Lisp source code.
+
+#+begin_src emacs-lisp
+(use-package rainbow-delimiters
+ :defer t
+ :straight t
+ :general
+ (mode-leader "r" #'rainbow-delimiters-mode)
+ :hook
+ ((lisp-mode-hook emacs-lisp-mode-hook racket-mode-hook)
+ . rainbow-delimiters-mode))
+#+end_src
+** Licensing
+Loads [[file:elisp/license.el][license.el]] for inserting licenses.
+Licenses are important for distribution and attribution to be defined
+clearly.
+
+#+begin_src emacs-lisp
+(use-package license
+ :demand t
+ :load-path "elisp/"
+ :general
+ (insert-leader
+ "l" #'+license/insert-copyright-notice
+ "L" #'+license/insert-complete-license))
+#+end_src
+** diff mode
+Good diff management is essentially mandatory in development. Emacs
+comes with functionality out of the box to generate, manipulate, and
+apply diffs - here I configure a small subset.
+#+begin_src emacs-lisp
+(use-package diff-mode
+ :general
+ (nmmap
+ :keymaps 'diff-mode-map
+ "J" #'diff-hunk-next
+ "K" #'diff-hunk-prev
+ "M-RET" #'diff-apply-hunk
+ "RET" #'diff-goto-source))
+#+end_src
* Languages
For a variety of (programming) languages Emacs comes with default
modes but this configures them as well as pulls any modes Emacs
doesn't come with.
+** Org mode
+Org is, at its most basic, a markup language. =org-mode= is a major
+mode for Emacs to interpret org buffers. org-mode provides a lot of
+capabilities, some are:
++ A complete table based spreadsheet system, with formulas (including
+ [[*Calculator][calc-mode]] integration)
++ Code blocks with proper syntax highlighting and editing experience
+ + Evaluation
+ + Export of code blocks to a variety of formats
+ + Export of code blocks to a code file (so called "tangling", which
+ is what occurs in this document)
++ Feature complete scheduling system with [[*Calendar][calendar]]
+ integration
+ + A clock-in system to time tasks
++ TODO system
++ Export to a variety of formats or make your own export engine using
+ the org AST.
++ Inline $\LaTeX$, with the ability to render the fragments on
+ demand within the buffer
++ Links to a variety of formats:
+ + Websites (via http or https)
+ + FTP
+ + SSH
+ + Files (even to a specific line)
+ + Info pages
+
+I'd argue this is a bit more than a markup language. Like
+[[*Magit][Magit]], some use Emacs just for this system.
+*** Org Essentials
+Org has a ton of settings to tweak, which change your experience quite
+a bit. Here are mine, but this took a lot of just reading other
+people's configurations and testing. I don't do a good job of
+explaining how this works in all honesty, but it works well for me so
+I'm not very bothered.
+
++ By default =~/Text= is my directory for text files. I actually have
+ a repository that manages this directory for agenda files and other
+ documents
++ Indentation in file should not be allowed, i.e. text indentation, as
+ that forces other editors to read it a certain way as well. It's
+ obtrusive hence it's off.
++ Org startup indented is on by default as most documents do benefit
+ from the indentation, but I do turn it off for some files via
+ ~#+startup:noindent~
++ When opening an org document there can be a lot of headings, so I
+ set folding to just content
++ Org documents can also have a lot of latex previews, which make
+ opening some after a while a massive hassle. If I want to see the
+ preview, I'll do it myself, so turn it off.
++ Org manages windowing itself, to some extent, so I set those options
+ to be as unobtrusive as possible
++ Load languages I use in =src= blocks in org-mode (Emacs-lisp for
+ this configuration, C and Python)
+
+#+begin_src emacs-lisp
+(use-package org
+ :defer t
+ :init
+ (setq org-directory "~/Text/"
+ org-adapt-indentation nil
+ org-indent-mode nil
+ org-startup-indented nil
+ org-startup-folded 'showeverything
+ org-startup-with-latex-preview nil
+ org-imenu-depth 10
+ org-src-window-setup 'current-window
+ org-indirect-buffer-display 'current-window
+ org-link-frame-setup '((vm . vm-visit-folder-other-frame)
+ (vm-imap . vm-visit-imap-folder-other-frame)
+ (file . find-file))
+ org-babel-load-languages '((emacs-lisp . t)
+ (lisp . t)
+ (shell . t))))
+#+end_src
+*** Org Latex
+Org mode has deep integration with latex, can export to PDF and even
+display latex fragments in the document directly. I setup the
+pdf-process, code listing options via minted and the format options
+for latex fragments.
+
+#+begin_src emacs-lisp
+(use-package org
+ :defer t
+ :init
+ (setq org-format-latex-options
+ '(:foreground default :background "Transparent" :scale 2
+ :html-foreground "Black" :html-background "Transparent"
+ :html-scale 1.0 :matchers ("begin" "$1" "$" "$$" "\\(" "\\["))
+ org-latex-src-block-backend 'minted
+ org-latex-minted-langs '((emacs-lisp "common-lisp")
+ (ledger "text")
+ (cc "c++")
+ (cperl "perl")
+ (shell-script "bash")
+ (caml "ocaml"))
+ org-latex-packages-alist '(("" "minted"))
+ org-latex-pdf-process
+ (list (concat "latexmk -f -bibtex -pdf "
+ "-shell-escape -%latex -interaction=nonstopmode "
+ "-output-directory=%o %f"))
+ org-latex-minted-options
+ '(("style" "colorful")
+ ("linenos")
+ ("frame" "single")
+ ("mathescape")
+ ("fontfamily" "courier")
+ ("samepage" "false")
+ ("breaklines" "true")
+ ("breakanywhere" "true"))))
+#+end_src
+*** Org Core Variables
+Tons of variables for org-mode, including a ton of latex ones. Can't
+really explain because it sets up quite a lot of local stuff. Also I
+copy pasted the majority of this, tweaking it till it felt good. Doom
+Emacs was very helpful here.
+
+#+begin_src emacs-lisp
+(use-package org
+ :defer t
+ :init
+ (setq org-edit-src-content-indentation 0
+ org-bookmark-names-plist nil
+ org-eldoc-breadcrumb-separator " → "
+ org-enforce-todo-dependencies t
+ org-export-backends '(ascii html latex odt icalendar)
+ org-fontify-quote-and-verse-blocks t
+ org-fontify-whole-heading-line t
+ org-footnote-auto-label t
+ org-hide-emphasis-markers nil
+ org-hide-leading-stars t
+ org-image-actual-width nil
+ org-imenu-depth 10
+ org-link-descriptive nil
+ org-priority-faces '((?A . error) (?B . warning) (?C . success))
+ org-refile-targets '((nil . (:maxlevel . 2)))
+ org-tags-column 0
+ org-todo-keywords '((sequence "TODO" "WIP" "DONE")
+ (sequence "PROJ" "WAIT" "COMPLETE"))
+ org-use-sub-superscripts '{}))
+#+end_src
+*** Org Core Functionality
+Hooks, prettify-symbols and records for auto insertion.
+
+#+begin_src emacs-lisp
+(use-package org
+ :defer t
+ :hook
+ (org-mode-hook . prettify-symbols-mode)
+ :display
+ ("\\*Org Src.*"
+ (display-buffer-same-window))
+ :auto-insert
+ (("\\.org\\'" . "Org skeleton")
+ "Enter title: "
+ "#+title: " str | (buffer-file-name) "\n"
+ "#+author: " (read-string "Enter author: ") | user-full-name "\n"
+ "#+description: " (read-string "Enter description: ") | "Description" "\n"
+ "#+date: " (format-time-string "%Y-%m-%d" (current-time)) "\n"
+ "* " _))
+#+end_src
+*** Org Core Bindings
+A load of bindings for org-mode which binds together a lot of
+functionality. It's best to read it yourself; to describe it is to
+write the code.
+
+#+begin_src emacs-lisp
+(use-package org
+ :defer t
+ :init
+ (with-eval-after-load "consult"
+ (general-def
+ :keymaps 'org-mode-map
+ [remap imenu] #'consult-outline))
+ :general
+ (nmmap
+ "M-F" #'org-open-at-point)
+ (nmmap
+ :keymaps 'org-mode-map
+ "TAB" #'org-cycle)
+ (file-leader
+ "l" #'org-store-link)
+ (insert-leader
+ "o" #'org-insert-last-stored-link)
+ (code-leader
+ :keymaps 'emacs-lisp-mode-map
+ "D" #'org-babel-detangle)
+ (local-leader
+ :states '(normal motion)
+ :keymaps 'org-mode-map
+ "r" #'org-list-repair
+ "d" #'org-date-from-calendar
+ "t" #'org-todo
+ "," #'org-priority
+ "T" #'org-babel-tangle
+ "i" #'org-insert-structure-template
+ "p" #'org-latex-preview
+ "s" #'org-property-action
+ "e" #'org-export-dispatch
+ "o" #'org-edit-special
+ "R" #'org-refile
+ "O" #'org-open-at-point)
+ (local-leader
+ :keymaps 'org-mode-map
+ :infix "l"
+ "i" #'org-insert-link
+ "l" #'org-open-at-point
+ "f" #'org-footnote-action)
+ (local-leader
+ :keymaps 'org-mode-map
+ :infix "'"
+ "a" #'org-table-align
+ "c" #'org-table-create
+ "f" #'org-table-edit-formulas
+ "t" #'org-table-toggle-coordinate-overlays
+ "s" #'org-table-sum
+ "e" #'org-table-calc-current-TBLFM
+ "E" #'org-table-eval-formula)
+ (local-leader
+ :keymaps 'org-src-mode-map
+ "o" #'org-edit-src-exit))
+#+end_src
+*** Org Agenda
+Org agenda provides a nice viewing for schedules. With org mode it's
+a very tidy way to manage your time.
+
+#+begin_src emacs-lisp
+(use-package org-agenda
+ :defer t
+ :init
+ (defconst +org/agenda-root "~/Text/"
+ "Root directory for all agenda files")
+ (setq org-agenda-files (list (expand-file-name +org/agenda-root))
+ org-agenda-window-setup 'current-window
+ org-agenda-skip-deadline-prewarning-if-scheduled t
+ org-agenda-skip-scheduled-if-done t
+ org-agenda-skip-deadline-if-done t
+ org-agenda-start-with-entry-text-mode nil)
+ :config
+ (evil-set-initial-state 'org-agenda-mode 'normal)
+ :general
+ (file-leader
+ "a" (proc-int
+ (--> (directory-files (car org-agenda-files))
+ (mapcar #'(lambda (x) (concat (car org-agenda-files) x)) it)
+ (completing-read "Enter directory: " it nil t)
+ (find-file it))))
+ (app-leader
+ "a" #'org-agenda)
+ (nmmap
+ :keymaps 'org-agenda-mode-map
+ "zd" #'org-agenda-day-view
+ "zw" #'org-agenda-week-view
+ "zm" #'org-agenda-month-view
+ "gd" #'org-agenda-goto-date
+ "RET" #'org-agenda-switch-to
+ "J" #'org-agenda-later
+ "K" #'org-agenda-earlier
+ "t" #'org-agenda-todo
+ "." #'org-agenda-goto-today
+ "," #'org-agenda-goto-date
+ "q" #'org-agenda-quit
+ "r" #'org-agenda-redo))
+#+end_src
+*** Org capture
+Org capture provides a system for quickly "capturing" some information
+into an org file. A classic example is creating a new TODO in a
+todo file, where the bare minimum to record one is:
++ where was it recorded?
++ when was it recorded?
++ what is it?
+Org capture provides a way to do that seamlessly without opening the
+todo file directly.
+
+#+begin_src emacs-lisp
+(use-package org-capture
+ :defer t
+ :init
+ (setq
+ org-capture-templates
+ '(("t" "Todo" entry
+ (file "general.org")
+ "* TODO %?
+%T
+%a")
+ ("q" "Quote" entry
+ (file "quotes.org")
+ "* %^{Title}
+,#+caption: %^{Origin} %t
+,#+begin_quote
+%?
+,#+end_quote")))
+ :general
+ (leader
+ "C" #'org-capture)
+ (nmmap
+ :keymaps 'org-capture-mode-map
+ "ZZ" #'org-capture-finalize
+ "ZR" #'org-capture-refile
+ "ZQ" #'org-capture-kill))
+#+end_src
+*** WAIT Org clock-in
+:PROPERTIES:
+:header-args:emacs-lisp: :tangle no :results none
+:END:
+2025-02-15: I haven't found much use for this yet but the system is
+quite expressive. If I needed time-keeping somewhere, I know where to
+go.
+
+Org provides a nice timekeeping system that allows for managing how
+much time is taken per task. It even has an extensive reporting
+system to see how much time you spend on specific tasks or overall.
+
+#+begin_src emacs-lisp
+(use-package org-clock
+ :after org
+ :general
+ (local-leader
+ :keymaps 'org-mode-map
+ :infix "c"
+ "d" #'org-clock-display
+ "c" #'org-clock-in
+ "o" #'org-clock-out
+ "r" #'org-clock-report))
+#+end_src
+*** WAIT Org ref
+:PROPERTIES:
+:header-args:emacs-lisp: :tangle no :results none
+:END:
+For bibliographic stuff in $\LaTeX$ export.
+
+#+begin_src emacs-lisp
+(use-package org-ref
+ :straight t
+ :defer t
+ :init
+ (setq bibtex-files '("~/Text/bibliography.bib")
+ bibtex-completion-bibliography '("~/Text/bibliography.bib")
+ bibtex-completion-additional-search-fields '(keywords)))
+#+end_src
+**** Org ref ivy integration
+Org ref requires ivy-bibtex to work properly with ivy, so we need to
+set that up as well
+
+#+begin_src emacs-lisp
+(use-package ivy-bibtex
+ :straight t
+ :after org-ref
+ :config
+ (require 'org-ref-ivy))
+#+end_src
+*** Org message
+Org message allows for the use of org mode when composing mails,
+generating HTML multipart emails. This integrates the WYSIWYG
+experience with mail in Emacs while also providing powerful text
+features with basically no learning curve (as long as you've already
+learnt the basics of org).
+
+#+begin_src emacs-lisp
+(use-package org-msg
+ :straight t
+ :hook
+ (message-mode-hook . org-msg-mode)
+ (notmuch-message-mode-hook . org-msg-mode)
+ :config
+ (setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t tex:dvipng"
+ org-msg-greeting-name-limit 3)
+
+ (add-to-list
+ 'org-msg-enforce-css
+ '(img latex-fragment-inline
+ ((transform . ,(format "translateY(-1px) scale(%.3f)"
+ (/ 1.0 (if (boundp 'preview-scale)
+ preview-scale 1.4))))
+ (margin . "0 -0.35em")))))
+#+end_src
+*** Org for evil
+Evil org for some nice bindings.
+
+#+begin_src emacs-lisp
+(use-package evil-org
+ :straight t
+ :defer t
+ :hook (org-mode-hook . evil-org-mode))
+#+end_src
** Makefile
Defines an auto-insert for Makefiles. Assumes C but it's very easy to
change it for C++.
@@ -4145,12 +4170,12 @@ I may disagree with some. So I use it in a mode to mode basis.
#+begin_src emacs-lisp
(use-package evil-collection
- :defer t
- :hook (after-init-hook . evil-collection-init)
+ :after evil
:straight t
:init
- (setq evil-collection-mode-list '(eww flycheck magit calendar notmuch
- ibuffer proced calc image)))
+ ;; (setq evil-collection-mode-list '(eww flycheck magit calendar notmuch
+ ;; ibuffer proced calc image))
+ )
#+end_src
*** Evil number
Increment/decrement a number at point like Vim does, but use bindings
@@ -4436,6 +4461,9 @@ itself. The only feature left is describing changes...
:general
(leader
"u" #'undo-tree-visualize)
+ (mmap
+ :keymaps 'undo-tree-visualizer-mode-map
+ "t" #'undo-tree-visualizer-toggle-timestamps)
:init
(setq undo-tree-auto-save-history t
undo-tree-history-directory-alist backup-directory-alist)
@@ -4465,8 +4493,7 @@ with abstracting a few things away.
(use-package abbrev
:defer t
:hook
- (prog-mode-hook . abbrev-mode)
- (text-mode-hook . abbrev-mode)
+ ((prog-mode-hook text-mode-hook) . abbrev-mode)
:init
(defmacro +abbrev/define-abbrevs (abbrev-table &rest abbrevs)
`(progn
@@ -4490,7 +4517,11 @@ with abstracting a few things away.
("smon"
(format-time-string "%B" (current-time)))
("swho"
- (format "%s <%s>" user-full-name user-mail-address))))
+ (format "%s <%s>" user-full-name user-mail-address))
+ ("stodo"
+ (thread-last (current-time)
+ (format-time-string "%Y-%m-%d %H:%M")
+ (format "TODO(%s)[%s]:" user-login-name)))))
#+end_src
** Amx
Amx is a fork of Smex that works to enhance the
diff --git a/Emacs/.config/emacs/elisp/elfeed-org.el b/Emacs/.config/emacs/elisp/elfeed-org.el
index 2b68acc..4416926 100644
--- a/Emacs/.config/emacs/elisp/elfeed-org.el
+++ b/Emacs/.config/emacs/elisp/elfeed-org.el
@@ -29,11 +29,12 @@
(defun elfeed-org/--parse-link (context)
(thread-last (org-element-property :title context)
search-forward)
- (let ((title-context (org-element-context)))
- (org-element-property :raw-link title-context)))
+ (org-element-property :raw-link (org-element-context)))
(defun elfeed-org/--parse-tags ()
- (mapcar #'intern (org-get-tags)))
+ (thread-last
+ (org-get-tags)
+ (mapcar #'intern)))
(defun elfeed-org/--parse-headline ()
(if-let* ((ctx (org-element-context))
@@ -43,14 +44,15 @@
nil))
(defun elfeed-org/--parse-headlines ()
- (cl-remove-if
- #'null
- (org-map-entries #'elfeed-org/--parse-headline t)))
+ (thread-last
+ (org-map-entries #'elfeed-org/--parse-headline t)
+ (cl-remove-if #'null)))
(defun elfeed-org ()
- (setq elfeed-feeds
- (with-current-buffer (find-file-noselect elfeed-org/file)
- (elfeed-org/--parse-headlines))))
+ (thread-last
+ (elfeed-org/--parse-headlines)
+ (with-current-buffer (find-file-noselect elfeed-org/file))
+ (setq elfeed-feeds)))
(provide 'elfeed-org)
;;; elfeed-org.el ends here
diff --git a/Emacs/.config/emacs/elisp/eshell-additions.el b/Emacs/.config/emacs/elisp/eshell-additions.el
index a9362db..2d53610 100644
--- a/Emacs/.config/emacs/elisp/eshell-additions.el
+++ b/Emacs/.config/emacs/elisp/eshell-additions.el
@@ -41,14 +41,23 @@
"Change to directory `project-root'"
(if (project-current)
(eshell/cd (list (project-root (project-current))))
+ (setq eshell-last-command-status 1)
(eshell/echo
(format "[%s]: No project in current directory"
(propertize "Error" 'font-lock-face '(:foreground "red"))))))
(defun eshell/sudo-switch (&rest args)
- "Switch to a tramp connection sudo in the current directory"
- (let ((wrapped-dir (concat "/sudo::" default-directory)))
- (eshell/cd wrapped-dir)))
+ "Switch to and from administrative (sudo) mode in Eshell.
+Uses tramp to figure out if we're in sudo mode or not. "
+ (let ((user (file-remote-p default-directory 'user)))
+ (cond
+ ((null user)
+ (let ((wrapped-dir (concat "/sudo::" default-directory)))
+ (eshell/cd wrapped-dir)))
+ ((string= user "root")
+ (thread-last 'localname
+ (file-remote-p default-directory)
+ eshell/cd)))))
;; Additional functions
(defun +eshell/at-cwd (&optional arg)
diff --git a/Emacs/.config/emacs/elisp/eshell-prompt.el b/Emacs/.config/emacs/elisp/eshell-prompt.el
index d0a4e91..af5c55f 100644
--- a/Emacs/.config/emacs/elisp/eshell-prompt.el
+++ b/Emacs/.config/emacs/elisp/eshell-prompt.el
@@ -19,25 +19,29 @@
;;; Commentary:
-;; We provide a function +eshell-prompt which generates a prompt on
+;; We provide a function ep which generates a prompt on
;; demand.
;;; Code:
-(defvar +eshell-prompt/user-prompt "𝜆> "
+(defvar ep/user-prompt " λ "
"Prompt for user to input.")
-(defvar +eshell-prompt/dir-colour "deepskyblue")
-(defvar +eshell-prompt/success-colour "forestgreen")
-(defvar +eshell-prompt/failure-colour "red")
+(defvar ep/dir-colour "deepskyblue")
+(defvar ep/success-colour "forestgreen")
+(defvar ep/failure-colour "red")
+(defvar ep/branch-name-colour "LightSalmon")
+(defvar ep/pipe-colour "green2")
+(defvar ep/ahead-colour "dodger blue")
+(defvar ep/remote-colour "DarkGoldenrod")
-(defun +eshell-prompt/--colour-on-last-command ()
+(defun ep/--colour-on-last-command ()
"Returns an Emacs colour based on ESHELL-LAST-COMMAND-STATUS."
(if (zerop eshell-last-command-status)
- +eshell-prompt/success-colour
- +eshell-prompt/failure-colour))
+ ep/success-colour
+ ep/failure-colour))
-(defun +eshell-prompt/--git-remote-status ()
+(defun ep/--git-remote-status ()
"Returns a propertized string for the status of a repository
in comparison to its remote. 3 differing strings are returned
dependent on:
@@ -53,17 +57,17 @@ behind or ahead the local repository is."
(status (nth 3 branch-status))
(diff (cl-position "by" branch-status :test #'string=)))
(if (null diff)
- (propertize "=" 'font-lock-face `(:foreground ,+eshell-prompt/success-colour))
+ (propertize "=" 'font-lock-face `(:foreground ,ep/success-colour))
(let ((n (nth (+ 1 diff) branch-status)))
(concat
(cond
((string= status "ahead")
- (propertize "→" 'font-lock-face '(:foreground "dodger blue")))
+ (propertize "→" 'font-lock-face `(:foreground ,ep/ahead-colour)))
((string= status "behind")
- (propertize "←" 'font-lock-face '(:foreground "red"))))
+ (propertize "←" 'font-lock-face `(:foreground ,ep/failure-colour))))
n)))))
-(defun +eshell-prompt/--git-change-status ()
+(defun ep/--git-change-status ()
"Returns a propertized string for the condition of the worktree in
a repository. If there are no changes i.e. the worktree is clean
then a green tick is returned, but if there are changes then the
@@ -74,28 +78,50 @@ number of files affected are returned in red."
(if (= changed-files 0)
(propertize "✓"
'font-lock-face
- `(:foreground ,+eshell-prompt/success-colour))
+ `(:foreground ,ep/success-colour))
(propertize (number-to-string changed-files)
'font-lock-face
- `(:foreground ,+eshell-prompt/failure-colour)))))
-
-(defun +eshell-prompt/--git-status ()
+ `(:foreground ,ep/failure-colour)))))
+
+(defun ep/--git-branch-name ()
+ "Get the branch name of the current working directory. W"
+ (let* ((branch-name (thread-last
+ (split-string (shell-command-to-string "git branch") "\n")
+ (cl-remove-if (lambda (s) (= (length s) 0)))
+ (cl-find-if (lambda (s) (string= "*" (substring s 0 1))))))
+ (branch-name (if (null branch-name) nil
+ (substring branch-name 2))))
+ (cond
+ ((null branch-name) nil)
+ ((string= "(" (substring branch-name 0 1))
+ (replace-regexp-in-string
+ "\n$" ""
+ (shell-command-to-string "git rev-parse --short HEAD")))
+ (t branch-name))))
+
+(defun ep/--git-status ()
"Returns a completely formatted string of
-form (BRANCH-NAME<CHANGES>[REMOTE-STATUS])."
- (let ((git-branch (thread-last
- (split-string (shell-command-to-string "git branch") "\n")
- (cl-remove-if (lambda (s) (= (length s) 0)))
- (cl-find-if (lambda (s) (string= "*" (substring s 0 1)))))))
+ form (BRANCH-NAME<CHANGES>[REMOTE-STATUS])."
+ (let ((git-branch (ep/--git-branch-name)))
(if (null git-branch)
""
(format
- "(%s<%s>[%s])"
- (nth 2 (split-string git-branch "\n\\|\\*\\| "))
- (+eshell-prompt/--git-change-status)
- (+eshell-prompt/--git-remote-status)))))
-
-(defun +eshell-prompt/make-prompt ()
- (let ((git (+eshell-prompt/--git-status)))
+ "%s(%s)(%s)"
+ (propertize git-branch 'font-lock-face `(:foreground ,ep/branch-name-colour))
+ (ep/--git-remote-status)
+ (ep/--git-change-status)))))
+
+(defun ep/--user-and-remote ()
+ (if (file-remote-p default-directory)
+ (let ((user (file-remote-p default-directory 'user))
+ (host (file-remote-p default-directory 'host)))
+ (if user
+ (format "%s@%s " user host)
+ (concat host " ")))
+ ""))
+
+(defun ep/make-prompt ()
+ (let ((git (ep/--git-status)))
(mapconcat
(lambda (item)
(if (listp item)
@@ -105,15 +131,26 @@ form (BRANCH-NAME<CHANGES>[REMOTE-STATUS])."
'rear-nonsticky '(font-lock-face read-only))
item))
(list
+ `("┌──"
+ :foreground ,ep/pipe-colour)
"["
- `(,(abbreviate-file-name (eshell/pwd)) :foreground ,+eshell-prompt/dir-colour)
- "]"
+ `(,(ep/--user-and-remote)
+ :foreground ,ep/remote-colour)
+ `(,(abbreviate-file-name (tramp-file-local-name (eshell/pwd)))
+ :foreground ,ep/dir-colour)
(if (string= git "")
""
- (concat " " git))
+ (concat "]─[" git))
+ "]"
"\n"
- (list "𝜆> " ':foreground (+eshell-prompt/--colour-on-last-command))))))
+ `("└─>"
+ :foreground ,ep/pipe-colour)
+ (list ep/user-prompt ':foreground (ep/--colour-on-last-command))))))
(provide 'eshell-prompt)
;;; eshell-prompt.el ends here
+
+;; Local Variables:
+;; read-symbol-shorthands: (("ep" . "+eshell-prompt"))
+;; End:
diff --git a/Emacs/.config/emacs/elisp/personal-light-theme.el b/Emacs/.config/emacs/elisp/personal-light-theme.el
index c8e4f3e..d05f880 100644
--- a/Emacs/.config/emacs/elisp/personal-light-theme.el
+++ b/Emacs/.config/emacs/elisp/personal-light-theme.el
@@ -81,6 +81,19 @@
'(org-quote ((t (:slant italic))))
'(org-verbatim ((t (:foreground "red3"))))
'(query-replace ((t (:inherit (isearch)))))
+ '(rainbow-delimiters-base-error-face ((t (:extend t :foreground "white"
+ :background "red1"))))
+ '(rainbow-delimiters-depth-1-face ((t (:extend t :foreground "red"))))
+ '(rainbow-delimiters-depth-2-face ((t (:extend t :foreground "darkorange"))))
+ '(rainbow-delimiters-depth-3-face ((t (:extend t :foreground "yellow"))))
+ '(rainbow-delimiters-depth-4-face ((t (:extend t :foreground "green"))))
+ '(rainbow-delimiters-depth-5-face ((t (:extend t :foreground "DeepSkyBlue"))))
+ '(rainbow-delimiters-depth-6-face ((t (:extend t :foreground "purple"))))
+ '(rainbow-delimiters-depth-7-face ((t (:extend t :foreground "violet"))))
+ '(rainbow-delimiters-mismatched-face ((t (:extend t :foreground "white"
+ :background "red4"))))
+ '(rainbow-delimiters-unmatched-face ((t (:extend t :foreground "white"
+ :background "red3"))))
'(region ((t (:extend t :background "#C2D5E9"))))
'(secondary-selection ((((class color) (min-colors 88) (background light)) (:extend t :background "yellow1")) (((class color) (min-colors 88) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 16) (background light)) (:extend t :background "yellow")) (((class color) (min-colors 16) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 8)) (:extend t :foreground "black" :background "cyan")) (t (:inverse-video t))))
'(shadow ((((class color grayscale) (min-colors 88) (background light))
diff --git a/Emacs/.config/emacs/elisp/personal-solarized-theme.el b/Emacs/.config/emacs/elisp/personal-solarized-theme.el
index d0b4cd9..1e2aff9 100644
--- a/Emacs/.config/emacs/elisp/personal-solarized-theme.el
+++ b/Emacs/.config/emacs/elisp/personal-solarized-theme.el
@@ -1,11 +1,13 @@
(deftheme personal-solarized
- "Created 2024-07-02.")
+ "Created 2024-07-02."
+ :background-mode 'dark)
(defvar personal-solarized-name-colour "#3c98e0"
"Colour of names in this theme.")
(custom-theme-set-faces
'personal-solarized
+ '(Info-quoted ((t (:inherit fixed-pitch-serif :underline t))))
'(button ((t (:inherit (link)))))
'(child-frame-border ((t (:background "white"))))
'(company-preview ((t (:foreground "wheat" :background "blue4"))))
@@ -21,35 +23,25 @@
'(evil-goggles-default-face ((t (:background "#004065"))))
'(evil-mc-cursor-default-face ((t (:foreground "black" :background "white"))))
'(evil-mc-region-face ((t (:extend t :background "grey50"))))
- '(fill-column-indicator ((t (:inherit shadow :foreground "gray23"
- :background "gray23" :weight thin))))
+ '(fill-column-indicator ((t (:inherit shadow :foreground "gray23" :weight thin))))
'(fixed-pitch-serif ((t (:family "Noto Serif" :height 0.95))))
'(font-latex-bold-face ((t (:weight bold :foreground "#9eacac"))))
'(font-latex-doctex-documentation-face ((t (:background unspecified))))
- '(font-latex-doctex-preprocessor-face ((t (:inherit (font-latex-doctex-documentation-face
- font-lock-builtin-face
- font-lock-preprocessor-face)))))
+ '(font-latex-doctex-preprocessor-face ((t (:inherit (font-latex-doctex-documentation-face font-lock-builtin-face font-lock-preprocessor-face)))))
'(font-latex-italic-face ((t (:style italic :foreground "#9eacac"))))
'(font-latex-math-face ((t (:foreground "#7a7ed2"))))
- '(font-latex-sectioning-0-face ((t (:inherit font-latex-sectioning-5-face
- :height 1.1))))
- '(font-latex-sectioning-1-face ((t (:inherit font-latex-sectioning-5-face
- :height 1.1))))
- '(font-latex-sectioning-2-face ((t (:inherit font-latex-sectioning-5-face
- :height 1.1))))
- '(font-latex-sectioning-3-face ((t (:inherit font-latex-sectioning-5-face
- :height 1.1))))
- '(font-latex-sectioning-4-face ((t (:inherit font-latex-sectioning-5-face
- :height 1.1))))
+ '(font-latex-sectioning-0-face ((t (:inherit font-latex-sectioning-5-face :height 1.1))))
+ '(font-latex-sectioning-1-face ((t (:inherit font-latex-sectioning-5-face :height 1.1))))
+ '(font-latex-sectioning-2-face ((t (:inherit font-latex-sectioning-5-face :height 1.1))))
+ '(font-latex-sectioning-3-face ((t (:inherit font-latex-sectioning-5-face :height 1.1))))
+ '(font-latex-sectioning-4-face ((t (:inherit font-latex-sectioning-5-face :height 1.1))))
'(font-latex-sectioning-5-face ((t (:foreground "#c49619" :weight bold))))
'(font-latex-sedate-face ((t (:foreground "#9eacac"))))
- '(font-latex-slide-title-face ((t (:inherit (default font-lock-type-face)
- :weight bold :height 1.2))))
+ '(font-latex-slide-title-face ((t (:inherit (default font-lock-type-face) :weight bold :height 1.2))))
'(font-latex-string-face ((t (:foreground "#3cafa5"))))
'(font-latex-subscript-face ((t (:height 0.8))))
'(font-latex-superscript-face ((t (:height 0.8))))
- '(font-latex-verbatim-face ((t (:inherit fixed-pitch-serif :foreground "#8d9fa1"
- :slant italic))))
+ '(font-latex-verbatim-face ((t (:inherit fixed-pitch-serif :foreground "#8d9fa1" :slant italic))))
'(font-latex-warning-face ((t (:inherit bold :foreground "#db5823"))))
'(font-lock-builtin-face ((t (:foreground "#8d9fa1" :weight bold :slant normal))))
'(font-lock-comment-delimiter-face ((t (:foreground "#62787f" :slant normal))))
@@ -64,29 +56,21 @@
'(font-lock-warning-face ((t (:inherit error :weight bold))))
'(fringe ((t (:inherit (default)))))
'(haskell-interactive-face-prompt ((t (:foreground "green"))))
- '(header-line ((t (:box nil :foreground "grey90" :background "grey20"
- :inherit (mode-line)))))
+ '(header-line ((t (:box nil :foreground "grey90" :background "grey20" :inherit (mode-line)))))
'(highlight ((t (:extend t :background "#222233"))))
'(homoglyph ((t (:foreground "cyan"))))
- '(Info-quoted ((t (:inherit fixed-pitch-serif :underline t))))
'(isearch ((t (:foreground "brown4" :background "white"))))
'(isearch-fail ((t (:background "red4"))))
'(lazy-highlight ((t (:background "paleturquoise4"))))
'(line-number ((t (:foreground "grey45" :background "grey1" :inherit (default)))))
- '(line-number-current-line ((t (:foreground "white" :background "grey1"
- :inherit (default)))))
- '(link ((t (:underline (:color foreground-color :style line)
- :foreground "cyan1"))))
+ '(line-number-current-line ((t (:foreground "white" :background "grey1" :inherit (default)))))
+ '(link ((t (:underline (:color foreground-color :style line) :foreground "cyan1"))))
'(link-visited ((t (:foreground "violet" :inherit (link)))))
'(match ((t (:background "RoyalBlue3"))))
- '(minibuffer-prompt ((t (:foreground "cyan"))))
- `(mode-line ((t (:box (:line-width 1 :color "white") :foreground "LightSkyBlue"
- :background "black" :inherit (default)))))
+ '(minibuffer-prompt ((t (:background "darkblue" :foreground "cyan"))))
'(mode-line-buffer-id ((t (:weight bold))))
'(mode-line-emphasis ((t (:weight bold))))
- '(mode-line-inactive ((t (:box (:line-width 1 :color "grey10") :weight light
- :foreground "CadetBlue" :background "grey7"
- :inherit (mode-line)))))
+ '(mode-line-inactive ((t (:box (:line-width 1 :color "grey10") :weight light :foreground "CadetBlue" :background "grey7" :inherit (mode-line)))))
'(next-error ((t (:inherit (region)))))
'(orderless-match-face-0 ((t (:weight bold :foreground "lime green"))))
'(orderless-match-face-1 ((t (:weight bold :foreground "light green"))))
@@ -94,11 +78,13 @@
'(orderless-match-face-3 ((t (:weight bold :foreground "dark green"))))
'(org-block ((t (:inherit default))))
'(org-code ((t (:foreground "green3"))))
+ '(org-document-info ((t (:height 1.2 :inherit default))))
+ '(org-document-title ((t (:height 1.2 :inherit default))))
'(org-hide ((t (:foreground "black"))))
'(org-quote ((t (:slant italic))))
'(org-verbatim ((t (:foreground "red3"))))
- '(outline-1 ((t (:inherit default :foreground "#db5823"))))
- '(outline-2 ((t (:inherit default :foreground "#93a61a"))))
+ '(outline-1 ((t (:inherit default :height 1.2 :foreground "#db5823"))))
+ '(outline-2 ((t (:inherit default :height 1.1 :foreground "#93a61a"))))
'(outline-3 ((t (:inherit default :foreground "#3c98e0"))))
'(outline-4 ((t (:inherit default :foreground "#c49619"))))
'(outline-5 ((t (:inherit default :foreground "#3cafa5"))))
@@ -106,13 +92,11 @@
'(outline-7 ((t (:inherit default :foreground "#ec423a"))))
'(outline-8 ((t (:inherit default :foreground "#3c98e0"))))
'(outline-minor-0 ((t (:extend t :weight bold :background "#01323d"))))
- '(outline-minor-1 ((t (:extend t :inherit (outline-minor-0 outline-1)
- :background "#1e9d310d32a3"))))
+ '(outline-minor-1 ((t (:extend t :inherit (outline-minor-0 outline-1) :background "#1e9d310d32a3"))))
'(pdf-isearch-batch ((t (:foreground "black" :background "white"))))
'(pretty-mode-symbol-face ((t (:foreground "#c49619" :weight normal))))
'(query-replace ((t (:inherit (isearch)))))
- '(rainbow-delimiters-base-error-face ((t (:extend t :foreground "white"
- :background "red1"))))
+ '(rainbow-delimiters-base-error-face ((t (:extend t :foreground "white" :background "red1"))))
'(rainbow-delimiters-depth-1-face ((t (:extend t :foreground "red"))))
'(rainbow-delimiters-depth-2-face ((t (:extend t :foreground "darkorange"))))
'(rainbow-delimiters-depth-3-face ((t (:extend t :foreground "yellow"))))
@@ -120,38 +104,28 @@
'(rainbow-delimiters-depth-5-face ((t (:extend t :foreground "DeepSkyBlue"))))
'(rainbow-delimiters-depth-6-face ((t (:extend t :foreground "purple"))))
'(rainbow-delimiters-depth-7-face ((t (:extend t :foreground "violet"))))
- '(rainbow-delimiters-mismatched-face ((t (:extend t :foreground "white"
- :background "red4"))))
- '(rainbow-delimiters-unmatched-face ((t (:extend t :foreground "white"
- :background "red3"))))
+ '(rainbow-delimiters-mismatched-face ((t (:extend t :foreground "white" :background "red4"))))
+ '(rainbow-delimiters-unmatched-face ((t (:extend t :foreground "white" :background "red3"))))
'(region ((t (:extend t :background "grey25"))))
'(secondary-selection ((t (:extend t :background "SkyBlue4"))))
'(shadow ((t (:foreground "grey70"))))
- '(show-paren-match ((t (:foreground unspecified :background "green4"
- :weight bold))))
- '(show-paren-mismatch ((t (:foreground "#01323d" :background "#ec1111"
- :weight bold))))
+ '(show-paren-match ((t (:foreground unspecified :background "green4" :weight bold))))
+ '(show-paren-mismatch ((t (:foreground "#01323d" :background "#ec1111" :weight bold))))
'(tab-bar ((t (:background "black"))))
- '(tab-bar-tab ((t (:background "grey5" :foreground "white"
- :box (:line-width 2 :color "grey19")))))
+ '(tab-bar-tab ((t (:background "grey5" :foreground "white" :box (:line-width 2 :color "grey19")))))
'(tab-bar-tab-inactive ((t (:background "black" :foreground "DimGrey"))))
- '(tooltip ((t (:foreground "black" :background "lightyellow"
- :inherit (variable-pitch)))))
+ '(tooltip ((t (:foreground "black" :background "lightyellow" :inherit (variable-pitch)))))
'(trailing-whitespace ((t (:background "red1"))))
'(whitespace-line ((t (:background "black" :foreground "violet"))))
'(whitespace-space ((t (:background "#171717" :foreground "black"))))
'(whitespace-tab ((t (:background "#171717" :foreground "grey40"))))
- `(font-lock-constant-face ((t (:foreground ,personal-solarized-name-colour
- :weight bold))))
- `(font-lock-function-name-face ((t (:box nil
- :foreground ,personal-solarized-name-colour))))
+ `(font-lock-constant-face ((t (:foreground ,personal-solarized-name-colour :weight bold))))
+ `(font-lock-function-name-face ((t (:box nil :foreground ,personal-solarized-name-colour))))
`(font-lock-preprocessor-face ((t (:foreground ,personal-solarized-name-colour))))
`(font-lock-variable-name-face ((t (:foreground ,personal-solarized-name-colour))))
- '(default ((t (:family "Jetbrains Mono" :foundry "ADBO" :width normal
- :weight normal :slant normal :underline nil
- :overline nil :extend nil :strike-through nil
- :box nil :inverse-video nil
- :foreground "#b6b6b6" :background "#0a0a0a"
- :stipple nil :inherit nil)))))
+ `(mode-line ((t (:box (:line-width 1 :color "white") :foreground "LightSkyBlue" :background "black" :inherit (default)))))
+ `(org-block-begin-line ((t (:underline t :background "#1a1a1a"))))
+ `(org-block-end-line ((t (:overline t :background "#1a1a1a"))))
+ '(default ((t (:family "Jetbrains Mono" :foundry "ADBO" :width normal :weight normal :slant normal :underline nil :overline nil :extend nil :strike-through nil :box nil :inverse-video nil :foreground "#b6b6b6" :background "#0a0a0a" :stipple nil :inherit nil)))))
(provide-theme 'personal-solarized)
diff --git a/Emacs/.config/emacs/straight/versions/default.el b/Emacs/.config/emacs/straight/versions/default.el
index f9a3d48..f536692 100644
--- a/Emacs/.config/emacs/straight/versions/default.el
+++ b/Emacs/.config/emacs/straight/versions/default.el
@@ -6,6 +6,7 @@
("amx" . "5b3aa1aae84f4a225cb8d26ab79a32f97693f023")
("annalist.el" . "134fa3f0fb91a636a1c005c483516d4b64905a6d")
("avy" . "be612110cb116a38b8603df367942e2bb3d9bdbe")
+ ("benchmark-init-el" . "6507caa3c4cb2a6c9b85c771c5e9e5aeb7d745bc")
("closql" . "dc7924c1d206483a2555a98470c96fadf419f32d")
("company-mode" . "7c24dc8668af5aea8a5d07aeceda5fac7a2a85b5")
("compat" . "9428a64eb8a579f35d57bc4d4cdb6c5cf10806c1")
@@ -19,7 +20,6 @@
("elfeed" . "a39fb78e34ee25dc8baea83376f929d7c128344f")
("elisp-refs" . "bf3cca8f74065b1b31036f461e3a093b162311bd")
("emacs-htmlize" . "dd27bc3f26efd728f2b1f01f9e4ac4f61f2ffbf9")
- ("emacs-libvterm" . "988279316fc89e6d78947b48513f248597ba969a")
("emacs-lorem-ipsum" . "4e87a899868e908a7a9e1812831d76c8d072f885")
("emacs-powerthesaurus" . "4b97797cf789aaba411c61a85fe23474ebc5bedc")
("emacs-request" . "c22e3c23a6dd90f64be536e176ea0ed6113a5ba6")
@@ -27,7 +27,7 @@
("emacsql" . "5470adaf5dcabebc80c913ac831258fd47a87cbe")
("embark" . "d5df0eff182b014ab49328a4dbb1d69eb7faafbd")
("emmet-mode" . "322d3bb112fced57d63b44863357f7a0b7eee1e3")
- ("empv.el" . "4c660fe44f7ea562896924ce9de28cd37ef15a38")
+ ("empv.el" . "f14d4ac96e24368ad4688efc4a71da39804892f0")
("epl" . "78ab7a85c08222cd15582a298a364774e3282ce6")
("eshell-syntax-highlighting" . "fa1d368452ebd11727d267076ae568b892fa9cb9")
("evil" . "c222ce1ea6fbefaed08308c061371ebdf01b078f")
@@ -42,7 +42,7 @@
("f.el" . "931b6d0667fe03e7bf1c6c282d6d8d7006143c52")
("fd-dired" . "458464771bb220b6eb87ccfd4c985c436e57dc7e")
("flycheck" . "773c3eb31ebeb6bb2f9f57d28177882ca7073df0")
- ("forge" . "64d02997dc8f2e86037bc8467a18ef5279d945a7")
+ ("forge" . "8e4dd7ed05212abb3f5318d1f2de5ef880d0d848")
("geiser" . "97ce88463f346ff0dab147334fa0ce7b81569d7c")
("general.el" . "833dea2c4a60e06fcd552b653dfc8960935c9fb4")
("ghub" . "7467c905cd11199538e96403d1c58ae3b268d852")
@@ -58,7 +58,7 @@
("jira.el" . "961ef56406980958f345a9265970b7100b0e92a4")
("let-alist" . "021fc10df2e44faba4728d849ee767cf890aa51a")
("llama" . "48e5bc4919a4a29665362832d59ade8e248b0c3e")
- ("magit" . "95ee9d8c5102bc5619f0e2c6d50104cae17b2009")
+ ("magit" . "75c61919994a23494152f726102898456a6055b7")
("markdown-mode" . "6102ac5b7301b4c4fc0262d9c6516693d5a33f2b")
("melpa" . "922cce631e17b7978c5d711569abf151c3301b35")
("nasm-mode" . "7079eb4ce14d94830513facf9bf2fca9e030a4d1")
@@ -83,7 +83,7 @@
("smartparens" . "79a338db115f441cd47bb91e6f75816c5e78a772")
("straight.el" . "88e574ae75344e39b436f863ef0344135c7b6517")
("tablist" . "fcd37147121fabdf003a70279cf86fbe08cfac6f")
- ("transient" . "c7845bfd9f3b9ec76c491e9791001a5f7438d835")
+ ("transient" . "41b6e06cf56c029465fae72dc4c6e16cfd304e47")
("treepy.el" . "651e2634f01f346da9ec8a64613c51f54b444bc3")
("typescript.el" . "fc3a4f3b275e8cf6cf41aa0c9ef42e25ef908feb")
("undo-tree" . "16f4121032d09ef44b3d7d02c4d02c3c2f18041f")