aboutsummaryrefslogtreecommitdiff
path: root/Emacs/.config/emacs/config.org
diff options
context:
space:
mode:
Diffstat (limited to 'Emacs/.config/emacs/config.org')
-rw-r--r--Emacs/.config/emacs/config.org304
1 files changed, 135 insertions, 169 deletions
diff --git a/Emacs/.config/emacs/config.org b/Emacs/.config/emacs/config.org
index 04c6ac7..020a382 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; -*-
@@ -99,12 +100,7 @@ Let's setup a few absolute essentials:
warning-minimum-level :error)
:config
(fset 'yes-or-no-p 'y-or-n-p)
- (global-auto-revert-mode)
- (let ((font-size (pcase (system-name)
- ("rhmaiden" 150)
- (_ 120))))
- (set-face-attribute 'default nil :height font-size)
- (set-face-attribute 'mode-line nil :height font-size)))
+ (global-auto-revert-mode))
#+end_src
* Custom functionality and libraries
This is custom Lisp that I or someone else has written which I really
@@ -263,20 +259,18 @@ 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))
- (* (+oreo/--font-multiplier))
- floor)))
- (set-face-attribute 'default nil :height font-size)
- (set-face-attribute 'mode-line nil :height font-size)))
+ (-->
+ (* (pcase (system-name) ; get a fixed base value based on the machine
+ ("rhmaiden" 140)
+ (_ 120))
+ (pcase (display-pixel-width) ; get a multiplier based on resolution
+ ((pred (>= 1920)) 0.9)
+ ((pred (>= 2560)) 1.24)))
+ floor
+ (progn
+ (set-face-attribute 'default nil :height it)
+ (set-face-attribute 'mode-line nil :height it))))
(add-to-list 'enable-theme-functions #'+oreo/font-reset)
#+end_src
@@ -403,6 +397,11 @@ global scope, namely:
:keymaps 'override
:prefix "SPC d")
+ (general-create-definer org-leader
+ :states '(normal motion)
+ :keymaps 'override
+ :prefix "SPC o")
+
(general-create-definer general-nmmap
:states '(normal motion))
@@ -733,8 +732,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
@@ -765,7 +764,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 "#"
@@ -788,7 +787,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
@@ -796,7 +801,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
@@ -949,25 +958,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
@@ -1130,10 +1134,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
@@ -1144,7 +1154,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
@@ -1965,7 +1976,6 @@ most distribution nowadays.
:general
(search-leader
"g" #'grep-this-file
- "c" #'grep-config-file
"d" #'rgrep)
(nmmap
:keymaps 'grep-mode-map
@@ -1982,23 +1992,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
@@ -2012,7 +2017,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
@@ -2093,14 +2098,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
@@ -2705,11 +2710,10 @@ 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))
+ :hook ((scheme-mode-hook lisp-mode-hook emacs-lisp-mode-hook)
+ . aggressive-indent-mode))
#+end_src
-** Compilation
+** 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)
@@ -2758,12 +2762,12 @@ so you can actually read the text.
(add-hook 'compilation-filter-hook #'ansi-color-compilation-filter))
#+end_src
** xref
-Find definitions, references and general objects using tags without
+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]].
+[[*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
@@ -2792,11 +2796,10 @@ like [[*Eglot][Eglot]].
#+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.
+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
@@ -2808,7 +2811,7 @@ is nice.
#+end_src
** rainbow-delimiters
Makes colours delimiters (parentheses) based on their depth in an
-expression. Rainbow flag in your Lisp source code.
+expression. LGBTQIA+ flag in your Lisp source code.
#+begin_src emacs-lisp
(use-package rainbow-delimiters
@@ -2817,7 +2820,8 @@ expression. Rainbow flag in your Lisp source code.
:general
(mode-leader "r" #'rainbow-delimiters-mode)
:hook
- ((lisp-mode-hook emacs-lisp-mode-hook racket-mode-hook) . rainbow-delimiters-mode))
+ ((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.
@@ -2879,52 +2883,6 @@ capabilities, some are:
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
@@ -2961,18 +2919,26 @@ for latex fragments.
("breaklines" "true")
("breakanywhere" "true"))))
#+end_src
-*** Org Core Variables
+*** Org 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.
+really explain because it sets up quite a lot of local stuff. Look at
+the [[info:org#Top][org Info]] document for information regarding
+this.
+
+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
+ (setq org-adapt-indentation nil
+ org-babel-load-languages '((emacs-lisp . t)
+ (lisp . t)
+ (shell . t))
org-bookmark-names-plist nil
+ org-directory "~/Text/"
+ org-edit-src-content-indentation 0
org-eldoc-breadcrumb-separator " → "
org-enforce-todo-dependencies t
org-export-backends '(ascii html latex odt icalendar)
@@ -2983,15 +2949,25 @@ Emacs was very helpful here.
org-hide-leading-stars t
org-image-actual-width nil
org-imenu-depth 10
+ org-imenu-depth 10
+ org-indent-mode nil
+ org-indirect-buffer-display 'current-window
org-link-descriptive nil
+ org-link-frame-setup '((vm . vm-visit-folder-other-frame)
+ (vm-imap . vm-visit-imap-folder-other-frame)
+ (file . find-file))
org-priority-faces '((?A . error) (?B . warning) (?C . success))
org-refile-targets '((nil . (:maxlevel . 2)))
+ org-src-window-setup 'current-window
+ org-startup-folded 'showeverything
+ org-startup-indented nil
+ org-startup-with-latex-preview nil
org-tags-column 0
org-todo-keywords '((sequence "TODO" "WIP" "DONE")
(sequence "PROJ" "WAIT" "COMPLETE"))
org-use-sub-superscripts '{}))
#+end_src
-*** Org Core Functionality
+*** Org Functionality
Hooks, prettify-symbols and records for auto insertion.
#+begin_src emacs-lisp
@@ -3011,7 +2987,7 @@ Hooks, prettify-symbols and records for auto insertion.
"#+date: " (format-time-string "%Y-%m-%d" (current-time)) "\n"
"* " _))
#+end_src
-*** Org Core Bindings
+*** Org 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.
@@ -3025,18 +3001,19 @@ write the code.
:keymaps 'org-mode-map
[remap imenu] #'consult-outline))
:general
- (nmmap
- "M-F" #'org-open-at-point)
+ (leader
+ ";" #'org-agenda)
+
+ (org-leader
+ "l" #'org-store-link
+ "d" #'org-babel-detangle
+ "i" #'org-insert-last-stored-link
+ "o" #'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
@@ -3052,12 +3029,14 @@ write the code.
"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 "'"
@@ -3068,6 +3047,7 @@ write the code.
"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))
@@ -3080,25 +3060,20 @@ a very tidy way to manage your time.
(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
+ (setq 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)
+ org-agenda-start-with-entry-text-mode nil
+ org-agenda-span 'day)
: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)
+ (--> org-agenda-files
+ (completing-read "Enter file: " it nil t)
+ (find-file it))))
(nmmap
:keymaps 'org-agenda-mode-map
"zd" #'org-agenda-day-view
@@ -3114,7 +3089,7 @@ a very tidy way to manage your time.
"q" #'org-agenda-quit
"r" #'org-agenda-redo))
#+end_src
-*** Org capture
+*** 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:
@@ -3129,10 +3104,9 @@ todo file directly.
:defer t
:init
(setq
- org-default-notes-file (concat org-directory "todo.org")
org-capture-templates
'(("t" "Todo" entry
- (file "")
+ (file "general.org")
"* TODO %?
%T
%a")
@@ -3144,15 +3118,15 @@ todo file directly.
%?
,#+end_quote")))
:general
- (leader
- "C" #'org-capture)
+ (org-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
+*** WAIT Org Clock-in
:PROPERTIES:
:header-args:emacs-lisp: :tangle no :results none
:END:
@@ -3176,7 +3150,7 @@ system to see how much time you spend on specific tasks or overall.
"o" #'org-clock-out
"r" #'org-clock-report))
#+end_src
-*** WAIT Org ref
+*** WAIT Org Ref
:PROPERTIES:
:header-args:emacs-lisp: :tangle no :results none
:END:
@@ -3191,18 +3165,7 @@ For bibliographic stuff in $\LaTeX$ export.
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
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
@@ -3227,7 +3190,7 @@ learnt the basics of org).
preview-scale 1.4))))
(margin . "0 -0.35em")))))
#+end_src
-*** Org for evil
+*** Org for Evil
Evil org for some nice bindings.
#+begin_src emacs-lisp
@@ -4488,8 +4451,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
@@ -4513,7 +4475,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