diff --git a/guix/init.org b/guix/init.org new file mode 100644 index 0000000..3249af9 --- /dev/null +++ b/guix/init.org @@ -0,0 +1,921 @@ +#+title Ian's Emacs Config +#+PROPERTY: header-args:emacs-lisp :tangle ./init.el + +* Literate Config Setup +To get started, run =C-c C-v t= +#+begin_src emacs-lisp + (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))) + + #+end_src + +#+RESULTS: +| (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 +#+begin_src emacs-lisp +(use-package pinentry) +(use-package pass) +(use-package password-store) +(pinentry start) +(setq gptel-api-key (password-store-get "self/openai-alt")) +#+end_src +* AI +#+begin_src emacs-lisp +(use-package gptel) +(setq gptl-default-mode 'org-mode) +#+end_src +* Full Config +I need to move this all over first before I do any organizing to make sure tangle works. +#+begin_src emacs-lisp + + (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], 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 + ("" . company-select-next) + ("TAB" . company-select-next) + ("" . company-select-previous) + ("" . company-select-previous)) + (:map lsp-mode-map ; more general mode than this? + ("" . 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." + ;; + (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) +#+end_src + +* Meow +#+begin_src emacs-lisp +; (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) +; '("" . 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) +; '("" . ignore))) +; +; (require 'meow) +; (meow-setup) +; (meow-global-mode 1) +#+end_src +* Evil +#+begin_src emacs-lisp + ;(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)) +#+end_src +* Mode-Specific Commands +#+begin_src emacs-lisp + (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))) +#+end_src +* Web browsing and youtube +#+begin_src emacs-lisp +;; 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) +#+end_src +* General +#+begin_src emacs-lisp + (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") + "" '(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" '(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") + )) + +#+end_src + +* 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 +- [[https://youtu.be/UtqE-lR2HCA?t=5027][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) +- [[https://youtu.be/UtqE-lR2HCA?t=5134][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? + +** System crafters videos +- [[https://www.youtube.com/watch?v=CUkuyW6hr18][5 Hacks to improve org roam]] +- [[https://www.youtube.com/watch?v=C1kwStlEick][Improving the IRC experience]] +- [[https://www.youtube.com/watch?v=J0OaRy85MOo][Stremlined completions with vertico]] +- [[https://www.youtube.com/watch?v=XZjyJG-sFZI][Keeping your folders clean while using emacs]] +- [[https://www.youtube.com/watch?v=zMzkorlfqLA][Static site generator from org mode]] +- [[https://www.youtube.com/watch?v=za99DwdZEyg][Automated website publishing w/ org and sourcehut]] +- [[https://www.youtube.com/watch?v=SCPoF1PTZpI][Emacs presentations]] +- [[https://www.youtube.com/watch?v=0C16LLHGYzk&t=1882s][Converting a literate config to guix home]] +- [[https://www.youtube.com/watch?v=zWIByv8JOrg][Do we really need use-package]] +- [[https://www.youtube.com/playlist?list=PLEoMzSkcN8oM-kA19xOQc8s0gr0PpFGJQ][Emacs mail playlist]] +- [[https://www.youtube.com/watch?v=qk2Is_sC8Lk][Embark]] + +** Clean up Org Roam +- Major mode notes master node