dotfiles/guix/init.org

34 KiB
Raw Blame History

#+title Ian's Emacs Config

Literate Config Setup

To get started, run C-c C-v t

  (defun dotfiles/org-babel-tangle-config ()
  (when (string-equal (buffer-file-name)
              (expand-file-name "~/dotfiles/guix/init.org"))
    (let ((org-confirm-babel-evaluate nil))
      (org-babel-tangle))))

  (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'dotfiles/org-babel-tangle-config)))
(lambda nil (add-hook 'after-save-hook #'dotfiles/org-babel-tangle-config)) org-tempo-setup #[0 \300\301\302\303\304$\207 [add-hook change-major-mode-hook org-fold-show-all append local] 5] #[0 \300\301\302\303\304$\207 [add-hook change-major-mode-hook org-babel-show-result-all append local] 5] org-babel-result-hide-spec org-babel-hide-all-hashes #[0 \301\211\207 [imenu-create-index-function org-imenu-get-tree] 2] (lambda nil (display-line-numbers-mode 0))

Global variables

Secrets

(use-package pinentry)
(use-package pass)
(use-package password-store)
(pinentry start)
(setq gptel-api-key (password-store-get "self/openai-alt"))

AI

(use-package gptel)
(setq gptl-default-mode 'org-mode)

Full Config

I need to move this all over first before I do any organizing to make sure tangle works.

    (setq user-init-file (expand-file-name "~/dotfiles/guix/init.el"))

    (defun reload-config ()
    "Reload the Emacs configuration."
    (interactive)
    (load-file user-init-file))

    (setq inhibit-startup-message t)

    (menu-bar-mode -1)
    (tool-bar-mode -1)
    (scroll-bar-mode -1)


    (recentf-mode 1)
    (savehist-mode 1)  ; remember previous commands in minibuffer
    (save-place-mode 1)  ; put cursor in last place when opening a file

    ;; Avoid customization UI auto-variables in init.el
    (setq custom-file (locate-user-emacs-file "custom-vars.el"))
    (load custom-file 'noerror 'nomessage)

    ;; Don't show popup UI when prompting
    (setq use-dialog-box nil)

    ;; Update files when changed on disk
    (global-auto-revert-mode 1)

    (set-frame-font "DejaVu Sans Mono 14")

    ;; Initialize Package Sources
    (require 'package)

    (setq package-archives
      '(("melpa" . "https://melpa.org/packages/")
	("org" . "https://orgmode.org/elpa/")
	("elpa" . "https://elpa.gnu.org/packages/")))

    (package-initialize)
    (unless package-archive-contents
  (package-refresh-contents))

    ;; Initialize use-package on non-linux platforms
    (unless (package-installed-p 'use-package)
  (package-install 'use-package))

    (require 'use-package)
    (setq use-package-always-ensure t)

    ;; Persist history over Emacs restarts. Vertico sorts by history position.
    (use-package savehist
  :init
  (savehist-mode))
    ;; Enable vertico
    (use-package vertico
  :init
  (vertico-mode)

  ;; Different scroll margin
  ;; (setq vertico-scroll-margin 0)

  ;; Show more candidates
  ;; (setq vertico-count 20)

  ;; Grow and shrink the Vertico minibuffer
  ;; (setq vertico-resize t)

  ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
  ;; (setq vertico-cycle t)
  )

; For getting vertico history in shell buffer
(use-package consult
  :bind (:map minibuffer-local-map ("C-r" . consult-history)))



    ;; A few more useful configurations...
    (use-package emacs
  :init
  ;; Add prompt indicator to `completing-read-multiple'.
  ;; We display [CRM<separator>], e.g., [CRM,] if the separator is a comma.
  (defun crm-indicator (args)
    (cons (format "[CRM%s] %s"
	  (replace-regexp-in-string
	   "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" ""
	   crm-separator)
	  (car args))
      (cdr args)))
  (advice-add #'completing-read-multiple :filter-args #'crm-indicator)

  ;; Do not allow the cursor in the minibuffer prompt
  (setq minibuffer-prompt-properties
	'(read-only t cursor-intangible t face minibuffer-prompt))
  (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)

  ;; Emacs 28: Hide commands in M-x which do not work in the current mode.
  ;; Vertico commands are hidden in normal buffers.
  ;; (setq read-extended-command-predicate
  ;;       #'command-completion-default-include-p)

  ;; Enable recursive minibuffers
  (setq enable-recursive-minibuffers t))

    ;; todo: evaluate this
    ;; Optionally use the `orderless' completion style.
    (use-package orderless
  :init
  ;; Configure a custom style dispatcher (see the Consult wiki)
  ;; (setq orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch)
  ;;       orderless-component-separator #'orderless-escapable-split-on-space)
  (setq completion-styles '(orderless basic)
	completion-category-defaults nil
	completion-category-overrides '((file (styles partial-completion)))))

    (setq completion-styles '(basic substring partial-completion flex))

    ;; Enable rich annotations using the Marginalia package
    (use-package marginalia
  ;; Bind `marginalia-cycle' locally in the minibuffer.  To make the binding
  ;; available in the *Completions* buffer, add it to the
  ;; `completion-list-mode-map'.
  :bind (:map minibuffer-local-map
	 ("M-A" . marginalia-cycle))

  ;; The :init section is always executed.
  :init

  ;; Marginalia must be activated in the :init section of use-package such that
  ;; the mode gets enabled right away. Note that this forces loading the
  ;; package.
  (marginalia-mode))
    (custom-set-variables
     ;; custom-set-variables was added by Custom.
     ;; If you edit it by hand, you could mess it up, so be careful.
     ;; Your init file should contain only one such instance.
     ;; If there is more than one, they won't work right.
     '(package-selected-packages '(counsel ivy)))

    (use-package simple-modeline
  :hook (after-init . simple-modeline-mode))

    (use-package base16-theme)
    (load-theme 'base16-oceanicnext t)

    (global-display-line-numbers-mode t)
    (dolist (mode
	 '(org-mode-hook
       term-mode-hook
       eshell-mode-hook))
  (add-hook mode (lambda () (display-line-numbers-mode 0))))
    (column-number-mode)

    (use-package rainbow-delimiters
  :hook (prog-mode . rainbow-delimiters-mode))

    (use-package which-key
  :init (which-key-mode)
  :diminish which-key-mode
  :config(setq which-key-idle-delay 0.3))

    (use-package helpful)
    ;; Note that the built-in `describe-function' includes both functions
    ;; and macros. `helpful-function' is functions only, so we provide
    ;; `helpful-callable' as a drop-in replacement.
    (global-set-key (kbd "C-h f") #'helpful-callable)

    (global-set-key (kbd "C-h v") #'helpful-variable)
    (global-set-key (kbd "C-h k") #'helpful-key)
    (global-set-key (kbd "C-h x") #'helpful-command)

    ;; Lookup the current symbol at point. C-c C-d is a common keybinding
    ;; for this in lisp modes.
    (global-set-key (kbd "C-c C-d") #'helpful-at-point)

    ;; Look up *F*unctions (excludes macros).
    ;;
    ;; By default, C-h F is bound to `Info-goto-emacs-command-node'. Helpful
    ;; already links to the manual, if a function is referenced there.
    (global-set-key (kbd "C-h F") #'helpful-function)

    (defconst IS-MAC (eq system-type 'darwin))

    (when IS-MAC
  ;; mac specific settings
  )

    ;; General Emacs keybindings
    (which-key-add-key-based-replacements
  "C-x" "Ctrl-X-prefix"
  "C-c" "Ctrl-C-prefix"
  "C-h" "Help"
  "M-x" "M-x-commands"
  "C-x r" "Rectangles/Registers"
  "C-x 4" "Other-window"
  "C-x 5" "Frames"
  "C-x 8" "Unicode"
  "C-x @" "Event-modifiers"
  "C-x a" "Abbreviations"
  "C-x n" "Narrowing"
  "C-x g" "Magit-status"
  "C-c M-g" "Magit-file-dispatch"
  "C-x v" "Version-Control"
  "C-x X" "Font/Encoding"
  "C-x p" "Project/Buffer"
  "C-x t" "Tabs/Terminal"
  "C-x w" "Windows/Workspaces"
  "C-x x" "Text/Rectangle"
  "C-x C-a" "Emacs-Lisp-Debug"
  "C-x RET" "Coding-system")

    ;; Emacs major modes and related prefixes
    (which-key-add-key-based-replacements
  "C-c m" "Major-mode-cmds"
  "C-c p" "Projectile"
  "C-c g" "Magit"
  "C-c l" "Lisp"
  "C-c @" "HS-minor-mode"
  "C-c t" "Toggle"
  "C-c /" "Comment")

    ;; Org mode specific bindings
    (which-key-add-key-based-replacements
  "C-c C-x" "Org-mode-C-c-C-x"
  "C-c C-w" "Org-refile"
  "C-c [" "Org-agenda")


    (defun split-and-follow-horizontally ()
  (interactive)
  (split-window-below)
  (balance-windows)
  (other-window 1))

    (defun split-and-follow-vertically ()
  (interactive)
  (split-window-right)
  (balance-windows)
  (other-window 1))

    (global-set-key (kbd "s-c") 'delete-window)
    (global-set-key (kbd "s-h") 'windmove-left)
    (global-set-key (kbd "s-j") 'windmove-down)
    (global-set-key (kbd "s-k") 'windmove-up)
    (global-set-key (kbd "s-l") 'windmove-right)
    ; (define-key evil-normal-state-map (kbd "s-d") 'kill-this-buffer)
    (define-key evil-normal-state-map (kbd "s-n") 'projectile-next-project-buffer)
    (define-key evil-normal-state-map (kbd "s-p") 'projectile-previous-project-buffer)
    ; (define-key evil-normal-state-map (kbd "s-J") 'split-and-follow-horizontally)
    ; (define-key evil-normal-state-map (kbd "s-L") 'split-and-follow-vertically)
    ; (define-key evil-normal-state-map (kbd "s-b") 'buffer-menu)
    ; (define-key evil-normal-state-map (kbd "s-x") 'execute-extended-command)
    (global-set-key (kbd "s-SPC") 'tab-next)

    (use-package magit)
    (use-package treemacs)
    (use-package org)
    (use-package projectile)

    (use-package lsp-mode
  :commands (lsp lsp-deferred)
  :init
  (setq lsp-keymap-prefix "C-c l")
  :config
  (lsp-enable-which-key-integration t)
  :hook (terraform-mode . lsp-deferred)
  :hook (rust-mode . lsp-deferred))

    (use-package lsp-ui)
    (use-package lsp-treemacs)
    (use-package flycheck
  :ensure t
  :init (global-flycheck-mode))

    (use-package terraform-mode
  :ensure t)



    ;; (setq deft-directory "~/notes/deft"
    ;;      deft-extensions '("org" "txt")
    ;;      deft-recursive t)

    ;; (setq org-roam-directory "~/notes/roam")

    (setq projectile-project-search-path '("~/code/"))

    ;; (setq company-minimum-prefix-length 100)
    ;; (map! :i "S-o" #'company-complete)



    (setq tab-always-indent 'complete)
    (setq tab-first-completion 'word)

    (use-package company
    :ensure t
    :hook (prog-mode . company-mode)
    :diminish
    :bind (:map company-active-map
	    ("<tab>" . company-select-next)
	    ("TAB" . company-select-next)
	    ("<backtab>" . company-select-previous)
	    ("<S-tab>" . company-select-previous))
    (:map lsp-mode-map  ; more general mode than this?
      ("<tab>" . company-indent-or-complete-common))
    :config
    (global-company-mode 1)
    :init
    (setq company-idle-delay nil))

    (use-package rust-mode
  :ensure t
  :mode "\\.rs\\'"
  :config
  (setq rust-format-on-save t)) ; Automatically format rust files on save

    (use-package cargo
  :ensure t
  :hook (rust-mode . cargo-minor-mode))

    (use-package eshell)
    (use-package vterm)
    (use-package treemacs-projectile)
    ;(use-package treemacs-nerd-icons
    ;    :config
    ;  (treemacs-load-theme "nerd-icons"))

    (setq ring-bell-function 'ignore)
    (setq dired-listing-switches "-al")

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

    (setq dired-dwim-target t) ; opening 'other window' on a subdir enters 2 window dired mode for copy/paste
    (use-package dired-single)

    (defun my-dired-init ()
  "Bunch of stuff to run for dired, either immediately or when it's
   loaded."
  ;; <add other stuff here>
  (define-key dired-mode-map [remap dired-find-file]
    'dired-single-buffer)
  (define-key dired-mode-map [remap dired-mouse-find-file-other-window]
    'dired-single-buffer-mouse)
  (define-key dired-mode-map [remap dired-up-directory]
    'dired-single-up-directory))

    ;; if dired's already loaded, then the keymap will be bound
    (if (boundp 'dired-mode-map)
    ;; we're good to go; just add our bindings
    (my-dired-init)
  ;; it's not loaded yet, so add our bindings to the load-hook
    (add-hook 'dired-load-hook 'my-dired-init))

    (use-package dired-open
    :config
  (setq dired-open-extensions '(("png" . "sxiv")
		    ("mkv" . "mpv")
		    ("avi" . "mpv"))))

    (use-package all-the-icons-dired
    :hook (dired-mode . all-the-icons-dired-mode))

    (use-package treemacs-all-the-icons)

    (org-babel-do-load-languages
     'org-babel-load-languages
     '((emacs-lisp . t)
   (python . t)))

    (setq org-confirm-babel-evaluate nil)

    ;; (use-package org-tempo)

    (add-to-list 'org-structure-template-alist '("sh" . "src shell"))
    (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
    (add-to-list 'org-structure-template-alist '("py" . "src python"))  

  (use-package embark-consult)

Meow

;  (use-package 'meow)
;  (defun meow-setup ()
;      (setq meow-cheatsheet-layout meow-cheatsheet-layout-colemak)
;      (meow-motion-overwrite-define-key
;       ;; Use e to move up, n to move down.
;       ;; Since special modes usually use n to move down, we only overwrite e here.
;       '("e" . meow-prev)
;       '("<escape>" . ignore))
;      (meow-leader-define-key
;       '("?" . meow-cheatsheet)
;       ;; To execute the originally e in MOTION state, use SPC e.
;       '("e" . "H-e")
;       '("1" . meow-digit-argument)
;       '("2" . meow-digit-argument)
;       '("3" . meow-digit-argument)
;       '("4" . meow-digit-argument)
;       '("5" . meow-digit-argument)
;       '("6" . meow-digit-argument)
;       '("7" . meow-digit-argument)
;       '("8" . meow-digit-argument)
;       '("9" . meow-digit-argument)
;       '("0" . meow-digit-argument))
;      (meow-normal-define-key
;       '("0" . meow-expand-0)
;       '("1" . meow-expand-1)
;       '("2" . meow-expand-2)
;       '("3" . meow-expand-3)
;       '("4" . meow-expand-4)
;       '("5" . meow-expand-5)
;       '("6" . meow-expand-6)
;       '("7" . meow-expand-7)
;       '("8" . meow-expand-8)
;       '("9" . meow-expand-9)
;       '("-" . negative-argument)
;       '(";" . meow-reverse)
;       '("," . meow-inner-of-thing)
;       '("." . meow-bounds-of-thing)
;       '("[" . meow-beginning-of-thing)
;       '("]" . meow-end-of-thing)
;       '("/" . meow-visit)
;       '("a" . meow-append)
;       '("A" . meow-open-below)
;       '("b" . meow-back-word)
;       '("B" . meow-back-symbol)
;       '("c" . meow-change)
;       '("d" . meow-delete)
;       '("e" . meow-prev)
;       '("E" . meow-prev-expand)
;       '("f" . meow-find)
;       '("g" . meow-cancel-selection)
;       '("G" . meow-grab)
;       '("m" . meow-left)
;       '("M" . meow-left-expand)
;       '("i" . meow-right)
;       '("I" . meow-right-expand)
;       '("j" . meow-join)
;       '("k" . meow-kill)
;       '("l" . meow-line)
;       '("L" . meow-goto-line)
;       '("h" . meow-mark-word)
;       '("H" . meow-mark-symbol)
;       '("n" . meow-next)
;       '("N" . meow-next-expand)
;       '("o" . meow-block)
;       '("O" . meow-to-block)
;       '("p" . meow-yank)
;       '("q" . meow-quit)
;       '("r" . meow-replace)
;       '("s" . meow-insert)
;       '("S" . meow-open-above)
;       '("t" . meow-till)
;       '("u" . meow-undo)
;       '("U" . meow-undo-in-selection)
;       '("v" . meow-search)
;       '("w" . meow-next-word)
;       '("W" . meow-next-symbol)
;       '("x" . meow-delete)
;       '("X" . meow-backward-delete)
;       '("y" . meow-save)
;       '("z" . meow-pop-selection)
;       '("'" . repeat)
;       '("<escape>" . ignore)))
;
;  (require 'meow)
;  (meow-setup)
;  (meow-global-mode 1)

Evil

  ;(unless (package-installed-p 'evil)
  ;  (package-install 'evil))
  ;  (evil-mode 1)
  ; (setq evil-undo-system 'undo-tree)
  (use-package undo-tree
     :ensure t
     :after evil
     :diminish
     :config
       (evil-set-undo-system 'undo-tree)
       (global-undo-tree-mode 1))
  (use-package evil
    :ensure t
    :config
      (evil-mode 1))

Mode-Specific Commands

  (defun custom/conditional-imenu ()
  "Call `consult-org-heading` in Org mode, otherwise `consult-imenu`."
  (interactive)
  (if (eq major-mode 'org-mode)
      (consult-org-heading)
    (consult-imenu)))

Web browsing and youtube

;; Using straight:
;;(use-package empv
;;  :straight (:host github :repo "isamert/empv.el"))

(use-package empv)

(setq empv-radio-channels
      '(("SomaFM - Groove Salad" . "http://www.somafm.com/groovesalad.pls")
        ("SomaFM - Drone Zone" . "http://www.somafm.com/dronezone.pls")
        ("SomaFM - Sonic Universe" . "https://somafm.com/sonicuniverse.pls")
        ("SomaFM - Metal" . "https://somafm.com/metal.pls")
        ("SomaFM - Vaporwaves" . "https://somafm.com/vaporwaves.pls")
        ("ADHD 1" . "https://www.youtube.com/watch?v=CmMrm4BpQHU")
        ("WREK FM" . "http://streaming.wrek.org:8000/wrek_live-128kb.m3u")
))
     ;; Todo: lainchan? adhd music stream from youtube? wuog? wrekFM? does freeside have streaming radio?
(with-eval-after-load 'embark (empv-embark-initialize-extra-actions))
(add-to-list 'empv-mpv-args "--ytdl-format=best")
(add-to-list 'empv-mpv-args "--save-position-on-quit")
(add-hook 'empv-init-hook #'empv-override-quit-key)

General

  (use-package general
    :ensure t
    :config

    (general-create-definer general-definition
      :keymaps '(normal insert visual emacs)
      :prefix "SPC"
      :global-prefix "C-SPC")

    (general-definition

      ;; Top level bindings
      "SPC" '(projectile-find-file        :which-key "Find project file")
      "<backspace>" '(treemacs-find-file  :which-key "Find current file in sidebar")
      "," '(+ivy/switch-workspace-buffer  :which-key "Buffers (workspace)")
      "/" '(consult-ripgrep               :which-key "Search project")
      ":" '(execute-extended-command      :which-key "M-x")
      ";" '(eval-expression               :which-key "Eval")
      "<" '(consult-buffer                :which-key "Buffers (all)")
      "x" '(scratch-buffer                :which-key "Scratch popup")
      "-" '(dired                         :which-key "Find Directory")
      "*" '(counsel-locate                :which-key "Fuzzy find file") ;; find-file?  consult-locate?
      "d" '(docker                        :which-key "Docker")
      "i" '(custom/conditional-imenu      :which-key "Imenu")  ;; consult-outline?

      ;; Agenda
      "a" '(:ignore t                     :which-key "Agenda")
      "aa" '(org-agenda                   :which-key "Open Agenda")
      "a/" '(consult-org-agenda           :which-key "Search agenda headlines")

      "ac" '(:ignore t                    :which-key "Clock")
      "acc" '(org-clock-goto              :which-key "Active clock")
      "ack" '(org-clock-cancel            :which-key "Cancel current clock")
      "act" '(+org/toggle-last-clock      :which-key "Toggle last clock")


      ;; Buffers / bookmarks
      "b" '(:ignore t                 :which-key "Buffers")
      "bb" '(counsel-bookmark         :which-key "Goto Bookmark")  ;; consult-bookmark
      "bk" '(kill-current-buffer      :which-key "Kill buffer")
      "bm" '(bookmark-set             :which-key "Set bookmark")
      "bM" '(bookmark-delete          :which-key "Delete bookmark")
      ;; "bo" '(NEEDS CUSTOM FUNCTION :which-key "Kill other buffers")
      "br" '(revert-buffer            :which-key "Revert buffer")
      "bR" '(rename-buffer            :which-key "Rename buffer")
      "bz" '(bury-buffer              :which-key "Bury buffer")
      ;; "bZ" '(NEEDS CUSTOM FUNCTION :which-key "Kill buried buffers")
      "bj" '(+ivy/jump-list           :which-key "Jump list")
      "bu" '(vundo                    :which-key "Undo history")

      ;; Code
      "c" '(:ignore t                         :which-key "Code")
      "cc" '(compile                          :which-key "Compile")
      "cC" '(recompile                        :which-key "Recompile")
      "cd" '(+lookup/definition               :which-key "Goto definition")
      "cr" '(+lookup/references               :which-key "Goto references")
      "ce" '(+eval/buffer-or-region           :which-key "Eval buffer/region")
      ;; "cf" '(NOT A COMMAND (re-do)         :which-key "Format buffer/region")
      "ci" '(+lookup/implementations          :which-key "Find implementations")
      "cj" '(lsp-ivy-workspace-symbol         :which-key "Goto symbol (curr. workspace)")
      "cJ" '(lsp-ivy-global-workspace-symbol  :which-key "Goto symbol (any workspace)")
      "ck" '(+lookup/documentation            :which-key "Jump to documentation")
      "cl" '(+default/lsp-command-map         :which-key "LSP")
      "co" '(lsp-organize-imports             :which-key "LSP organize imports")
      "cR" '(lsp-rename                       :which-key "LSP rename")
      "cs" '(+eval/send-region-to-repl        :which-key "Send to repl")
      "ct" '(+lookup/type-definition          :which-key "Find type definition")
      "cw" '(delete-trailing-whitespace       :which-key "Delete trailing whitespace")
      ;; "cn" '(doom/delete-trailing-newlines :which-key "Delete trailing newlines")
      "cx" '(+default/diagnostics             :which-key "List errors")

      ;; File
      "f" '(:ignore t                                      :which-key "File")
      ;; "fp" '(doom/open-private-config                   :which-key "Browse private config")
      "fr" '(counsel-recentf                               :which-key "Recent files")
      "fR" '(reload-config                                 :which-key "Recent files")
      ;; "fm" '(doom/move-this-file                        :which-key "Move/rename file")
      ;; "fS" '(doom/sudo-find-file                        :which-key "Sudo find file")
      ;; "fs" '(doom/sudo-this-file                        :which-key "Sudo this file")
      "fy" '(+default/yank-buffer-path                     :which-key "yank file path")
      "fY" '(+default/yank-buffer-path-relative-to-project :which-key "Yank file path from project")

      ;; Git
      "g"   '(:ignore t :which-key "git")
      "gb"  '(magit-branch-checkout         :which-key "magit switch branch")
      "gB"  '(magit-blame-addition          :which-key "magit blame")
      "gF"  '(magit-fetch                   :which-key "magit fetch")
      "gg"  '(magit-status                  :which-key "magit status")
      "gG"  '(magit-status-here             :which-key "magit status here")
      "gL"  '(magit-log-buffer-file         :which-key "magit buffer log")
      "gt"  '(git-timemachine-toggle        :which-key "git time machine")

      "gd"   '(:ignore t :which-key "dispatch")
      "gdF" '(forge-dispatch                :which-key "Forge dispatch")
      "gdd" '(magit-dispatch                :which-key "Magit dispatch")
      "gdf" '(magit-file-dispatch           :which-key "Magit file dispatch")

      "gf"   '(:ignore t :which-key "find")
      "gfc" '(magit-show-commit             :which-key "find commit")
      "gff" '(magit-find-file               :which-key "find file")
      "gfg" '(magit-find-git-config-file    :which-key "find gitconfig file")
      "gfi" '(forge-visit-issue             :which-key "find issue")
      "gfp" '(forge-visit-pullreq           :which-key "find pull request")

      "gh"   '(:ignore t :which-key "hunk")

      "ghn" '(+vc-gutter/previous-hunk      :which-key "jump to previous hunk")
      "ghp" '(+vc-gutter/next-hunk          :which-key "jump to next hunk")
      "ghr" '(+vc-gutter/revert-hunk        :which-key "revert hunk at point")
      "ghs" '(+vc-gutter/stage-hunk         :which-key "stage hunk at point")

      "gl"   '(:ignore t :which-key "list")
      "gli" '(forge-list-issues             :which-key "list issues")
      "gln" '(forge-list-notifications      :which-key "list notifications")
      "glp" '(forge-list-pullreqs           :which-key "list pull requests")
      "glr" '(forge-list-issues             :which-key "list repositories")
      "gls" '(magit-list-submodules         :which-key "list submodules")

      "go"   '(:ignore t :which-key "open")
      "goI" '(forge-browse-issues           :which-key "Browse issues")
      "goP" '(forge-browse-pullreqs         :which-key "Browse pull requests")
      "goc" '(forge-browse-commit           :which-key "Browse commit")
      "goh" '(+vc/browse-at-remote-homepage :which-key "Browse homepage")
      "goi" '(forge-browse-issue            :which-key "Browse an issue")
      "goo" '(+vc/browse-at-remote          :which-key "Browse file or region")
      "gop" '(forge-browse-pullreq          :which-key "Browse a pull request")
      "gor" '(forge-browse-remote           :which-key "Browse remote")

      ;; Help
      "h"   '(:ignore t :which-key "help")
      "h<return>" '(info-emacs-manual                :which-key "Emacs manual")
      "h'"        '(describe-char                    :which-key "Describe character")
      "ha"        '(counsel-apropos                  :which-key "Apropos")
      "hb"        '(counsel-descbinds                :which-key "Describe bindings")
      "he"        '(view-echo-area-messages          :which-key "View echo area messages")
      "hf"        '(counsel-describe-function        :which-key "Describe function")
      "hi"        '(info                             :which-key "Info")
      "hk"        '(helpful-key                      :which-key "Describe key")
      "hl"        '(view-lossage                     :which-key "View actions log")
      "hm"        '(describe-mode                    :which-key "Describe mode")
      "ho"        '(counsel-describe-symbol          :which-key "Describe symbol")
      "hx"        '(helpful-command                  :which-key "Describe command")
      "hA"        '(apropos-documentation            :which-key "Apropos(documentation)")
      "hF"        '(counsel-faces                    :which-key "Describe Face")
      "hM"        '(popwin:messages                  :which-key "View system messages")

      "hw"        '(:ignore t :which-key "which-key")
      "hwf"       '(which-key-show-full-keymap       :which-key "Full keymap")
      "hwi"       '(which-key-show-minor-mode-keymap :which-key "Minor mode keymap")
      "hwk"       '(which-key-show-keymap            :which-key "Show keymap")
      "hwm"       '(which-key-show-major-mode        :which-key "Show major mode")
      "hwt"       '(which-key-show-top-level         :which-key "Show top-level")

      ;; Notes
      "nd" '(deft                              :which-key "Deft")
      "nt" '(org-todo-list                     :which-key "Todo list")
      "nf" '(org-roam-node-find                :which-key "Find node")
      "ng" '(org-roam-graph                    :which-key "Show graph")
      "nr" '(org-roam-buffer-toggle            :which-key "Toggle roam buffer")
      "nb" '(org-roam-buffer-display-dedicated :which-key "Launch roam buffer")
      "ns" '(org-roam-db-sync                  :which-key "Sync database")
      "nc" '(org-roam-capture                  :which-key "Capture to node")

      ;; Org mode
      "o" '(:ignore t :which-key "org")
      "ol"  '(org-store-link                        :which-key "Org store link")
      "oc"  '(org-capture                           :which-key "Org Capture")
      "oC"  '(org-capture-goto-target               :which-key "Goto Capture")
      "ot"  '(org-babel-tangle-file                 :which-key "Org Tangle")
      "oy"  '(+org/export-to-clipboard              :which-key "Org export to clipboard")
      "oY"  '(+org/export-to-clipboard-as-rich-text :which-key "Org export to clipboard (rich)")
      "oe" '(:ignore t :which-key "export")
      "oeh" '(org-html-export-to-html               :which-key "Export Org to HTML")
      "oa" '(:ignore t :which-key "attach")
      "oaa" '(org-attach                            :which-key "Attach")
      "oac" '(org-download-clipboard                :which-key "Org download clipboard")
      "oad" '(org-attach-delete-one                 :which-key "Delete one attachment")
      "oaD" '(org-attach-delete-all                 :which-key "Delete all attachments")
      "oas" '(org-attach-sync                       :which-key "Sync attachments")
      "oay" '(org-download-yank                     :which-key "Org download yank")

      ;; Project
      "p"  '(:ignore t :which-key "project")
      "ps" '(+neotree/open                     :which-key "Open project sidebar")
      "pa" '(projectile-add-known-project      :which-key "Add new project")
      "pc" '(+ivy/project-compile              :which-key "Compile in project")
      "pd" '(projectile-remove-known-project   :which-key "Remove known project")
      "ps" '(counsel-projectile-switch-project :which-key "Switch projects")
      "pC" '(projectile-configure-project      :which-key "Configure project")
      "pr" '(projectile-run-project            :which-key "Run project")
      "pt" '(magit-todos-list                  :which-key "List project todos")
      "pT" '(projectile-test-project           :which-key "Test project")
      "pz" '(+taskrunner/project-tasks         :which-key "List  project tasks")

      ;; Shell
      "s"  '(:ignore t :which-key "shell")
      "se" '(+eshell/toggle               :which-key "Toggle eshell popup")
      "sE" '(+eshell/here                 :which-key "Open eshell here")
      "sr" '(+eval/open-repl-other-window :which-key "Repl")
      "st" '(+vterm/toggle                :which-key "Toggle vterm popup")
      "sT" '(+vterm/here                  :which-key "Open vterm here")

      ;; Toggle
      "t"  '(:ignore t :which-key "toggle")
      "tc" '(global-display-fill-column-indicator-mode :which-key "Fill Column Indicator")
      "tf" '(flycheck-mode                             :which-key "Flycheck")
      "tm" '(consult-minor-mode-menu                   :which-key "Minor modes")
      "tp" '(org-tree-slide-mode                       :which-key "Org-tree-slide-mode")
      "tw" '(+word-wrap-mode                           :which-key "Soft line wrapping")
      "tz" '(+zen/toggle                               :which-key "Zen mode")
      ;; "tl" '(doom/toggle-line-numbers                  :which-key "Line numbers")

      ;; Visual / appearance
      "v"  '(:ignore t :which-key "visual/appearance")
      "vt" '(counsel-load-theme :which-key "load theme")

      ;; Workspaces
      "TAB TAB" '(+workspace/display              :which-key "Display tab bar")
      "TAB d"   '(+workspace/delete               :which-key "Delete this workspace")
      "TAB l"   '(+workspace/load                 :which-key "Load workspace from file")
      "TAB n"   '(+workspace/new                  :which-key "New workspace")
      "TAB N"   '(+workspace/new-named            :which-key "New named workspace")
      "TAB r"   '(+workspace/rename               :which-key "Rename workspace")
      "TAB R"   '(+workspace/restore-last-session :which-key "Restore last session")
      "TAB s"   '(+workspace/save                 :which-key "Save workspace")
      "TAB x"   '(+workspace/kill-session         :which-key "Delete session")
    ))

Todo

General

  • Refactor to use use-package more effectively

Terminals

  • More terminals
  • emacs-fish-completions
  • setup terminals to complete to vertico
  • starship prompts

New functions

  • Git-time-machine-or-vc-region-history

Screen management

  • perspective
  • workspaces?

Note taking

  • deft
  • org : roam2, hugo, pretty, dragndrop, bullet

Lisp stuff

  • paredit
  • lispy

One-offs

  • hl-todo
  • gitgutter
  • persistent undo
  • commentary
  • highlight tabs and newlines
  • Vertico backwards delete
  • alphabetical keybindings
  • brighter modeline
  • surpress global minor modes

    • Undo-Tree, company, flycheck, which-key
  • always follow new buffers
  • ignore case in imenu
  • improve which-key visibility
  • Fix escape in minibuffer
  • Open buffers in same window

LSP stuff

  • look into treemacs integrations
  • consider eglot
  • dap-mode

Completion

  • dabbrev-expand or company on c-n c-p
  • c-N c-P for expand full line
  • yasnippet
  • company-mode to corfu (or vertico completions? or cofu-in-vertico?)
  • get vertico as completion box

Keybindings

  • map hyper bindings for buffer nav and jumping
  • evil-org
  • map alignment functions in 'code'section
  • define global meow-left and vim-left, swich contextually
  • fix c-u in evil mode
  • fix tab key
  • window size functions
  • empv

    • map

      • empv-play-radio
      • empv-play-random-channel
      • empv-log-current-radio-song-name
      • empv-youtube
      • empv-play
      • empv-play-{file,audio,video,directory,radio,random-channel}
      • empv-playlist-{select,next,prev,clear,shuffle}
      • empv-display-current
      • empv-toggle
      • empv-toggle-video
      • empv-youtube
      • empv-volume-{down,up}
      • empv-chapter-{prev,next,select}
      • empv-exit
    • configure

      • empv-radio-log-file
      • empv-radio-log-format
      • spc m y(outube)
      • spc m l(ocal)
      • spc m r(adio)
      • empv-video-dir empv-audio-dir?
      • empv-play-file

selected radio (See empv-radio-log-file and empv-radio-log-format variables and their documentations).

New plugins

  • tramp
  • k8s
  • docker
  • terraform
  • straight?
  • eaf-browser
  • embark?
  • emms, emms-play-url binding (youtube view)
  • consult-lsp (better for errors than treemacs integrations probably)
  • workspaces / persp mode
  • srht.el
  • orderless
  • affe
  • gnus
  • evil-org

Appearance switches

  • fonts
  • random theme
  • org mode bullets / pretty / etc

Research

  • What does C-d do when in a minibuffer for vertico?

Clean up Org Roam

  • Major mode notes master node