Files
nixos/configs/emacs/config.org
T
2025-08-22 11:55:03 -04:00

25 KiB

#+TITLE:LM's Emacs Config

IMPORTANT PROGRAMS TO LOAD FIRST

Elpaca Package Manager

(defvar elpaca-installer-version 0.6)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
			:ref nil
			:files (:defaults (:exclude "extensions"))
			:build (:not elpaca--activate-package)))
(let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
 (build (expand-file-name "elpaca/" elpaca-builds-directory))
 (order (cdr elpaca-order))
 (default-directory repo))
  (add-to-list 'load-path (if (file-exists-p build) build repo))
  (unless (file-exists-p repo)
    (make-directory repo t)
    (when (< emacs-major-version 28) (require 'subr-x))
    (condition-case-unless-debug err
  (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
	   ((zerop (call-process "git" nil buffer t "clone"
				 (plist-get order :repo) repo)))
	   ((zerop (call-process "git" nil buffer t "checkout"
				 (or (plist-get order :ref) "--"))))
	   (emacs (concat invocation-directory invocation-name))
	   ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
				 "--eval" "(byte-recompile-directory \".\" 0 'force)")))
	   ((require 'elpaca))
	   ((elpaca-generate-autoloads "elpaca" repo)))
      (kill-buffer buffer)
    (error "%s" (with-current-buffer buffer (buffer-string))))
((error) (warn "%s" err) (delete-directory repo 'recursive))))
  (unless (require 'elpaca-autoloads nil t)
    (require 'elpaca)
    (elpaca-generate-autoloads "elpaca" repo)
    (load "./elpaca-autoloads")))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))

;; Install use-package support
(elpaca elpaca-use-package
  ;; Enable :elpaca use-package keyword.
  (elpaca-use-package-mode)
  ;; Assume :elpaca t unless otherwise specified.
  (setq elpaca-use-package-by-default t))

;; Block until current queue processed.
(elpaca-wait)

;;When installing a package which modifies a form used at the top-level
;;(e.g. a package which adds a use-package key word),
;;use `elpaca-wait' to block until that package has been installed/configured.
;;For example:
;;(use-package general :demand t)
;;(elpaca-wait)

;;Turns off elpaca-use-package-mode current declartion
;;Note this will cause the declaration to be interpreted immediately (not deferred).
;;Useful for configuring built-in emacs features.
;;(use-package emacs :elpaca nil :config (setq ring-bell-function #'ignore))

;; Don't install anything. Defer execution of BODY
;;(elpaca nil (message "deferred"))

Load Evil Mode

  ;; Expands to: (elpaca evil (use-package evil :demand t))
  (use-package evil
      :bind (:map evil-normal-state-map
                  ("<C-u>" . evil-scroll-page-up))
      :init      ;; tweak evil's configuration before loading it
      (setq evil-want-integration t) ;; This is optional since it's already set to t by default.
      (setq evil-respect-visual-line-mode t)
      (setq evil-want-keybinding nil)
      (setq evil-vsplit-window-right t)
      (setq evil-split-window-below t)
      (evil-mode))
    (use-package evil-collection
      :after evil
      :config
      (setq evil-collection-mode-list '(dashboard dired ibuffer))
      (evil-collection-init))

General Keybindings

  (use-package general
      :config
      (general-evil-setup)
      ;; set 'SPC' as global leader key
      (general-create-definer lm/leader-keys
        :states '(normal insert visual emacs)
        :keymaps 'override
        :prefix "SPC" ;; set leader
        :global-prefix "M-SPC") ;; access leader in insert mode

      (lm/leader-keys
          "b" '(:ignore t :wk "buffer")
          "b b" '(switch-to-buffer :wk "Switch buffer")
          "b i" '(ibuffer :wk "Ibuffer")
          "b k" '(kill-this-buffer :wk "Kill this buffer")
          "b n" '(next-buffer :wk "Next buffer")
          "b p" '(previous-buffer :wk "Previous buffer")
          "b r" '(revert-buffer :wk "Reload buffer"))

      (lm/leader-keys
          "e" '(:ignore t :wk "Eshell/Evaluate")
          "e b" '(eval-buffer :wk "Evaluate elisp in buffer")
          "e d" '(eval-defun :wk "Evaluate defun containing or after point")
          "e e" '(eval-expression :wk "Evaluate an elisp expression")
          "e l" '(eval-last-sexp :wk "Evaluate elisp expression before point")
          "e r" '(eval-region :wk "Evaluate elisp in region")
          "e h" '(counsel-esh-history :wk "Eshell history")
          "e s" '(eshell :wk "Eshell"))

      (lm/leader-keys
          "SPC" '(counsel-M-x :wk "Counsel M-x")
          "." '(find-file :wk "Find file")
          "f c" '((lambda () (interactive) (find-file "~/personal/nixos/configs/emacs/config.org")) :wk "Edit emacs config")
          "f r" '(counsel-recentf :wk "Find recent files")
          "TAB TAB" '(comment-line :wk "Comment lines"))

      (lm/leader-keys
          "h" '(:ignore t :wk "Help")
          "h f" '(describe-function :wk "Describe function")
          "h v" '(describe-variable :wk "Describe variable")
          "h r r" '(reload-init-file :wk "Reload emacs config"))
          ;; "h r r" '((lambda () (interactive) (load-file user-init-file)) :wk "Reload emacs config"))

      ;; (lm/leader-keys
      ;;     "i" '(:ignore t :wk "Insert")
      ;;     "i p" '(org-download-screenshot :wk "Insert screenshot (org)"))

      (lm/leader-keys
          "t" '(:ignore t :wk "Toggle")
          "t l" '(display-line-numbers-mode :wk "Toggle line numbers")
          "t i" '(org-toggle-inline-images :wk "Toggle inline images")
          "t t" '(visual-line-mode :wk "Toggle truncated lines"))

      (lm/leader-keys
          "s" '(:ignore t :wk "Shell")
          "s c" '(shell-command :wk "Run a shell command")
          "s d" '(sh-cd-here :wk "Move current shell to current dir")
          "s m" '(sh-mode :wk "Shell mode"))

      (lm/leader-keys
          "c" '(:ignore t :wk "Capitalize")
          "c w" '(capitalize-word :wk "Capitalize word")
          "c r" '(capitalize-region :wk "Capitalize region")
          "c c" '(upcase-char :wk "Upcase char")
          "c u" '(upcase-region :wk "Upcase region"))

      (lm/leader-keys
          "l" '(:ignore t :wk "Downcase")
          "l w" '(downcase-word :wk "Downcase word")
          "l u" '(downcase-region :wk "Downcase region"))

      ;; Evil window bindings
      (lm/leader-keys
          "w" '(:ignore t :wk "Window")
          "w w" '(evil-window-next :wk "Next window")
          "w h" '(evil-window-left :wk "Move cursor to window left")
          "w j" '(evil-window-down :wk "Move cursor to window below")
          "w k" '(evil-window-up :wk "Move cursor to window above")
          "w l" '(evil-window-right :wk "Move cursor to window right")
          "w s" '(evil-window-split :wk "Split window horizontally")
          "w v" '(evil-window-vsplit :wk "Split window vertically")
          "w H" '(evil-window-move-far-left :wk "Move split to left")
          "w J" '(evil-window-move-very-bottom :wk "Move split to bottom")
          "w K" '(evil-window-move-very-top :wk "Move split to top")
          "w L" '(evil-window-move-far-right :wk "Move split to right")
          "w >" '(evil-window-increase-width :wk "Increase window width")
          "w ." '(evil-window-increase-width :wk "Increase window width")
          "w <" '(evil-window-decrease-width :wk "Increase window width")
          "w ," '(evil-window-decrease-width :wk "Increase window width")
          "w c" '(evil-window-delete :wk "Close window")
          "w o" '(delete-other-windows :wk "Delete other windows")
          "w =" '(balance-windows :wk "Balance windows")
          "q k" '(kill-buffer-and-window :wk "Kill buf and window")
          "q q" '(save-buffers-kill-terminal :wk "Save bufs, kill term"))

      ;; (evil-global-set-key 'visual "K" (kbd ":m '<-2 RET gv '< gk")) 
      (evil-global-set-key 'visual "K" 'drag-stuff-up) 
      ;; (evil-global-set-key 'visual "J" (kbd ":m '>+1 RET gv '> gj")) 
      (evil-global-set-key 'visual "J" 'drag-stuff-down)

      (lm/leader-keys
         "p" '(:ignore t :wk "Project")
         "p o" '(dashboard-open :wk "Return to dashboard")
         "p f" '(project-find-file :wk "Find project file"))

  )

ALL THE ICONS

  (use-package all-the-icons
      :ensure t
      :diminish
      :if (display-graphic-p))
  (use-package all-the-icons-dired
      :hook (dired-mode . (lambda () (all-the-icons-dired-mode t))))

AUTOSAVE

(setq backup-directory-alist
      `((".*" . "~/emacs/auto-saves")))
(setq auto-save-file-name-transforms
      `((".*" "~/emacs/auto-saves" t)))

COMPANY

  (use-package company
    :defer 2
    :diminish
    :custom
    (company-begin-commands '(self-insert-command))
    (company-idle-delay .1)
    (company-minimum-prefix-length 2)
    (company-show-numbers t)
    (company-tooltip-align-annotations 't)
    (global-company-mode t))

  (use-package company-box
    :after company
    :diminish
    :hook (company-mode . company-box-mode))

DASHBOARD

    (use-package dashboard
        :ensure t
        :diminish
        :init
        (setq initial-buffer-choice 'dashboard-open)
        (setq dashboard-set-heading-icons t)
        ;; (setq dashboard-set-navigator t)
        (setq dashboard-set-file-icons t)
        (setq dashboard-banner-logo-title "Welcome to Emacs!")
        (setq dashboard-startup-banner 'logo) ;; default logo
        (setq dashboard-center-content t)
        (setq dashboard-items '((recents . 5)
                                (agenda . 5)
                                (bookmarks . 3)
                                (projects . 3)))
        :config
        (dashboard-setup-startup-hook))

DIMINISH

This package implements hiding or abbreviation of the modeline displays (lighters) of minor-modes. With this package installed, you can add ':diminish' to any use-package block to hide that particular mode in the modeline.

(use-package diminish)

DRAG-STUFF

  (use-package drag-stuff
      :diminish
      :config
  (drag-stuff-global-mode 1))

FLYCHECK

Install luacheck from your Linux distro's repositories for flycheck to work correctly with lua files. Install python-pylint for flycheck to work with python files. Haskell works with flycheck as long as haskell-ghc or haskell-stack-ghc is installed. For more information on language support for flycheck, read this.

(use-package flycheck
  :ensure t
  :defer t
  :diminish
  :init (global-flycheck-mode))

FONTS

Defining the various fonts emacs will use

Setting The Font Face

(set-face-attribute 'default nil
      :font "FiraCodeNerdFontMono"
      :height 110
      :weight 'medium)
    (set-face-attribute 'variable-pitch nil
      :font "FiraCodeNerdFontMono"
      :height 120
      :weight 'medium)
    (set-face-attribute 'fixed-pitch nil
      :font "FiraCodeNerdFontMono"
      :height 130
      :weight 'medium)

    ;; Makes commented text and keywords italics.
    ;; This is working in emacsclient but not emacs.
    ;; Your font must have an italic face available.
    (set-face-attribute 'font-lock-comment-face nil
      :slant 'italic)
    (set-face-attribute 'font-lock-keyword-face nil
      :slant 'italic)
    ;; This sets the default font on all graphical frames created after restarting Emacs.
    ;; Does the same thing as 'set-face-attribute default' above, but emacsclient fonts
    ;; are not right unless I also add this method of setting the default font.
    (add-to-list 'default-frame-alist '(font . "FiraCodeNerdFontMono-15"))

    ;; UNCOMMENT THE FOLLOWING LINE IF LINE SPACING NEEDS ADJUSTING.
    ;; (SETQ-DEFAULT LINE-SPACING 0.12)

ZOOM IN/OUT

ENABLE ZOOM IN/OUT WITH C-=/- AND ALSO FOR C-SCRL-UP/DOWN

(GLOBAL-SET-KEY (KBD "C-=") 'TEXT-SCALE-INCREASE) 
(GLOBAL-SET-KEY (KBD "C--") 'TEXT-SCALE-DECREASE)
(GLOBAL-SET-KEY (KBD "<C-WHEEL-UP>") 'TEXT-SCALE-INCREASE)
(GLOBAL-SET-KEY (KBD "<C-WHEEL-DOWN>") 'TEXT-SCALE-DECREASE)

GNUPLOT

  (USE-PACKAGE GNUPLOT-MODE)
  ;; AUTOMATICALLY OPEN FILES ENDING WITH .GP OR .GNUPLOT IN GNUPLOT MODE
  ;; (SETQ AUTO-MODE-ALIST 
  ;; (APPEND '(("\\.\\(GP\\|GNUPLOT\\)$" . GNUPLOT-MODE)) AUTO-MODE-ALIST)))

IMAGE DIR-ED

  (USE-PACKAGE IMAGE-DIRED+)

INDENTING/TABS

  (SETQ-DEFAULT INDENT-TABS-MODE NIL)
  (SETQ-DEFAULT TAB-WIDTH 2)
  (SETQ-DEFAULT INDENT-LINE-FUNCTION 'INSERT-TAB)
  (SETQ-DEFAULT C-DEFAULT-STYLE "LINUX"
                C-BASIC-OFFSET 2)
 ;; IF INDENT-TABS-MODE IS OFF, UNTABIFY BEFORE SAVING
 ;;(ADD-HOOK 'WRITE-FILE-HOOKS 
 ;;         (LAMBDA () (IF (NOT INDENT-TABS-MODE)
 ;;                        (UNTABIFY (POINT-MIN) (POINT-MAX)))))

LIGATURES

;; THIS ASSUMES YOU'VE INSTALLED THE PACKAGE VIA MELPA.
(USE-PACKAGE LIGATURE
  :CONFIG
  ;; ENABLE THE "WWW" LIGATURE IN EVERY POSSIBLE MAJOR MODE
  (LIGATURE-SET-LIGATURES 'T '("WWW"))
  ;; ENABLE TRADITIONAL LIGATURE SUPPORT IN EWW-MODE, IF THE
  ;; `VARIABLE-PITCH' FACE SUPPORTS IT
  (LIGATURE-SET-LIGATURES 'EWW-MODE '("FF" "FI" "FFI"))
  ;; ENABLE ALL CASCADIA CODE LIGATURES IN PROGRAMMING MODES
  (LIGATURE-SET-LIGATURES 'PROG-MODE '("|||>" "<|||" "<==>" "<!--" "####" "~~>" "***" "||=" "||>"
                                       ":::" "::=" "=:=" "===" "==>" "=!=" "=>>" "=<<" "=/=" "!=="
                                       "!!." ">=>" ">>=" ">>>" ">>-" ">->" "->>" "-->" "---" "-<<"
                                       "<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->"
                                       "<--" "<-<" "<<=" "<<-" "<<<" "<+>" "</>" "###" "#_(" "..<"
                                       "..." "+++" "/==" "///" "_|_" "WWW" "&&" "^=" "~~" "~@" "~="
                                       "~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|"
                                       "[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:"
                                       ">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:"
                                       "<$" "<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#=" "#!"
                                       "##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?" "+>" "++" "?:"
                                       "?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)"
                                       "\\\\" "://"))
  ;; ENABLES LIGATURE CHECKS GLOBALLY IN ALL BUFFERS. YOU CAN ALSO DO IT
  ;; PER MODE WITH `LIGATURE-MODE'.
  (GLOBAL-LIGATURE-MODE T))

MARKDOWN MODE

(USE-PACKAGE MARKDOWN-MODE
  :ENSURE T
  :MODE ("README\\.MD\\'" . GFM-MODE)
  :INIT (SETQ MARKDOWN-COMMAND "MULTIMARKDOWN"))

ORG DOWNLOAD

(USE-PACKAGE ORG-DOWNLOAD
  :AFTER ORG
  :DEFER NIL
  :CUSTOM
  (ORG-DOWNLOAD-METHOD 'DIRECTORY)
  (ORG-DOWNLOAD-IMAGE-DIR "~/EMACS/IMAGES/")
  (ORG-DOWNLOAD-HEADING-LVL 0)
  (ORG-DOWNLOAD-TIMESTAMP "ORG_%Y%M%D-%H%M%S_")
  (ORG-IMAGE-ACTUAL-WIDTH 400)
  (ORG-DOWNLOAD-SCREENSHOT-METHOD "WAYLAND_DISPLAY=WAYLAND-1 WL-PASTE -T IMAGE/PNG > '%S'.PNG")
  :BIND
  ("C-M-Y" . ORG-DOWNLOAD-SCREENSHOT)
  :CONFIG
  (REQUIRE 'ORG-DOWNLOAD))

PULSE

PULSE HIGHLIGHT A LINE ON CERTAIN ACTIONS

PDF TOOLS

  (USE-PACKAGE PDF-TOOLS)

PROJECTILE

PROJECTILE IS A PROJECT INTERACTION LIBRARY FOR EMACS.

  (USE-PACKAGE PROJECTILE
    :DIMINISH
    :CONFIG
    (PROJECTILE-MODE 1))

RAINBOW MODE

DISPLAY THE ACTUAL COLOR AS A BACKGROUND FOR ANY HEX COLOR VALUE (EX. #FFFFFF). THE CODE BLOCK BELOW ENABLES RAINBOW-MODE IN ALL PROGRAMMING MODES (PROG-MODE) AS WELL AS ORG-MODE, WHICH IS WHY RAINBOW WORKS IN THIS DOCUMENT.

  (USE-PACKAGE RAINBOW-MODE
    :DIMINISH
    :HOOK 
    ((ORG-MODE PROG-MODE) . RAINBOW-MODE))

RELOAD EMACS

THIS IS JUST AN EXAMPLE OF HOW TO CREATE A SIMPLE FUNCTION IN EMACS. USE THIS FUNCTION TO RELOAD EMACS AFTER ADDING CHANGES TO THE CONFIG. YES, I AM LOADING THE USER-INIT-FILE TWICE IN THIS FUNCTION, WHICH IS A HACK BECAUSE FOR SOME REASON, JUST LOADING THE USER-INIT-FILE ONCE DOES NOT WORK PROPERLY.

  (DEFUN RELOAD-INIT-FILE ()
    (INTERACTIVE)
    (LOAD-FILE USER-INIT-FILE)
    (LOAD-FILE USER-INIT-FILE))

SHELLS AND TERMINALS

ESHELL

  (USE-PACKAGE ESHELL-SYNTAX-HIGHLIGHTING
      :AFTER ESH-MODE
      :CONFIG
      (ESHELL-SYNTAX-HIGHLIGHTING-GLOBAL-MODE +1))

      (SETQ ESHELL-RC-SCRIPT (CONCAT USER-EMACS-DIRECTORY "ESHELL/PROFILE")
        ESHELL-ALIASES-FILE (CONCAT USER-EMACS-DIRECTORY "ESHELL/ALIASES")
        ESHELL-HISTORY-SIZE 5000
        ESHELL-BUFFER-MAXIMUM-LINES 5000
        ESHELL-HIST-IGNOREDUPS T
        ESHELL-SCROLL-TO-BOTTOM-ON-INPUT T
        ESHELL-DESTROY-BUFFER-WHEN-PROCESS-DIES T
        ESHELL-VISUAL-COMMANDS'("BASH" "FISH" "HTOP" "SSH" "TOP" "ZSH"))

SUDO EDIT

ENABLE EDITING OF PRIVILEGED FILES

(USE-PACKAGE SUDO-EDIT
    :CONFIG
      (LM/LEADER-KEYS
          "FU" '(SUDO-EDIT-FIND-FILE :WK "SUDO FIND FILE")
          "FU" '(SUDO-EDIT :WK "SUDO EDIT FILE")))

THEME

SET THEMES DIR, LOAD CHOSEN THEME - THEME MADE WITH EMACS THEME EDITOR.

  ;;(ADD-TO-LIST 'CUSTOM-THEME-LOAD-PATH "~/.CONFIG/EMACS/THEMES")
  ;;(LOAD-THEME 'SOFT-CHARCOAL T)

  (USE-PACKAGE DOOM-THEMES
  :ENSURE T
  :CONFIG
  ;; GLOBAL SETTINGS (DEFAULTS)
  (SETQ DOOM-THEMES-ENABLE-BOLD T    ; IF NIL, BOLD IS UNIVERSALLY DISABLED
    DOOM-THEMES-ENABLE-ITALIC T) ; IF NIL, ITALICS IS UNIVERSALLY DISABLED
  (LOAD-THEME 'DOOM-MONOKAI-SPECTRUM T)
    ;; (LOAD-THEME 'DOOM-MONOKAI-MACHINE T)

  ;; ENABLE FLASHING MODE-LINE ON ERRORS
  (DOOM-THEMES-VISUAL-BELL-CONFIG)
  ;; ENABLE CUSTOM NEOTREE THEME (ALL-THE-ICONS MUST BE INSTALLED!)
  (DOOM-THEMES-NEOTREE-CONFIG)
  ;; OR FOR TREEMACS USERS
  (SETQ DOOM-THEMES-TREEMACS-THEME "DOOM-COLORS") ; USE "DOOM-COLORS" FOR LESS MINIMAL ICON THEME
  (DOOM-THEMES-TREEMACS-CONFIG)
  ;; CORRECTS (AND IMPROVES) ORG-MODE'S NATIVE FONTIFICATION.
  (DOOM-THEMES-ORG-CONFIG))

TRANSPARENCY

TRUE TRANSPARENCY SUPPORT AS OF EMACS 29

  (ADD-TO-LIST 'DEFAULT-FRAME-ALIST '(ALPHA-BACKGROUND . 90)) ;; FOR ALL NEW FRAMES

GUI TWEAKS

MAKING THE UI LOOK NICER

DISABLE MENUBAR, TOOLBARS AND SCROLLBARS

  (MENU-BAR-MODE -1)
  (TOOL-BAR-MODE -1)
  (SCROLL-BAR-MODE -1)

DISPLAY LINE NUMBERS AND TRUNCATED LINES

  (GLOBAL-DISPLAY-LINE-NUMBERS-MODE 0)
  (MENU-BAR--DISPLAY-LINE-NUMBERS-MODE-RELATIVE)
  ;; (SETQ DISPLAY-LINE-NUMBERS-MODE-RELATIVE 'T)

  (GLOBAL-VISUAL-LINE-MODE T)

IVY (COUNSEL)

  • IVY, A GENERIC COMPLETION MECHANISM FOR EMACS.
  • COUNSEL, A COLLECTION OF IVY-ENHANCED VERSIONS OF COMMON EMACS COMMANDS.
  • IVY-RICH ALLOWS US TO ADD DESCRIPTIONS ALONGSIDE THE COMMANDS IN M-X.
  (USE-PACKAGE COUNSEL
    :AFTER IVY
    :DIMINISH
    :CONFIG (COUNSEL-MODE))

  (USE-PACKAGE IVY
    :BIND
    ;; IVY-RESUME RESUMES THE LAST IVY-BASED COMPLETION.
    (("C-C C-R" . IVY-RESUME)
     ("C-X B" . IVY-SWITCH-BUFFER-OTHER-WINDOW))
    :DIMINISH
    :CUSTOM
    (SETQ IVY-USE-VIRTUAL-BUFFERS T)
    (SETQ IVY-COUNT-FORMAT "(%D/%D) ")
    (SETQ ENABLE-RECURSIVE-MINIBUFFERS T)
    :CONFIG
    (IVY-MODE))

  (USE-PACKAGE ALL-THE-ICONS-IVY-RICH
    :ENSURE T
    :DIMINISH
    :INIT (ALL-THE-ICONS-IVY-RICH-MODE 1))

  (USE-PACKAGE IVY-RICH
    :AFTER IVY
    :DIMINISH
    :ENSURE T
    :INIT (IVY-RICH-MODE 1) ;; THIS GETS US DESCRIPTIONS IN M-X.
    :CUSTOM
    (IVY-VIRTUAL-ABBREVIATE 'FULL
     IVY-RICH-SWITCH-BUFFER-ALIGN-VIRTUAL-BUFFER T
     IVY-RICH-PATH-STYLE 'ABBREV)
    :CONFIG
    (IVY-SET-DISPLAY-TRANSFORMER 'IVY-SWITCH-BUFFER
                                 'IVY-RICH-SWITCH-BUFFER-TRANSFORMER))

LANGUAGE SUPPORT

EMACS HAS BUILT-IN PROGRAMMING LANGUAGE MODES FOR LISP, SCHEME, DSSSL, ADA, ASM, AWK, C, C++, FORTRAN, ICON, IDL (CORBA), IDLWAVE, JAVA, JAVASCRIPT, M4, MAKEFILES, METAFONT, MODULA2, OBJECT PASCAL, OBJECTIVE-C, OCTAVE, PASCAL, PERL, PIKE, POSTSCRIPT, PROLOG, PYTHON, RUBY, SIMULA, SQL, TCL, VERILOG, AND VHDL. OTHER LANGUAGES WILL REQUIRE YOU TO INSTALL ADDITIONAL MODES.

  (USE-PACKAGE ZIG-MODE)
  (USE-PACKAGE NIX-MODE)
  ;; (USE-PACKAGE JAI-MODE)
  (USE-PACKAGE RUST-MODE)
  (USE-PACKAGE CARGO-MODE)
  (USE-PACKAGE LUA-MODE)
  (ADD-TO-LIST 'LOAD-PATH "~/.CONFIG/EMACS/MANUAL-PACKAGES")
  (REQUIRE 'ODIN-MODE)

ORG MODE

ENABLING TABLE OF CONTENTS

  (USE-PACKAGE TOC-ORG
      :COMMANDS TOC-ORG-ENABLE
      :INIT (ADD-HOOK 'ORG-MODE-HOOK 'TOC-ORG-ENABLE))

ENABLING ORG BULLETS

ORG-BULLETS GIVE BULLET POINTS INSTEAD OF ASTERISKS

  (ADD-HOOK 'ORG-MODE-HOOK 'ORG-INDENT-MODE)
  ;;(SETQ (SETQ ORG-RETURN-FOLLOWS-LINK  T)
  (USE-PACKAGE ORG-BULLETS)
  (ADD-HOOK 'ORG-MODE-HOOK (LAMBDA () (ORG-BULLETS-MODE 1)))

SOURCE CODE BLOCK TAG EXPANSION

ORG-TEMPO IS NOT A SEPARATE PACKAGE BUT A MODULE WITHIN ORG THAT CAN BE ENABLED. ORG-TEMPO ALLOWS FOR '<S' FOLLOWED BY TAB TO EXPAND TO A BEGIN_SRC TAG. OTHER EXPANSIONS AVAILABLE INCLUDE:

TYPING THE BELOW + TAB EXPANDS TO …
<A '#+BEGIN_EXPORT ASCII' … '#+END_EXPORT
<C '#+BEGIN_CENTER' … '#+END_CENTER'
<C '#+BEGIN_COMMENT' … '#+END_COMMENT'
<E '#+BEGIN_EXAMPLE' … '#+END_EXAMPLE'
<E '#+BEGIN_EXPORT' … '#+END_EXPORT'
<H '#+BEGIN_EXPORT HTML' … '#+END_EXPORT'
<L '#+BEGIN_EXPORT LATEX' … '#+END_EXPORT'
<Q '#+BEGIN_QUOTE' … '#+END_QUOTE'
<S '#+BEGIN_SRC' … '#+END_SRC'
<V '#+BEGIN_VERSE' … '#+END_VERSE'
  (REQUIRE 'ORG-TEMPO)

WHICH-KEY

  (USE-PACKAGE WHICH-KEY
    :INIT
        (WHICH-KEY-MODE 1)
    :DIMINISH
    :CONFIG
    (SETQ WHICH-KEY-SIDE-WINDOW-LOCATION 'BOTTOM
          WHICH-KEY-SORT-ORDER #'WHICH-KEY-KEY-ORDER-ALPHA
          WHICH-KEY-SORT-UPPERCASE-FIRST NIL
          WHICH-KEY-ADD-COLUMN-PADDING 1
          WHICH-KEY-MAX-DISPLAY-COLUMNS NIL
          WHICH-KEY-MIN-DISPLAY-LINES 6
          WHICH-KEY-SIDE-WINDOW-SLOT -10
          WHICH-KEY-SIDE-WINDOW-MAX-HEIGHT 0.25
          WHICH-KEY-IDE-DELAY 0.8
          WHICH-KEY-MAX-DESCRIPTION-LENGTH 25
          WHICH-KEY-ALLOW-IMPRECISE-WINDOW-FIT NIL
          WHICH-KEY-SEPARATOR " -> " ))