From e3b5bed9dd9d499419f6fa613fc35be7e8fdb1e6 Mon Sep 17 00:00:00 2001 From: Christopher Paris Date: Wed, 5 Mar 2025 16:08:21 -0500 Subject: [PATCH] Add Doom .config file --- .config/doom/Old-2025.02.27/config.el | 142 ++ .config/doom/Old-2025.02.27/custom.el | 30 + .config/doom/Old-2025.02.27/init.el | 200 +++ .config/doom/Old-2025.02.27/packages.el | 89 ++ .config/doom/Old-2025.02.27/roam.el | 122 ++ .config/doom/Old-2025.02.27/sword-to-org.el | 224 +++ .config/doom/bookmarks | 10 + .config/doom/config.el | 934 +++++++++++ .config/doom/config.org | 1540 +++++++++++++++++++ .config/doom/eshell/aliases | 29 + .config/doom/eshell/profile | 1 + .config/doom/images/doom-emacs-dash.png | Bin 0 -> 28349 bytes .config/doom/images/emacs-dash.png | Bin 0 -> 36692 bytes .config/doom/images/emacs-start-page.png | Bin 0 -> 34520 bytes .config/doom/init.el | 191 +++ .config/doom/packages.el | 93 ++ .config/doom/start.org | 45 + 17 files changed, 3650 insertions(+) create mode 100644 .config/doom/Old-2025.02.27/config.el create mode 100644 .config/doom/Old-2025.02.27/custom.el create mode 100644 .config/doom/Old-2025.02.27/init.el create mode 100644 .config/doom/Old-2025.02.27/packages.el create mode 100644 .config/doom/Old-2025.02.27/roam.el create mode 100644 .config/doom/Old-2025.02.27/sword-to-org.el create mode 100644 .config/doom/bookmarks create mode 100644 .config/doom/config.el create mode 100644 .config/doom/config.org create mode 100644 .config/doom/eshell/aliases create mode 100644 .config/doom/eshell/profile create mode 100644 .config/doom/images/doom-emacs-dash.png create mode 100644 .config/doom/images/emacs-dash.png create mode 100644 .config/doom/images/emacs-start-page.png create mode 100644 .config/doom/init.el create mode 100644 .config/doom/packages.el create mode 100644 .config/doom/start.org diff --git a/.config/doom/Old-2025.02.27/config.el b/.config/doom/Old-2025.02.27/config.el new file mode 100644 index 0000000..31b10fa --- /dev/null +++ b/.config/doom/Old-2025.02.27/config.el @@ -0,0 +1,142 @@ +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- + +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! + + +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. It is optional. +(setq user-full-name "Christopher Paris" + user-mail-address "christopherrparis1@gmail.com") + +;; Doom exposes five (optional) variables for controlling fonts in Doom: +;; +;; - `doom-font' -- the primary font to use +;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) +;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; - `doom-unicode-font' -- for unicode glyphs +;; - `doom-serif-font' -- for the `fixed-pitch-serif' face +;; +;; See 'C-h v doom-font' for documentation and more examples of what they +;; accept. For example: +;; +;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) +;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) +;; +;; If you or Emacs can't find your font, use 'M-x describe-font' to look them +;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to +;; refresh your font settings. If Emacs still can't find your font, it likely +;; wasn't installed correctly. Font issues are rarely Doom issues! + +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: +(setq doom-theme 'doom-one) + +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. +(setq display-line-numbers-type t) + +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/Nextcloud/Notes/Org") + +(after! org (setq org-log-intodrawer t)) + +(after! org (setq org-capture-templates + '(("p" "Private templates") + ("pt" "TODO entry" entry + (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" "Capture") + (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) + ("pj" "Journal entry" entry (file+olp+datetree + "~/Nextcloud/Notes/Org/org-roam/20241023165214-journal.org") "* %U - %^{Activity}") + ("pb" "Add book to read" entry (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" + "Books To Read") (file "~/Nextcloud/Notes/Org/tpl-book.txt") + :empty-lines-after 2) + + ("w" "Work templates") + ("wt" "TODO entry" entry + (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315170859-mywork.org" "Capture") + (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) + ("wl" "Worklog entry" entry (file+olp+datetree + "~/Nextcloud/Notes/Org/org-roam/20241024113312-worklog.org") "* %U - %^{Activity}") + ))) +(after! org (setq org-excalidraw-directory "~/Nextcloud/Notes/Org/excalidraw")) + +;; Whenever you reconfigure a package, make sure to wrap your config in an +;; `after!' block, otherwise Doom's defaults may override your settings. E.g. +;; +;; (after! PACKAGE +;; (setq x y)) +;; +;; The exceptions to this rule: +;; +;; - Setting file/directory variables (like `org-directory') +;; - Setting variables which explicitly tell you to set them before their +;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). +;; - Setting doom variables (which start with 'doom-' or '+'). +;; +;; Here are some additional functions/macros that will help you configure Doom. +;; +;; - `load!' for loading external *.el files relative to this one +(load! "roam.el") +(load! "sword-to-org.el") + +;; - `use-package!' for configuring packages +;; - `after!' for running code after a package has loaded +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +;; etc). +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. + +;; Transparency +(add-to-list 'default-frame-alist '(alpha-background . 90)) ;For all new frames henceforth + +;;neotree + + + +(use-package neotree + :config + (setq neo-smart-open t + neo-show-hidden-files t + neo-window-width 55 + neo-window-fixed-size nil + inhibit-compacting-font-caches t + projectile-switch-project-action 'neotree-projectile-action) + ;; tuncate long file names in neotree + (add-hook 'neo-after-create-hook' + #'(lambda (_) + (with-current-buffer (get-buffer neo-buffer-name) + (setq tuncate-lines t) + (setq word-wrap nil) + (make-local-variable 'auto-hscroll-mode) + (setq auto-hscroll-mode nil))))) +(map! :leader + (:prefix ("d" . "Directory") + :desc "Toggle neotree" "n" #'neotree-dir)) + +(map! :leader + (:prefix ("t" . "Toggle") + :desc "Toggle neotree shown in sidebar" "n" #'neotree-toggle)) + +;; iMenu +(setq imenu-list-focus-after-activation t) + +(map! :leader + (:prefix ("s" . "Search") + :desc "Menu to jump to places in buffer" "i" #'counsel-imenu)) + +(map! :leader + (:prefix ("t" . "Toggle") + :desc "Toggle imenu shown in a sidebar" "i" #'imenu-list-smart-toggle)) diff --git a/.config/doom/Old-2025.02.27/custom.el b/.config/doom/Old-2025.02.27/custom.el new file mode 100644 index 0000000..779d57f --- /dev/null +++ b/.config/doom/Old-2025.02.27/custom.el @@ -0,0 +1,30 @@ +(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. + '(magit-todos-insert-after '(bottom) nil nil "Changed by setter of obsolete option `magit-todos-insert-at'") + '(org-agenda-files + '("~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" "/home/christopher/Nextcloud/Notes/Org/org-roam/20240315170859-mywork.org" "/home/christopher/Nextcloud/Notes/Org/org-roam/20240309010204-work_tech.org" "/home/christopher/Nextcloud/Notes/Org/org-roam/20240313005225-tracysmith_1on1.org")) + '(package-selected-packages + '(org-modern org-timeblock notmuch devdocs embark helm-org-ql org-roam-ql-ql org-roam-timestamps citar-org-roam calfw-howm howm denote-menu google-contacts denote dtk jq-mode json-mode json-snatcher forecast hledger-mode org-contacts org-roam-ql org-roam-ui org-roam-bibtex org-roam))) + +;; '(org-capture-templates +;; (quote +;; (("pt" "Private templates") +;; ("ptt" "TODO entry" entry +;; (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" "Capture") +;; (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) +;; ("ptj" "Journal entry" entry (file+olp+datetree +;; "~/org/journal.org") "* %U - %^{Activity}") +;; ("ptb" "Add book to read" entry (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" +;; "Books to read") (file "~Nextcloud/Notes/Org/org/tpl-book.txt") +;; :empty-lines-after 2) +;; )))) + +(custom-set-faces + ;; custom-set-faces 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. + ) diff --git a/.config/doom/Old-2025.02.27/init.el b/.config/doom/Old-2025.02.27/init.el new file mode 100644 index 0000000..25a44b6 --- /dev/null +++ b/.config/doom/Old-2025.02.27/init.el @@ -0,0 +1,200 @@ +;;; init.el -*- lexical-binding: t; -*- + +;; This file controls what Doom modules are enabled and what order they load +;; in. Remember to run 'doom sync' after modifying it! + +;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's +;; documentation. There you'll find a link to Doom's Module Index where all +;; of our modules are listed, including what flags they support. + +;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or +;; 'C-c c k' for non-vim users) to view its documentation. This works on +;; flags as well (those symbols that start with a plus). +;; +;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its +;; directory (for easy access to its source code). + +(doom! :input + ;;bidi ; (tfel ot) thgir etirw uoy gnipleh + ;;chinese + ;;japanese + ;;layout ; auie,ctsrnm is the superior home row + + :completion + company ; the ultimate code completion backend + (corfu +oderless) + ;;helm ; the *other* search engine for love and life + ;;ido ; the other *other* search engine... + (ivy +fonts +childframe) ; a search engine for love and life + vertico ; the search engine of the future + + :ui + ;;deft ; notational velocity for Emacs + doom ; what makes DOOM look the way it does + doom-dashboard ; a nifty splash screen for Emacs + doom-quit ; DOOM quit-message prompts when you quit Emacs + (emoji +unicode) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + ;;hydra + ;;indent-guides ; highlighted indent columns + (ligatures +extras) ; ligatures and symbols to make your code pretty again + ;;minimap ; show a map of the code on the side + modeline ; snazzy, Atom-inspired modeline, plus API + ;;nav-flash ; blink cursor line after big motions + neotree ; a project drawer, like NERDTree for vim + ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + ;;tabs ; a tab bar for Emacs + treemacs ; a project drawer, like neotree but cooler + ;;unicode ; extended unicode support for various languages + (vc-gutter +pretty) ; vcs diff in the fringe + vi-tilde-fringe ; fringe tildes to mark beyond EOB + window-select ; visually switch windows + workspaces ; tab emulation, persistence & separate workspaces + zen ; distraction-free coding or writing + + :editor + (evil +everywhere); come to the dark side, we have cookies + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + ;;(format +onsave) ; automated prettiness + ;;god ; run Emacs commands without modifier keys + ;;lispy ; vim for lisp, for people who don't like vim + ;;multiple-cursors ; editing in many places at once + ;;objed ; text object editing for the innocent + ;;parinfer ; turn lisp into python, sort of + ;;rotate-text ; cycle region at point between text candidates + snippets ; my elves. They type so I don't have to + ;;word-wrap ; soft wrapping with language-aware indent + + :emacs + (dired +icons) ; making dired pretty [functional] + electric ; smarter, keyword-based electric-indent + (ibuffer +icons) ; interactive buffer management + undo ; persistent, smarter undo for your inevitable mistakes + vc ; version-control and Emacs, sitting in a tree + + :term + eshell ; the elisp shell that works everywhere + shell ; simple shell REPL for Emacs + term ; basic terminal emulator for Emacs + vterm ; the best terminal emulation in Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + (spell +flyspell) ; tasing you for misspelling mispelling + ;;grammar ; tasing grammar mistake every you make + + :tools + ;;ansible + biblio ; Writes a PhD for you (citation needed) + ;;debugger ; FIXME stepping through code, to help you add bugs + ;;direnv + ;;docker + ;;editorconfig ; let someone else argue about tabs vs spaces + ;;ein ; tame Jupyter notebooks with emacs + (eval +overlay) ; run code, run (also, repls) + ;;gist ; interacting with github gists + lookup ; navigate your code and its documentation + ;;lsp ; M-x vscode + magit ; a git porcelain for Emacs + ;;make ; run make tasks from Emacs + pass ; password manager for nerds + pdf ; pdf enhancements + ;;prodigy ; FIXME managing external services & code builders + ;;rgb ; creating color strings + taskrunner ; taskrunner for all your projects + ;;terraform ; infrastructure as code + ;;tmux ; an API for interacting with tmux + ;;tree-sitter ; syntax and parsing, sitting in a tree... + ;;upload ; map local to remote projects via ssh/ftp + + :os + ;;(:if IS-MAC macos) ; improve compatibility with macOS + tty ; improve the terminal Emacs experience + + :lang + ;;agda ; types of types of types of types... + ;;beancount ; mind the GAAP + ;;(cc +lsp) ; C > C++ == 1 + ;;clojure ; java with a lisp + ;;common-lisp ; if you've seen one lisp, you've seen them all + ;;coq ; proofs-as-programs + ;;crystal ; ruby at the speed of c + ;;csharp ; unity, .NET, and mono shenanigans + ;;data ; config/data formats + ;;(dart +flutter) ; paint ui and not much else + ;;dhall + ;;elixir ; erlang done right + ;;elm ; care for a cup of TEA? + emacs-lisp ; drown in parentheses + ;;erlang ; an elegant language for a more civilized age + ;;ess ; emacs speaks statistics + ;;factor + ;;faust ; dsp, but you get to keep your soul + ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) + ;;fsharp ; ML stands for Microsoft's Language + ;;fstar ; (dependent) types and (monadic) effects and Z3 + ;;gdscript ; the language you waited for + ;;(go +lsp) ; the hipster dialect + ;;(graphql +lsp) ; Give queries a REST + (haskell +lsp +dante) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; a language you can depend on + json ; At least it ain't XML + ;;(java +lsp) ; the poster child for carpal tunnel syndrome + javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + ;;kotlin ; a better, slicker Java(Script) + latex ; writing papers in Emacs has never been so fun + ;;lean ; for folks with too much to prove + ledger ; be audit you can be + lua ; one-based indices? one-based indices + markdown ; writing docs for people to ignore + ;;nim ; python + lisp at the speed of c + ;;nix ; I hereby declare "nix geht mehr!" + ;;ocaml ; an objective camel + (org + +journal + +roam2 + +pretty + +publish) ; organize your plain life in plain text + php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + ;;purescript ; javascript, but functional + python ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;raku ; the artist formerly known as perl6 + ;;rest ; Emacs as a REST client + ;;rst ; ReST in peace + ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good + ;;(scheme +guile) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor + ;;sml + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. + web ; the tubes + yaml ; JSON, but readable + ;;zig ; C, but simpler + + :email + (mu4e +org +gmail) + ;;notmuch + ;;(wanderlust +gmail) + + :app + + calendar + emms + ;;everywhere ; *leave* Emacs!? You must be joking + irc ; how neckbeards socialize + (rss +org) ; emacs as an RSS reader + ;;twitter ; twitter client https://twitter.com/vnought + + :config + ;;literate + (default +bindings +smartparens)) diff --git a/.config/doom/Old-2025.02.27/packages.el b/.config/doom/Old-2025.02.27/packages.el new file mode 100644 index 0000000..c9cc704 --- /dev/null +++ b/.config/doom/Old-2025.02.27/packages.el @@ -0,0 +1,89 @@ +;; -*- no-byte-compile: t; -*- +;;; $DOOMDIR/packages.el + +;; To install a package with Doom you must declare them here and run 'doom sync' +;; on the command line, then restart Emacs for the changes to take effect -- or +;; use 'M-x doom/reload'. + + +;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: +;(package! some-package) + +;; To install a package directly from a remote git repo, you must specify a +;; `:recipe'. You'll find documentation on what `:recipe' accepts here: +;; https://github.com/radian-software/straight.el#the-recipe-format +;(package! another-package +; :recipe (:host github :repo "username/repo")) + +;; If the package you are trying to install does not contain a PACKAGENAME.el +;; file, or is located in a subdirectory of the repo, you'll need to specify +;; `:files' in the `:recipe': +;(package! this-package +; :recipe (:host github :repo "username/repo" +; :files ("some-file.el" "src/lisp/*.el"))) + +;; If you'd like to disable a package included with Doom, you can do so here +;; with the `:disable' property: +;(package! builtin-package :disable t) + +;; You can override the recipe of a built in package without having to specify +;; all the properties for `:recipe'. These will inherit the rest of its recipe +;; from Doom or MELPA/ELPA/Emacsmirror: +;(package! builtin-package :recipe (:nonrecursive t)) +;(package! builtin-package-2 :recipe (:repo "myfork/package")) + +;; Specify a `:branch' to install a package from a particular branch or tag. +;; This is required for some packages whose default branch isn't 'master' (which +;; our package manager can't deal with; see radian-software/straight.el#279) +;(package! builtin-package :recipe (:branch "develop")) + +;; Use `:pin' to specify a particular commit to install. +;(package! builtin-package :pin "1a2b3c4d5e") + + +;; Doom's packages are pinned to a specific commit and updated from release to +;; release. The `unpin!' macro allows you to unpin single packages... +;(unpin! pinned-package) +;; ...or multiple packages +;(unpin! pinned-package another-pinned-package) +;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) +;(unpin! t) + +;;(package! org-roam +;; :recipe (:host github :repo "org-roam/org-roam" :branch "main")) +(package! citar-org-roam) +(package! org-roam-ui) +;;(package! emacsql-sqlite-builtin) +(package! undo-tree) +(package! org-board) +(package! pacmacs) +(package! flycheck-aspell) +(package! calfw) +(package! calfw-org) +(package! dired-open) +(package! dired-subtree) +(package! dirvish) +(package! dmenu) +(package! ednc) +(package! emojify) +(package! evil-tutor) +(package! exwm) +(package! imenu-list) +(package! ivy-posframe) +(package! mw-thesaurus) +(package! org-auto-tangle) +(package! org-web-tools) +(package! ox-gemini) +(package! peep-dired) +(package! password-store) +(package! rainbow-mode) +(package! resize-window) +(package! tldr) +(package! wc-mode) +(package! beacon) +(package! clippy) +(package! minimap) +(package! olivetti) +(package! org-excalidraw + :recipe (:host github :repo "wdavew/org-excalidraw" :branch "main")) +(package! org-modern) diff --git a/.config/doom/Old-2025.02.27/roam.el b/.config/doom/Old-2025.02.27/roam.el new file mode 100644 index 0000000..e47cfc7 --- /dev/null +++ b/.config/doom/Old-2025.02.27/roam.el @@ -0,0 +1,122 @@ +;; -*- lexical-binding: t; -*- + +(use-package org-roam + :ensure t + :demand t ;; Ensure org-roam is loaded by default + :init + (setq org-roam-v2-ack t) + :custom + (org-roam-directory "/home/christopher/Nextcloud/Notes/Org/org-roam") + (org-roam-completion-everywhere t) + + :bind (("C-c n l" . org-roam-buffer-toggle) + ("C-c n f" . org-roam-node-find) + ("C-c n i" . org-roam-node-insert) + ("C-c n I" . org-roam-node-insert-immediate) + ("C-c n p" . my/org-roam-find-project) + ("C-c n t" . my/org-roam-capture-task) + ("C-c n b" . my/org-roam-capture-inbox) + :map org-mode-map + ("C-M-i" . completion-at-point) + :map org-roam-dailies-map + ("Y" . org-roam-dailies-capture-yesterday) + ("T" . org-roam-dailies-capture-tomorrow)) + :bind-keymap + ("C-c n d" . org-roam-dailies-map) + :config + (require 'org-roam-dailies) ;; Ensure the keymap is available + (org-roam-db-autosync-mode)) + +(defun org-roam-node-insert-immediate (arg &rest args) + (interactive "P") + (let ((args (push arg args)) + (org-roam-capture-templates (list (append (car org-roam-capture-templates) + '(:immediate-finish t))))) + (apply #'org-roam-node-insert args))) + +(defun my/org-roam-filter-by-tag (tag-name) + (lambda (node) + (member tag-name (org-roam-node-tags node)))) + +(defun my/org-roam-list-notes-by-tag (tag-name) + (mapcar #'org-roam-node-file + (seq-filter + (my/org-roam-filter-by-tag tag-name) + (org-roam-node-list)))) + +(defun my/org-roam-refresh-agenda-list () + (interactive) + (setq org-agenda-files (my/org-roam-list-notes-by-tag "Project"))) + +;; Build the agenda list the first time for the session +(my/org-roam-refresh-agenda-list) + +(defun my/org-roam-project-finalize-hook () + "Adds the captured project file to `org-agenda-files' if the +capture was not aborted." + ;; Remove the hook since it was added temporarily + (remove-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook) + + ;; Add project file to the agenda list if the capture was confirmed + (unless org-note-abort + (with-current-buffer (org-capture-get :buffer) + (add-to-list 'org-agenda-files (buffer-file-name))))) + +(defun my/org-roam-find-project () + (interactive) + ;; Add the project file to the agenda after capture is finished + (add-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook) + + ;; Select a project file to open, creating it if necessary + (org-roam-node-find + nil + nil + (my/org-roam-filter-by-tag "Project") + :templates + '(("p" "project" plain "* Goals\n\n%?\n\n* Tasks\n\n** TODO Add initial tasks\n\n* Dates\n\n" + :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+category: ${title}\n#+filetags: Project") + :unnarrowed t)))) + +(defun my/org-roam-capture-inbox () + (interactive) + (org-roam-capture- :node (org-roam-node-create) + :templates '(("i" "inbox" plain "* %?" + :if-new (file+head "Inbox.org" "#+title: Inbox\n"))))) + +(defun my/org-roam-capture-task () + (interactive) + ;; Add the project file to the agenda after capture is finished + (add-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook) + + ;; Capture the new task, creating the project file if necessary + (org-roam-capture- :node (org-roam-node-read + nil + (my/org-roam-filter-by-tag "Project")) + :templates '(("p" "project" plain "** TODO %?" + :if-new (file+head+olp "%<%Y%m%d%H%M%S>-${slug}.org" + "#+title: ${title}\n#+category: ${title}\n#+filetags: Project" + ("Tasks")))))) + +(defun my/org-roam-copy-todo-to-today () + (interactive) + (let ((org-refile-keep t) ;; Set this to nil to delete the original! + (org-roam-dailies-capture-templates + '(("t" "tasks" entry "%?" + :if-new (file+head+olp "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n" ("Tasks"))))) + (org-after-refile-insert-hook #'save-buffer) + today-file + pos) + (save-window-excursion + (org-roam-dailies--capture (current-time) t) + (setq today-file (buffer-file-name)) + (setq pos (point))) + + ;; Only refile if the target file is different than the current file + (unless (equal (file-truename today-file) + (file-truename (buffer-file-name))) + (org-refile nil nil (list "Tasks" today-file nil pos))))) + +(add-to-list 'org-after-todo-state-change-hook + (lambda () + (when (equal org-state "DONE") + (my/org-roam-copy-todo-to-today)))) diff --git a/.config/doom/Old-2025.02.27/sword-to-org.el b/.config/doom/Old-2025.02.27/sword-to-org.el new file mode 100644 index 0000000..8db21e2 --- /dev/null +++ b/.config/doom/Old-2025.02.27/sword-to-org.el @@ -0,0 +1,224 @@ +;;; sword-to-org.el --- Convert Sword modules to Org outlines + +;; Author: Adam Porter +;; Url: http://github.com/alphapapa/sword-to-org +;; Version: 0.0.1-pre +;; Package-Requires: ((emacs "24.4") (dash "2.11") (s "1.10.0")) +;; Keywords: outlines, org-mode, sword, research, bible + +;;; Commentary: + +;; This package uses the `diatheke' program to convert Sword modules +;; to Org-mode outlines. For example, you can make an Org file +;; containing the entire text of the ESV module as an outline +;; structured by book/chapter/verse. Then you can add top-level +;; headings for Old/New Testaments, and then you have the whole Bible +;; as an Org file. Then you can do everything you can do in Org with +;; the text of the Bible! Add footnotes, links, tags, properties, +;; write your own commentaries under subheadings, organize research +;; with TODO items, export with `org-export', search with +;; `helm-org-rifle', etc. The list is endless. + +;;; Usage: + +;; First install `diatheke'. On Debian/Ubuntu it's in the `diatheke' +;; package. + +;; Open a buffer and run the command `sword-to-org-insert-outline'. +;; Choose the module (e.g. Bible translation) to use, then input a +;; passage reference or range (e.g. "Gen 1", "Jn 1:1", or even +;; "Gen-Rev"--that last one will take a few moments), and an Org +;; outline will be inserted in book/chapter/verse/text structure. + +;; You may customize `sword-to-org-default-module' so you don't have +;; to pick a module every time, and you can call the command with a +;; universal prefix (`C-u') to choose a different module. + +;; You may also use any of the `sword-to-org--' support functions in +;; your own programs. Consult the docstrings for instructions and +;; examples. + +;;; Code: + +;;;; Requirements + +(require 'cl-lib) +(require 'dash) +(require 's) + +;;;; Variables + +(defconst sword-to-org--diatheke-parse-line-regexp + (rx bol + ;; Book name + (group-n 1 (minimal-match (1+ anything))) + space + ;; chapter:verse + (group-n 2 (1+ digit)) ":" (group-n 3 (1+ digit)) ":" + ;; Passage text (which may start with a newline, in which case + ;; no text will be on the same line after chapter:verse) + (optional (1+ space) + (group-n 4 (1+ anything)))) + "Regexp to parse each line of output from `diatheke'.") + +(defgroup sword-to-org nil + "Settings for `sword-to-org'." + :link '(url-link "http://github.com/alphapapa/sword-to-org") + :group 'org) + +(defcustom sword-to-org-default-module nil + "Default module (e.g. Bible translation, like \"ESV\") to use." + :type '(choice (const :tag "None" nil) + (string :tag "Module abbreviation (e.g. \"ESV\")"))) + +;;;; Functions + +;;;;; Commands + +;;;###autoload +(defun sword-to-org-insert-outline (module key) + "Insert Org outline in current buffer for Sword MODULE and KEY. +The buffer will be switched to `text-mode' before inserting, to +improve performance, and then switched back to `org-mode' if +it was active." + (interactive (list (if (or current-prefix-arg + (not sword-to-org-default-module)) + (completing-read "Module: " (sword-to-org--diatheke-get-modules)) + sword-to-org-default-module) + (substring (buffer-name) nil -4))) + (let ((was-org-mode (eq major-mode 'org-mode))) + (when was-org-mode + (text-mode)) + (cl-loop with last-book + with last-chapter + for passage in (sword-to-org--diatheke-parse-text + (sword-to-org--diatheke-get-text module key)) + do (-let (((&plist :book book :chapter chapter :verse verse :text text) passage)) + ;; (unless (equal book last-book) + ;; (insert (format "%s\n\n" book)) + ;; (setq last-chapter nil) + ;; (setq last-book book)) + (unless (equal chapter last-chapter) + (insert (format "* %s %s\n\n" book chapter)) + (setq last-chapter chapter)) + (insert (format "** %s %s:%s\n\n%s\n\n" book chapter verse text)))) + (when was-org-mode + (org-mode)))) + +;;;###autoload +(defun sword-to-org-insert-passage (key &optional separate-lines module) + "Insert passage for reference KEY as plain text. +With prefix, prompt for module, otherwise use default module. +With double-prefix, insert each verse on its own line with +reference; otherwise, insert as single paragraph with reference +at the end." + (interactive (list (read-from-minibuffer "Passage: ") + (equal current-prefix-arg '(16)) + (if (or current-prefix-arg + (not sword-to-org-default-module)) + (completing-read "Module: " (sword-to-org--diatheke-get-modules)) + sword-to-org-default-module))) + (insert (sword-to-org--passage key :module module :paragraph (not separate-lines))) + (when (not separate-lines) + (insert " (" key ")"))) + +;;;;; Support + +(cl-defun sword-to-org--passage (key &key module paragraph) + "Return string for passage reference KEY. +If MODULE is nil, use default module. If PARAGRAPH is non-nil, +join all verses into a paragraph; otherwise put each verse on its +own line with reference." + (unless module + (setq module sword-to-org-default-module)) + (if paragraph + (s-join " " (cl-loop for passage in (sword-to-org--diatheke-parse-text (sword-to-org--diatheke-get-text module key)) + collect (plist-get passage :text))) + ;; NOTE: Using double-newline as verse separator so the verses + ;; can appear separately in Org exports from Org Babel blocks + ;; (for some reason, single newlines are replaced with spaces) + (s-join "\n\n" (cl-loop for passage in (sword-to-org--diatheke-parse-text (sword-to-org--diatheke-get-text module key)) + collect (-let (((&plist :book book :chapter chapter :verse verse :text text) passage)) + (format "%s %s:%s %s" book chapter verse text)))))) + +(defun sword-to-org--diatheke-get-modules () + "Return list of Sword modules from diatheke. +Only the module abbreviation is returned." + (cl-loop for line in (s-lines (with-temp-buffer + (call-process "diatheke" nil '(t nil) nil + "-b" "system" "-k" "modulelist") + (buffer-string))) + when (string-match (rx (group-n 1 (minimal-match (1+ (not (any ":"))))) " : ") line) + collect (match-string 1 line))) + +(defun sword-to-org--diatheke-get-text (module key) + "Return raw text from diatheke MODULE for KEY. +This simply calls `diatheke -b MODULE -k KEY' and returns the raw output. + +Examples: + +\(sword-to-org--diatheke-get-text \"ESV\" \"gen 1:1\")" + (with-temp-buffer + (call-process "diatheke" nil '(t nil) nil + "-b" module "-k" key) + (buffer-substring (point-min) (save-excursion + (goto-char (point-max)) + (forward-line -2) + (end-of-line) + (point))))) + +(defun sword-to-org--diatheke-parse-text (text &optional &key keep-newlines) + "Parse TEXT line-by-line, returning list of verse plists. +When KEEP-NEWLINES is non-nil, keep blank lines in text. + +Plists are in format (:book \"Genesis\" :chapter 1 :verse 1 + :text \"In the beginning...\"). + +Example: + +\(sword-to-org--diatheke-parse-text + (sword-to-org--diatheke-get-text \"ESV\" \"Philemon 1:1-3\") + :keep-newlines t)" + (cl-loop with result + with new-verse + for line in (s-lines text) + for parsed = (sword-to-org--diatheke-parse-line line) + if parsed + do (progn + (push new-verse result) + (setq new-verse parsed)) + else do (let* ((text (plist-get new-verse :text)) + (new-text (concat text + (if (s-present? line) + line + (when keep-newlines "\n"))))) + (plist-put new-verse :text new-text)) + finally return (cdr (progn + (push new-verse result) + (nreverse result))))) + +(defun sword-to-org--diatheke-parse-line (line) + "Return plist from LINE. If LINE is not the beginning of a verse, return nil. +You generally don't want to use this directly. Instead use +`sword-to-org--diatheke-parse-text'. + +Plist is in format (:book \"Genesis\" :chapter 1 :verse 1 + :text \"In the beginning...\"). + +For a complete example, see how +`sword-to-org--diatheke-parse-text' calls this function." + (if (s-present? line) + (when (string-match sword-to-org--diatheke-parse-line-regexp line) + (let ((book (match-string 1 line)) + (chapter (string-to-number (match-string 2 line))) + (verse (string-to-number (match-string 3 line))) + ;; Ensure text is present, which may not be the case if + ;; a verse starts with a newline. See + ;; + (text (when (s-present? (match-string 4 line)) + (s-trim (match-string 4 line))))) + (list :book book :chapter chapter :verse verse :text text))))) + +(provide 'sword-to-org) + +;;; sword-to-org.el ends here diff --git a/.config/doom/bookmarks b/.config/doom/bookmarks new file mode 100644 index 0000000..d6949fc --- /dev/null +++ b/.config/doom/bookmarks @@ -0,0 +1,10 @@ +;;;; Emacs Bookmark Format Version 1;;;; -*- coding: utf-8-emacs; mode: lisp-data -*- +;;; This format is meant to be slightly human-readable; +;;; nevertheless, you probably don't want to edit it. +;;; -*- End Of Bookmark File Format Version Stamp -*- +(("org-capture-last-stored" + (filename . "~/nc/Org/roam/20230110120652-start.org") + (front-context-string) + (rear-context-string . "\n#+title: start\n") + (position . 83)) +) diff --git a/.config/doom/config.el b/.config/doom/config.el new file mode 100644 index 0000000..af288a5 --- /dev/null +++ b/.config/doom/config.el @@ -0,0 +1,934 @@ +(beacon-mode 1) + +(setq bookmark-default-file "~/.config/doom/bookmarks") + +(map! :leader + (:prefix ("b". "buffer") + :desc "List bookmarks" "L" #'list-bookmarks + :desc "Set bookmark" "m" #'bookmark-set + :desc "Delete bookmark" "M" #'bookmark-set + :desc "Save current bookmarks to bookmark file" "w" #'bookmark-save)) + +(global-auto-revert-mode 1) +(setq global-auto-revert-non-file-buffers t) + +(evil-define-key 'normal ibuffer-mode-map + (kbd "f c") 'ibuffer-filter-by-content + (kbd "f d") 'ibuffer-filter-by-directory + (kbd "f f") 'ibuffer-filter-by-filename + (kbd "f m") 'ibuffer-filter-by-mode + (kbd "f n") 'ibuffer-filter-by-name + (kbd "f x") 'ibuffer-filter-disable + (kbd "g h") 'ibuffer-do-kill-lines + (kbd "g H") 'ibuffer-update) + +;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months +(defun dt/year-calendar (&optional year) + (interactive) + (require 'calendar) + (let* ( + (current-year (number-to-string (nth 5 (decode-time (current-time))))) + (month 0) + (year (if year year (string-to-number (format-time-string "%Y" (current-time)))))) + (switch-to-buffer (get-buffer-create calendar-buffer)) + (when (not (eq major-mode 'calendar-mode)) + (calendar-mode)) + (setq displayed-month month) + (setq displayed-year year) + (setq buffer-read-only nil) + (erase-buffer) + ;; horizontal rows + (dotimes (j 4) + ;; vertical columns + (dotimes (i 3) + (calendar-generate-month + (setq month (+ month 1)) + year + ;; indentation / spacing between months + (+ 5 (* 25 i)))) + (goto-char (point-max)) + (insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n)) + (widen) + (goto-char (point-max)) + (narrow-to-region (point-max) (point-max))) + (widen) + (goto-char (point-min)) + (setq buffer-read-only t))) + +(defun dt/scroll-year-calendar-forward (&optional arg event) + "Scroll the yearly calendar by year in a forward direction." + (interactive (list (prefix-numeric-value current-prefix-arg) + last-nonmenu-event)) + (unless arg (setq arg 0)) + (save-selected-window + (if (setq event (event-start event)) (select-window (posn-window event))) + (unless (zerop arg) + (let* ( + (year (+ displayed-year arg))) + (dt/year-calendar year))) + (goto-char (point-min)) + (run-hooks 'calendar-move-hook))) + +(defun dt/scroll-year-calendar-backward (&optional arg event) + "Scroll the yearly calendar by year in a backward direction." + (interactive (list (prefix-numeric-value current-prefix-arg) + last-nonmenu-event)) + (dt/scroll-year-calendar-forward (- (or arg 1)) event)) + +(map! :leader + :desc "Scroll year calendar backward" "" #'dt/scroll-year-calendar-backward + :desc "Scroll year calendar forward" "" #'dt/scroll-year-calendar-forward) + +(defalias 'year-calendar 'dt/year-calendar) + +(use-package! calfw) +(use-package! calfw-ical) +(use-package! calfw-org) + +(setq centaur-tabs-set-bar 'over + centaur-tabs-set-icons t + centaur-tabs-gray-out-icons 'buffer + centaur-tabs-height 24 + centaur-tabs-set-modified-marker t + centaur-tabs-style "bar" + centaur-tabs-modified-marker "•") +(map! :leader + :desc "Toggle tabs globally" "t c" #'centaur-tabs-mode + :desc "Toggle tabs local display" "t C" #'centaur-tabs-local-mode) +(evil-define-key 'normal centaur-tabs-mode-map (kbd "g ") 'centaur-tabs-forward ; default Doom binding is 'g t' + (kbd "g ") 'centaur-tabs-backward ; default Doom binding is 'g T' + (kbd "g ") 'centaur-tabs-forward-group + (kbd "g ") 'centaur-tabs-backward-group) + +(map! :leader + (:prefix ("c h" . "Help info from Clippy") + :desc "Clippy describes function under point" "f" #'clippy-describe-function + :desc "Clippy describes variable under point" "v" #'clippy-describe-variable)) + +(map! :leader + (:prefix ("d" . "dired") + :desc "Open dired" "d" #'dired + :desc "Dired jump to current" "j" #'dired-jump) + (:after dired + (:map dired-mode-map + :desc "Peep-dired image previews" "d p" #'peep-dired + :desc "Dired view file" "d v" #'dired-view-file))) + +(evil-define-key 'normal dired-mode-map + (kbd "M-RET") 'dired-display-file + (kbd "h") 'dired-up-directory + (kbd "l") 'dired-open-file ; use dired-find-file instead of dired-open. + (kbd "m") 'dired-mark + (kbd "t") 'dired-toggle-marks + (kbd "u") 'dired-unmark + (kbd "C") 'dired-do-copy + (kbd "D") 'dired-do-delete + (kbd "J") 'dired-goto-file + (kbd "M") 'dired-do-chmod + (kbd "O") 'dired-do-chown + (kbd "P") 'dired-do-print + (kbd "R") 'dired-do-rename + (kbd "T") 'dired-do-touch + (kbd "Y") 'dired-copy-filenamecopy-filename-as-kill ; copies filename to kill ring. + (kbd "Z") 'dired-do-compress + (kbd "+") 'dired-create-directory + (kbd "-") 'dired-do-kill-lines + (kbd "% l") 'dired-downcase + (kbd "% m") 'dired-mark-files-regexp + (kbd "% u") 'dired-upcase + (kbd "* %") 'dired-mark-files-regexp + (kbd "* .") 'dired-mark-extension + (kbd "* /") 'dired-mark-directories + (kbd "; d") 'epa-dired-do-decrypt + (kbd "; e") 'epa-dired-do-encrypt) +;; Get file icons in dired +;;(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) +;; With dired-open plugin, you can launch external programs for certain extensions +;; For example, I set all .png files to open in 'sxiv' and all .mp4 files to open in 'mpv' +(setq dired-open-extensions '(("gif" . "sxiv") + ("jpg" . "sxiv") + ("png" . "sxiv") + ("mkv" . "mpv") + ("mp4" . "mpv"))) + +(evil-define-key 'normal peep-dired-mode-map + (kbd "j") 'peep-dired-next-file + (kbd "k") 'peep-dired-prev-file) +(add-hook 'peep-dired-hook 'evil-normalize-keymaps) + +(setq delete-by-moving-to-trash t + trash-directory "~/.local/share/Trash/files/") + +(setq doom-theme 'doom-one) +(map! :leader + :desc "Load new theme" "h t" #'counsel-load-theme) + +(ednc-mode 1) + +(defun show-notification-in-buffer (old new) + (let ((name (format "Notification %d" (ednc-notification-id (or old new))))) + (with-current-buffer (get-buffer-create name) + (if new (let ((inhibit-read-only t)) + (if old (erase-buffer) (ednc-view-mode)) + (insert (ednc-format-notification new t)) + (pop-to-buffer (current-buffer))) + (kill-buffer))))) + +(add-hook 'ednc-notification-presentation-functions + #'show-notification-in-buffer) + +(evil-define-key 'normal ednc-view-mode-map + (kbd "d") 'ednc-dismiss-notification + (kbd "RET") 'ednc-invoke-action + (kbd "e") 'ednc-toggle-expanded-view) + +(setq elfeed-goodies/entry-pane-size 0.5) + +(evil-define-key 'normal elfeed-show-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +(evil-define-key 'normal elfeed-search-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +(setq elfeed-feeds (quote + (("https://www.reddit.com/r/linux.rss" reddit linux) + ("https://www.reddit.com/r/commandline.rss" reddit commandline) + ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) + ("https://www.reddit.com/r/emacs.rss" reddit emacs) + ("https://www.gamingonlinux.com/article_rss.php" gaming linux) + ("https://hackaday.com/blog/feed/" hackaday linux) + ("https://opensource.com/feed" opensource linux) + ("https://linux.softpedia.com/backend.xml" softpedia linux) + ("https://itsfoss.com/feed/" itsfoss linux) + ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) + ("https://www.phoronix.com/rss.php" phoronix linux) + ("http://feeds.feedburner.com/d0od" omgubuntu linux) + ("https://www.computerworld.com/index.rss" computerworld linux) + ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) + ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) + ("https://betanews.com/feed" betanews linux) + ("http://lxer.com/module/newswire/headlines.rss" lxer linux)))) + +(emms-all) +(emms-default-players) +(emms-mode-line 1) +(emms-playing-time 1) +(setq emms-source-file-default-directory "~/Music/" + emms-playlist-buffer-name "*Music*" + emms-info-asynchronously t + emms-source-file-directory-tree-function 'emms-source-file-directory-tree-find) +(map! :leader + (:prefix ("a" . "EMMS audio player") + :desc "Go to emms playlist" "a" #'emms-playlist-mode-go + :desc "Emms pause track" "x" #'emms-pause + :desc "Emms stop track" "s" #'emms-stop + :desc "Emms play previous track" "p" #'emms-previous + :desc "Emms play next track" "n" #'emms-next)) + +(use-package emojify + :hook (after-init . global-emojify-mode)) + +(map! :leader + (:prefix ("e". "evaluate/ERC/EWW") + :desc "Launch ERC with TLS connection" "E" #'erc-tls)) + +(setq erc-prompt (lambda () (concat "[" (buffer-name) "]")) + erc-server "irc.libera.chat" + erc-nick "distrotube" + erc-user-full-name "Derek Taylor" + erc-track-shorten-start 24 + erc-autojoin-channels-alist '(("irc.libera.chat" "#archlinux" "#linux" "#emacs")) + erc-kill-buffer-on-part t + erc-fill-column 100 + erc-fill-function 'erc-fill-static + erc-fill-static-center 20 + ;; erc-auto-query 'bury + ) + +(map! :leader + (:prefix ("e". "evaluate/ERC/EWW") + :desc "Evaluate elisp in buffer" "b" #'eval-buffer + :desc "Evaluate defun" "d" #'eval-defun + :desc "Evaluate elisp expression" "e" #'eval-expression + :desc "Evaluate last sexpression" "l" #'eval-last-sexp + :desc "Evaluate elisp in region" "r" #'eval-region)) + +(setq browse-url-browser-function 'eww-browse-url) +(map! :leader + :desc "Search web for text between BEG/END" + "s w" #'eww-search-words + (:prefix ("e" . "evaluate/ERC/EWW") + :desc "Eww web browser" "w" #'eww + :desc "Eww reload page" "R" #'eww-reload)) + +(autoload 'exwm-enable "exwm-config.el") + +(setq doom-font (font-spec :family "Fira Code" :size 15) + doom-variable-pitch-font (font-spec :family "Ubuntu" :size 15) + doom-big-font (font-spec :family "Fira Code" :size 24)) +(after! doom-themes + (setq doom-themes-enable-bold t + doom-themes-enable-italic t)) +(custom-set-faces! + '(font-lock-comment-face :slant italic) + '(font-lock-keyword-face :slant italic)) + +(setq imenu-list-focus-after-activation t) + +(map! :leader + (:prefix ("s" . "Search") + :desc "Menu to jump to places in buffer" "i" #'counsel-imenu)) + +(map! :leader + (:prefix ("t" . "Toggle") + :desc "Toggle imenu shown in a sidebar" "i" #'imenu-list-smart-toggle)) + +(defun dt/insert-todays-date (prefix) + (interactive "P") + (let ((format (cond + ((not prefix) "%A, %B %d, %Y") + ((equal prefix '(4)) "%m-%d-%Y") + ((equal prefix '(16)) "%Y-%m-%d")))) + (insert (format-time-string format)))) + +(require 'calendar) +(defun dt/insert-any-date (date) + "Insert DATE using the current locale." + (interactive (list (calendar-read-date))) + (insert (calendar-date-string date))) + +(map! :leader + (:prefix ("i d" . "Insert date") + :desc "Insert any date" "a" #'dt/insert-any-date + :desc "Insert todays date" "t" #'dt/insert-todays-date)) + +(setq ivy-posframe-display-functions-alist + '((swiper . ivy-posframe-display-at-point) + (complete-symbol . ivy-posframe-display-at-point) + (counsel-M-x . ivy-display-function-fallback) + (counsel-esh-history . ivy-posframe-display-at-window-center) + (counsel-describe-function . ivy-display-function-fallback) + (counsel-describe-variable . ivy-display-function-fallback) + (counsel-find-file . ivy-display-function-fallback) + (counsel-recentf . ivy-display-function-fallback) + (counsel-register . ivy-posframe-display-at-frame-bottom-window-center) + (dmenu . ivy-posframe-display-at-frame-top-center) + (nil . ivy-posframe-display)) + ivy-posframe-height-alist + '((swiper . 20) + (dmenu . 20) + (t . 10))) +(ivy-posframe-mode 1) ; 1 enables posframe-mode, 0 disables it. + +(map! :leader + (:prefix ("v" . "Ivy") + :desc "Ivy push view" "v p" #'ivy-push-view + :desc "Ivy switch view" "v s" #'ivy-switch-view)) + +(setq display-line-numbers-type t) +(map! :leader + :desc "Comment or uncomment lines" "TAB TAB" #'comment-line + (:prefix ("t" . "toggle") + :desc "Toggle line numbers" "l" #'doom/toggle-line-numbers + :desc "Toggle line highlight in frame" "h" #'hl-line-mode + :desc "Toggle line highlight globally" "H" #'global-hl-line-mode + :desc "Toggle truncate lines" "t" #'toggle-truncate-lines)) + +(custom-set-faces + '(markdown-header-face ((t (:inherit font-lock-function-name-face :weight bold :family "variable-pitch")))) + '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.7)))) + '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.6)))) + '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5)))) + '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.4)))) + '(markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.3)))) + '(markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.2))))) + +(setq minimap-window-location 'right) +(map! :leader + (:prefix ("t" . "toggle") + :desc "Toggle minimap-mode" "m" #'minimap-mode)) + +(set-face-attribute 'mode-line nil :font "Ubuntu Mono-13") +(setq doom-modeline-height 30 ;; sets modeline height + doom-modeline-bar-width 5 ;; sets right bar width + doom-modeline-persp-name t ;; adds perspective name to modeline + doom-modeline-persp-icon t) ;; adds folder icon next to persp name + +(xterm-mouse-mode 1) + +(require 'mu4e) +(set-email-account! + "gmail" + '((mu4e-sent-folder . "/[Gmail]/Sent Mail") + (mu4e-trash-folder . "/[Gmail]/Bin") + (mu4e-drafts-folder . "/[Gmail]/Drafts") + (mu4e-refile-folder . "/[Gmail]/All Mail") + ;(smtpmail-smtp-server . "smtp.gmail.com") + ;(smtpmail-default-smtp-server . "smtp.gmail.com") + (user-mail-address . "christopherrparis1@gmail.com") + (user-full-name . "Christopher Paris")) + ;(smtpmail-smtp-service . 587) + ;(smtpmail-stream-type . starttls)) + ;(smtpmail-smtp-user . "christopherrparis1@gmail.com")) + t) +(require 'mu4e-org) +(setq mu4e-get-mail-command "mbsync gmail" + mu4e-change-filenames-when-moving t + ;; get emails and index every 5 minutes + mu4e-update-interval 300 + ;; send emails with format=flowed + mu4e-compose-format-flowed t + ;; no need to run cleanup after indexing for gmail + mu4e-index-cleanup nil + mu4e-index-lazy-check t + ;; more sensible date format + mu4e-headers-date-format "%d.%m.%y") +(require 'smtpmail) +(setq sendmail-program "msmtp" + message-sendmail-extra-arguments '("--read-envelope-from") + message-sendmail-f-is-evil 't + ;message-send-mail-function 'smtpmail-send-it + message-send-mail-function 'message-send-mail-with-sendmail + smtpmail-smtp-service 587 + smtpmail-smtp-server "smtp.gmail.com" + smtpmail-default-smtp-server "smtp.gmail.com" + smtpmail-stream-type 'starttls) + ;(smtpmail-smtp-user . "christopherrparis1@gmail.com")) + +(defun efs/capture-mail-follow-up (msg) + (interactive) + (call-interactively 'org-store-link) + (org-capture nil "mf")) + +(defun efs/capture-mail-read-later (msg) + (interactive) + (call-interactively 'org-store-link) + (org-capture nil "mr")) + +;; Add custom actions for our capture templates +(add-to-list 'mu4e-headers-actions + '("follow up" . efs/capture-mail-follow-up) t) +(add-to-list 'mu4e-view-actions + '("follow up" . efs/capture-mail-follow-up) t) +(add-to-list 'mu4e-headers-actions + '("read later" . efs/capture-mail-read-later) t) +(add-to-list 'mu4e-view-actions + '("read later" . efs/capture-mail-read-later) t) + +(defun efs/store-link-to-mu4e-query () + (interactive) + (let ((org-mu4e-link-query-in-headers-mode t)) + (call-interactively 'org-store-link))) + +(after! neotree + (setq neo-smart-open t + neo-window-fixed-size nil)) +(after! doom-themes + (setq doom-neotree-enable-variable-pitch t)) +(map! :leader + :desc "Toggle neotree file viewer" "t n" #'neotree-toggle + :desc "Open directory in neotree" "d n" #'neotree-dir) + +(map! :leader + (:prefix ("=" . "open file") + :desc "Edit agenda file" "=" #'(lambda () (interactive) (find-file "~/.config/doom/start.org")) + :desc "Edit agenda file" "a" #'(lambda () (interactive) (find-file "~/Nextcloud/Notes/Org/agenda.org")) + :desc "Edit doom config.org" "c" #'(lambda () (interactive) (find-file "~/.config/doom/config.org")) + :desc "Edit doom init.el" "i" #'(lambda () (interactive) (find-file "~/.config/doom/init.el")) + :desc "Edit doom packages.el" "p" #'(lambda () (interactive) (find-file "~/.config/doom/packages.el")))) +(map! :leader + (:prefix ("= e" . "open eshell files") + :desc "Edit eshell aliases" "a" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) + :desc "Edit eshell profile" "p" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/profile")))) + +(map! :leader + :desc "Org babel tangle" "m B" #'org-babel-tangle) +(after! org + (setq org-directory "~/Nextcloud/Notes/Org/" + org-default-notes-file (expand-file-name "notes.org" org-directory) + org-ellipsis " ▼ " + org-superstar-headline-bullets-list '("◉" "●" "○" "◆" "●" "○" "◆") + org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦)) ; changes +/- symbols in item lists + org-log-done 'time + org-hide-emphasis-markers t + ;; ex. of org-link-abbrev-alist in action + ;; [[arch-wiki:Name_of_Page][Description]] + org-link-abbrev-alist ; This overwrites the default Doom org-link-abbrev-list + '(("google" . "http://www.google.com/search?q=") + ("arch-wiki" . "https://wiki.archlinux.org/index.php/") + ("ddg" . "https://duckduckgo.com/?q=") + ("wiki" . "https://en.wikipedia.org/wiki/")) + org-table-convert-region-max-lines 20000 + org-todo-keywords ; This overwrites the default Doom org-todo-keywords + '((sequence + "TODO(t)" ; A task that is ready to be tackled + "BLOG(b)" ; Blog writing assignments + "GYM(g)" ; Things to accomplish at the gym + "PROJ(p)" ; A project that contains other tasks + "VIDEO(v)" ; Video assignments + "WAIT(w)" ; Something is holding up this task + "|" ; The pipe necessary to separate "active" states and "inactive" states + "DONE(d)" ; Task has been completed + "CANCELLED(c)" )) ; Task has been cancelled + org-log-into-drawer t + org-capture-templates + '(("p" "Private templates") + ("pt" "TODO entry" entry + (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" "Capture") + (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) + ("pj" "Journal entry" entry (file+olp+datetree + "~/Nextcloud/Notes/Org/org-roam/20241023165214-journal.org") "* %U - %^{Activity}") + ("pb" "Add book to read" entry (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" + "Books To Read") (file "~/Nextcloud/Notes/Org/tpl-book.txt") + :empty-lines-after 2) + + ("w" "Work templates") + ("wt" "TODO entry" entry + (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315170859-mywork.org" "Capture") + (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) + ("wl" "Worklog entry" entry (file+olp+datetree + "~/Nextcloud/Notes/Org/org-roam/20241024113312-worklog.org") "* %U - %^{Activity}") + ("m" "Email Workflow") + ("mf" "Follow Up" entry (file+olp "~/Nextcloud/Notes/Org/Mail.org" "Follow Up") + "* TODO Follow up with %:fromname on %a\nSCHEDULED:%t\nDEADLINE: %(org-insert-time-stamp (org-read-date nil t \"+2d\"))\n\n%i" :immediate-finish t) + ("mr" "Read Later" entry (file+olp "~/Nextcloud/Notes/Org/Mail.org" "Read Later") + "* TODO Read %:subject\nSCHEDULED:%t\nDEADLINE: %(org-insert-time-stamp (org-read-date nil t \"+2d\"))\n\n%a\n\n%i" :immediate-finish t)) + + + org-excalidraw-directory "~/Nextcloud/Notes/Org/excalidraw")) + +(after! org + (setq org-agenda-files + '(("~/Nextcloud/Notes/Org/agenda.org") + ("~/Nextcloud/Notes/Org/Mail.org")))) + +(setq + ;; org-fancy-priorities-list '("[A]" "[B]" "[C]") + ;; org-fancy-priorities-list '("❗" "[B]" "[C]") + org-fancy-priorities-list '("🟥" "🟧" "🟨") + org-priority-faces + '((?A :foreground "#ff6c6b" :weight bold) + (?B :foreground "#98be65" :weight bold) + (?C :foreground "#c678dd" :weight bold)) + org-agenda-block-separator 8411) + +(setq org-agenda-custom-commands + '(("v" "A better agenda view" + ((tags "PRIORITY=\"A\"" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "High-priority unfinished tasks:"))) + (tags "PRIORITY=\"B\"" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "Medium-priority unfinished tasks:"))) + (tags "PRIORITY=\"C\"" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "Low-priority unfinished tasks:"))) + (tags "customtag" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "Tasks marked with customtag:"))) + + (agenda "") + (alltodo ""))))) + +(use-package! org-auto-tangle + :defer t + :hook (org-mode . org-auto-tangle-mode) + :config + (setq org-auto-tangle-default t)) + +(defun dt/insert-auto-tangle-tag () + "Insert auto-tangle tag in a literate config." + (interactive) + (evil-org-open-below 1) + (insert "#+auto_tangle: t ") + (evil-force-normal-state)) + +(map! :leader + :desc "Insert auto_tangle tag" "i a" #'dt/insert-auto-tangle-tag) + +(defun dt/org-colors-doom-one () + "Enable Doom One colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.175 "#51afef" ultra-bold) + (org-level-2 1.15 "#c678dd" extra-bold) + (org-level-3 1.125 "#98be65" bold) + (org-level-4 1.1 "#da8548" semi-bold) + (org-level-5 1.075 "#5699af" normal) + (org-level-6 1.05 "#a9a1e1" normal) + (org-level-7 1.025 "#46d9ff" normal) + (org-level-8 1.0 "#ff6c6b" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-dracula () + "Enable Dracula colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#8be9fd" ultra-bold) + (org-level-2 1.6 "#bd93f9" extra-bold) + (org-level-3 1.5 "#50fa7b" bold) + (org-level-4 1.4 "#ff79c6" semi-bold) + (org-level-5 1.3 "#9aedfe" normal) + (org-level-6 1.2 "#caa9fa" normal) + (org-level-7 1.1 "#5af78e" normal) + (org-level-8 1.0 "#ff92d0" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-gruvbox-dark () + "Enable Gruvbox Dark colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#458588" ultra-bold) + (org-level-2 1.6 "#b16286" extra-bold) + (org-level-3 1.5 "#98971a" bold) + (org-level-4 1.4 "#fb4934" semi-bold) + (org-level-5 1.3 "#83a598" normal) + (org-level-6 1.2 "#d3869b" normal) + (org-level-7 1.1 "#d79921" normal) + (org-level-8 1.0 "#8ec07c" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-monokai-pro () + "Enable Monokai Pro colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#78dce8" ultra-bold) + (org-level-2 1.6 "#ab9df2" extra-bold) + (org-level-3 1.5 "#a9dc76" bold) + (org-level-4 1.4 "#fc9867" semi-bold) + (org-level-5 1.3 "#ff6188" normal) + (org-level-6 1.2 "#ffd866" normal) + (org-level-7 1.1 "#78dce8" normal) + (org-level-8 1.0 "#ab9df2" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-nord () + "Enable Nord colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#81a1c1" ultra-bold) + (org-level-2 1.6 "#b48ead" extra-bold) + (org-level-3 1.5 "#a3be8c" bold) + (org-level-4 1.4 "#ebcb8b" semi-bold) + (org-level-5 1.3 "#bf616a" normal) + (org-level-6 1.2 "#88c0d0" normal) + (org-level-7 1.1 "#81a1c1" normal) + (org-level-8 1.0 "#b48ead" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-oceanic-next () + "Enable Oceanic Next colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#6699cc" ultra-bold) + (org-level-2 1.6 "#c594c5" extra-bold) + (org-level-3 1.5 "#99c794" bold) + (org-level-4 1.4 "#fac863" semi-bold) + (org-level-5 1.3 "#5fb3b3" normal) + (org-level-6 1.2 "#ec5f67" normal) + (org-level-7 1.1 "#6699cc" normal) + (org-level-8 1.0 "#c594c5" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-palenight () + "Enable Palenight colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#82aaff" ultra-bold) + (org-level-2 1.6 "#c792ea" extra-bold) + (org-level-3 1.5 "#c3e88d" bold) + (org-level-4 1.4 "#ffcb6b" semi-bold) + (org-level-5 1.3 "#a3f7ff" normal) + (org-level-6 1.2 "#e1acff" normal) + (org-level-7 1.1 "#f07178" normal) + (org-level-8 1.0 "#ddffa7" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-solarized-dark () + "Enable Solarized Dark colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#268bd2" ultra-bold) + (org-level-2 1.6 "#d33682" extra-bold) + (org-level-3 1.5 "#859900" bold) + (org-level-4 1.4 "#b58900" semi-bold) + (org-level-5 1.3 "#cb4b16" normal) + (org-level-6 1.2 "#6c71c4" normal) + (org-level-7 1.1 "#2aa198" normal) + (org-level-8 1.0 "#657b83" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-solarized-light () + "Enable Solarized Light colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#268bd2" ultra-bold) + (org-level-2 1.6 "#d33682" extra-bold) + (org-level-3 1.5 "#859900" bold) + (org-level-4 1.4 "#b58900" semi-bold) + (org-level-5 1.3 "#cb4b16" normal) + (org-level-6 1.2 "#6c71c4" normal) + (org-level-7 1.1 "#2aa198" normal) + (org-level-8 1.0 "#657b83" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-tomorrow-night () + "Enable Tomorrow Night colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#81a2be" ultra-bold) + (org-level-2 1.6 "#b294bb" extra-bold) + (org-level-3 1.5 "#b5bd68" bold) + (org-level-4 1.4 "#e6c547" semi-bold) + (org-level-5 1.3 "#cc6666" normal) + (org-level-6 1.2 "#70c0ba" normal) + (org-level-7 1.1 "#b77ee0" normal) + (org-level-8 1.0 "#9ec400" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +;; Load our desired dt/org-colors-* theme on startup +(dt/org-colors-doom-one) + +(use-package ox-man) +(use-package ox-gemini) + +(setq org-journal-dir "~/Nextcloud/Notes/Org/journal/" + org-journal-date-prefix "* " + org-journal-time-prefix "** " + org-journal-date-format "%B %d, %Y (%A) " + org-journal-file-format "%Y-%m-%d.org") + +(setq org-publish-use-timestamps-flag nil) +(setq org-export-with-broken-links t) +(setq org-publish-project-alist + '(("distro.tube without manpages" + :base-directory "~/nc/gitlab-repos/distro.tube/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/" + :recursive t + :exclude "org-html-themes/.*\\|man-org/man*" + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man0p" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man0p/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man0p/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man1" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man1p" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1p/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1p/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man2" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man2/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man2/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man3" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man3p" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3p/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3p/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man4" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man4/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man4/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man5" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man5/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man5/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man6" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man6/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man6/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man7" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man7/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man7/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man8" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man8/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man8/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("org-static" + :base-directory "~/Org/website" + :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" + :publishing-directory "~/public_html/" + :recursive t + :exclude ".*/org-html-themes/.*" + :publishing-function org-publish-attachment) + ("dtos.dev" + :base-directory "~/nc/gitlab-repos/dtos.dev/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/dtos.dev/html/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + + )) + +(after! org + (setq org-roam-directory "~/Nextcloud/Notes/Org/org-roam/" + org-roam-graph-viewer "/usr/bin/brave" + org-roam-completion-everywhere t)) + +(map! :leader + (:prefix ("n r" . "org-roam") + :desc "Completion at point" "c" #'completion-at-point + :desc "Find node" "f" #'org-roam-node-find + :desc "Show graph" "g" #'org-roam-graph + :desc "Insert node" "i" #'org-roam-node-insert + :desc "Capture to node" "n" #'org-roam-capture + :desc "Toggle roam buffer" "r" #'org-roam-buffer-toggle)) + +(use-package! password-store) + +(map! :leader + :desc "Switch to perspective NAME" "DEL" #'persp-switch + :desc "Switch to buffer in perspective" "," #'persp-switch-to-buffer + :desc "Switch to next perspective" "]" #'persp-next + :desc "Switch to previous perspective" "[" #'persp-prev + :desc "Add a buffer current perspective" "+" #'persp-add-buffer + :desc "Remove perspective by name" "-" #'persp-remove-by-name) + +(define-globalized-minor-mode global-rainbow-mode rainbow-mode + (lambda () + (when (not (memq major-mode + (list 'org-agenda-mode))) + (rainbow-mode 1)))) +(global-rainbow-mode 1 ) + +(map! :leader + (:prefix ("r" . "registers") + :desc "Copy to register" "c" #'copy-to-register + :desc "Frameset to register" "f" #'frameset-to-register + :desc "Insert contents of register" "i" #'insert-register + :desc "Jump to register" "j" #'jump-to-register + :desc "List registers" "l" #'list-registers + :desc "Number to register" "n" #'number-to-register + :desc "Interactively choose a register" "r" #'counsel-register + :desc "View a register" "v" #'view-register + :desc "Window configuration to register" "w" #'window-configuration-to-register + :desc "Increment register" "+" #'increment-register + :desc "Point to register" "SPC" #'point-to-register)) + +(setq shell-file-name "/bin/fish" + vterm-max-scrollback 5000) +(setq eshell-rc-script "~/.config/doom/eshell/profile" + eshell-aliases-file "~/.config/doom/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")) +(map! :leader + :desc "Eshell" "e s" #'eshell + :desc "Eshell popup toggle" "e t" #'+eshell/toggle + :desc "Counsel eshell history" "e h" #'counsel-esh-history + :desc "Vterm popup toggle" "v t" #'+vterm/toggle) + +(defun prefer-horizontal-split () + (set-variable 'split-height-threshold nil t) + (set-variable 'split-width-threshold 40 t)) ; make this as low as needed +(add-hook 'markdown-mode-hook 'prefer-horizontal-split) +(map! :leader + :desc "Clone indirect buffer other window" "b c" #'clone-indirect-buffer-other-window) + +(setq initial-buffer-choice "~/.config/doom/start.org") + +(define-minor-mode start-mode + "Provide functions for custom start page." + :lighter " start" + :keymap (let ((map (make-sparse-keymap))) + ;;(define-key map (kbd "M-z") 'eshell) + (evil-define-key 'normal start-mode-map + (kbd "1") '(lambda () (interactive) (find-file "~/.config/doom/config.org")) + (kbd "2") '(lambda () (interactive) (find-file "~/.config/doom/init.el")) + (kbd "3") '(lambda () (interactive) (find-file "~/.config/doom/packages.el")) + (kbd "4") '(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) + (kbd "5") '(lambda () (interactive) (find-file "~/.config/doom/eshell/profile"))) + map)) + +(add-hook 'start-mode-hook 'read-only-mode) ;; make start.org read-only; use 'SPC t r' to toggle off read-only. +(provide 'start-mode) + +(add-to-list 'default-frame-alist '(alpha-background . 95)) + +(map! :leader + (:prefix ("w" . "window") + :desc "Winner redo" "" #'winner-redo + :desc "Winner undo" "" #'winner-undo)) + +(map! :leader + :desc "Zap to char" "z" #'zap-to-char + :desc "Zap up to char" "Z" #'zap-up-to-char) diff --git a/.config/doom/config.org b/.config/doom/config.org new file mode 100644 index 0000000..3b7e6e9 --- /dev/null +++ b/.config/doom/config.org @@ -0,0 +1,1540 @@ +#+TITLE: DT's Doom Emacs Config +#+AUTHOR: Derek Taylor (DT) +#+DESCRIPTION: DT's personal Doom Emacs config. +#+STARTUP: showeverything + +* TABLE OF CONTENTS :toc: +- [[#about-this-config][ABOUT THIS CONFIG]] + - [[#prerequisites][PREREQUISITES:]] +- [[#beacon][BEACON]] +- [[#bookmarks-and-buffers][BOOKMARKS AND BUFFERS]] + - [[#bookmarks][Bookmarks]] + - [[#buffers][Buffers]] + - [[#global-auto-revert][Global Auto Revert]] + - [[#keybindings-within-ibuffer-mode][Keybindings within ibuffer mode]] +- [[#calendar][CALENDAR]] +- [[#centaur-tabs][CENTAUR-TABS]] +- [[#clippy][CLIPPY]] +- [[#dired][DIRED]] + - [[#keybindings-to-open-dired][Keybindings To Open Dired]] + - [[#keybindings-within-dired][Keybindings Within Dired]] + - [[#keybindings-within-dired-with-peep-dired-mode-enabled][Keybindings Within Dired With Peep-Dired-Mode Enabled]] + - [[#making-deleted-files-go-to-trash-can][Making deleted files go to trash can]] +- [[#doom-theme][DOOM THEME]] +- [[#ednc-notifications][EDNC (Notifications)]] +- [[#elfeed][ELFEED]] +- [[#emms][EMMS]] +- [[#emojis][EMOJIS]] +- [[#erc][ERC]] +- [[#evaluate-elisp-expressions][EVALUATE ELISP EXPRESSIONS]] +- [[#eww][EWW]] +- [[#exwm][EXWM]] +- [[#fonts][FONTS]] +- [[#imenu][IMENU]] +- [[#insert-date][INSERT DATE]] +- [[#ivy][IVY]] + - [[#ivy-posframe][IVY-POSFRAME]] + - [[#ivy-keybindings][IVY KEYBINDINGS]] +- [[#line-settings][LINE SETTINGS]] +- [[#markdown][MARKDOWN]] +- [[#minimap][MINIMAP]] +- [[#modeline][MODELINE]] +- [[#mouse-support][MOUSE SUPPORT]] +- [[#mu4e][MU4E]] + - [[#system-crafters---mu4e-quick-capturing][System Crafters - Mu4e quick Capturing]] + - [[#system-crafters---mu4e-store-link-to-current-query][System Crafters - Mu4e store link to current query:]] +- [[#neotree][NEOTREE]] +- [[#open-specific-files][OPEN SPECIFIC FILES]] +- [[#org-mode][ORG MODE]] + - [[#org-agenda][Org-agenda]] + - [[#org-auto-tangle][Org-auto-tangle]] + - [[#org-fonts][Org fonts]] + - [[#org-export][Org-export]] + - [[#org-journal][Org-journal]] + - [[#org-publish][Org-publish]] + - [[#org-roam][Org-roam]] +- [[#password-store][PASSWORD STORE]] +- [[#perspective][PERSPECTIVE]] +- [[#rainbow-mode][RAINBOW MODE]] +- [[#registers][REGISTERS]] +- [[#shells][SHELLS]] +- [[#splits][SPLITS]] +- [[#start-page][START PAGE]] +- [[#transparency][TRANSPARENCY]] +- [[#winner-mode][WINNER MODE]] +- [[#zap-to-char][ZAP TO CHAR]] + +* ABOUT THIS CONFIG +This is my personal Doom Emacs config. Doom Emacs is a distribution of Emacs that uses the "evil" keybindings (Vim keybindings) and includes a number of nice extensions and a bit of configuration out of the box. I am maintaining this config not just for myself, but also for those that want to explore some of what is possible with Emacs. I will add a lot of examples of plugins and settings, some of them I may not even use personally. I do this because many people following me on YouTube look at my configs as "documentation". + +** PREREQUISITES: +This is packages that need to be installed for this configuration. + +*** ARCH Linux +- fish +- pass +- ttf-ubuntu-font-family +- ttf-jetbrains-mono +- aspell +- hlint +- hoogle +- tidy +- stylelint +- cabal-install +- marked +- composer +- shellcheck +- python-isort +- python-pipenv +- python-pytest +- python-nose +- yay js-beautify + +* BEACON +Never lose your cursor. When you scroll, your cursor will shine! This is a global minor-mode. Turn it on everywhere with: + +#+begin_src emacs-lisp +(beacon-mode 1) +#+end_src + +* BOOKMARKS AND BUFFERS +Doom Emacs uses 'SPC b' for keybindings related to bookmarks and buffers. + +** Bookmarks +Bookmarks are somewhat like registers in that they record positions you can jump to. Unlike registers, they have long names, and they persist automatically from one Emacs session to the next. The prototypical use of bookmarks is to record where you were reading in various files. + +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------+----------------------------------------+------------| +| list-bookmarks | /List bookmarks/ | SPC b L | +| bookmark-set | /Set bookmark/ | SPC b m | +| bookmark-delete | /Delete bookmark/ | SPC b M | +| bookmark-save | /Save current bookmark to bookmark file/ | SPC b w | + +#+BEGIN_SRC emacs-lisp +(setq bookmark-default-file "~/.config/doom/bookmarks") + +(map! :leader + (:prefix ("b". "buffer") + :desc "List bookmarks" "L" #'list-bookmarks + :desc "Set bookmark" "m" #'bookmark-set + :desc "Delete bookmark" "M" #'bookmark-set + :desc "Save current bookmarks to bookmark file" "w" #'bookmark-save)) +#+END_SRC + +** Buffers +Regarding /buffers/, the text you are editing in Emacs resides in an object called a /buffer/. Each time you visit a file, a buffer is used to hold the file’s text. Each time you invoke Dired, a buffer is used to hold the directory listing. /Ibuffer/ is a program that lists all of your Emacs /buffers/, allowing you to navigate between them and filter them. + +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------+----------------------+------------| +| ibuffer | /Launch ibuffer/ | SPC b i | +| kill-buffer | /Kill current buffer/ | SPC b k | +| next-buffer | /Goto next buffer/ | SPC b n | +| previous-buffer | /Goto previous buffer/ | SPC b p | +| save-buffer | /Save current buffer/ | SPC b s | + +** Global Auto Revert +A buffer can get out of sync with respect to its visited file on disk if that file is changed by another program. To keep it up to date, you can enable Auto Revert mode by typing M-x auto-revert-mode, or you can set it to be turned on globally with 'global-auto-revert-mode'. I have also turned on Global Auto Revert on non-file buffers, which is especially useful for 'dired' buffers. + +#+begin_src emacs-lisp +(global-auto-revert-mode 1) +(setq global-auto-revert-non-file-buffers t) +#+end_src + +** Keybindings within ibuffer mode +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------------------------+----------------------------------------+------------| +| ibuffer-mark-forward | /Mark the buffer/ | m | +| ibuffer-unmark-forward | /Unmark the buffer/ | u | +| ibuffer-do-kill-on-deletion-marks | /Kill the marked buffers/ | x | +| ibuffer-filter-by-content | /Ibuffer filter by content/ | f c | +| ibuffer-filter-by-directory | /Ibuffer filter by directory/ | f d | +| ibuffer-filter-by-filename | /Ibuffer filter by filename (full path)/ | f f | +| ibuffer-filter-by-mode | /Ibuffer filter by mode/ | f m | +| ibuffer-filter-by-name | /Ibuffer filter by name/ | f n | +| ibuffer-filter-disable | /Disable ibuffer filter/ | f x | +| ibuffer-do-kill-lines | /Hide marked buffers/ | g h | +| ibuffer-update | /Restore hidden buffers/ | g H | + +#+begin_src emacs-lisp +(evil-define-key 'normal ibuffer-mode-map + (kbd "f c") 'ibuffer-filter-by-content + (kbd "f d") 'ibuffer-filter-by-directory + (kbd "f f") 'ibuffer-filter-by-filename + (kbd "f m") 'ibuffer-filter-by-mode + (kbd "f n") 'ibuffer-filter-by-name + (kbd "f x") 'ibuffer-filter-disable + (kbd "g h") 'ibuffer-do-kill-lines + (kbd "g H") 'ibuffer-update) +#+end_src + +* CALENDAR +Let's make a 12-month calendar available so we can have a calendar app that, when we click on time/date in xmobar, we get a nice 12-month calendar to view. + +This is a modification of: http://homepage3.nifty.com/oatu/emacs/calendar.html +See also: https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months + +#+begin_src emacs-lisp +;; https://stackoverflow.com/questions/9547912/emacs-calendar-show-more-than-3-months +(defun dt/year-calendar (&optional year) + (interactive) + (require 'calendar) + (let* ( + (current-year (number-to-string (nth 5 (decode-time (current-time))))) + (month 0) + (year (if year year (string-to-number (format-time-string "%Y" (current-time)))))) + (switch-to-buffer (get-buffer-create calendar-buffer)) + (when (not (eq major-mode 'calendar-mode)) + (calendar-mode)) + (setq displayed-month month) + (setq displayed-year year) + (setq buffer-read-only nil) + (erase-buffer) + ;; horizontal rows + (dotimes (j 4) + ;; vertical columns + (dotimes (i 3) + (calendar-generate-month + (setq month (+ month 1)) + year + ;; indentation / spacing between months + (+ 5 (* 25 i)))) + (goto-char (point-max)) + (insert (make-string (- 10 (count-lines (point-min) (point-max))) ?\n)) + (widen) + (goto-char (point-max)) + (narrow-to-region (point-max) (point-max))) + (widen) + (goto-char (point-min)) + (setq buffer-read-only t))) + +(defun dt/scroll-year-calendar-forward (&optional arg event) + "Scroll the yearly calendar by year in a forward direction." + (interactive (list (prefix-numeric-value current-prefix-arg) + last-nonmenu-event)) + (unless arg (setq arg 0)) + (save-selected-window + (if (setq event (event-start event)) (select-window (posn-window event))) + (unless (zerop arg) + (let* ( + (year (+ displayed-year arg))) + (dt/year-calendar year))) + (goto-char (point-min)) + (run-hooks 'calendar-move-hook))) + +(defun dt/scroll-year-calendar-backward (&optional arg event) + "Scroll the yearly calendar by year in a backward direction." + (interactive (list (prefix-numeric-value current-prefix-arg) + last-nonmenu-event)) + (dt/scroll-year-calendar-forward (- (or arg 1)) event)) + +(map! :leader + :desc "Scroll year calendar backward" "" #'dt/scroll-year-calendar-backward + :desc "Scroll year calendar forward" "" #'dt/scroll-year-calendar-forward) + +(defalias 'year-calendar 'dt/year-calendar) +#+end_src + +Let's also play around with calfw. +#+begin_src emacs-lisp +(use-package! calfw) +(use-package! calfw-ical) +(use-package! calfw-org) +#+end_src + + +* CENTAUR-TABS +To use tabs in Doom Emacs, be sure to uncomment "tabs" in Doom's init.el. Displays tabs at the top of the window similar to tabbed web browsers such as Firefox. I don't actually use tabs in Emacs. I placed this in my config to help others who may want tabs. In the default configuration of Doom Emacs, 'SPC t' is used for "toggle" keybindings, so I choose 'SPC t c' to toggle centaur-tabs. The "g" prefix for keybindings is used for a bunch of evil keybindings in Doom, but "g" plus the arrow keys were not used, so I thought I would bind those for tab navigation. But I did leave the default "g t" and "g T" intact if you prefer to use those for centaur-tabs-forward/backward. + +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------------------+---------------------------+------------------| +| centaur-tabs-mode | /Toggle tabs globally/ | SPC t c | +| centaur-tabs-local-mode | /Toggle tabs local display/ | SPC t C | +| centaur-tabs-forward | /Next tab/ | g or g t | +| centaur-tabs-backward | /Previous tab/ | g or g T | +| centaur-tabs-forward-group | /Next tab group/ | g | +| centaur-tabs-backward-group | /Previous tab group/ | g | + +#+BEGIN_SRC emacs-lisp +(setq centaur-tabs-set-bar 'over + centaur-tabs-set-icons t + centaur-tabs-gray-out-icons 'buffer + centaur-tabs-height 24 + centaur-tabs-set-modified-marker t + centaur-tabs-style "bar" + centaur-tabs-modified-marker "•") +(map! :leader + :desc "Toggle tabs globally" "t c" #'centaur-tabs-mode + :desc "Toggle tabs local display" "t C" #'centaur-tabs-local-mode) +(evil-define-key 'normal centaur-tabs-mode-map (kbd "g ") 'centaur-tabs-forward ; default Doom binding is 'g t' + (kbd "g ") 'centaur-tabs-backward ; default Doom binding is 'g T' + (kbd "g ") 'centaur-tabs-forward-group + (kbd "g ") 'centaur-tabs-backward-group) +#+END_SRC + +* CLIPPY +Gives us a popup box with "Clippy, the paper clip". You can make him say various things by calling 'clippy-say' function. But the more useful functions of clippy are the two describe functions provided: 'clippy-describe-function' and 'clippy-describe-variable'. Hit the appropriate keybinding while the point is over a function/variable to call it. A popup with helpful clippy will appear, telling you about the function/variable (using describe-function and describe-variable respectively). + +| COMMAND | DESCRIPTION | KEYBINDING | +|--------------------------+---------------------------------------+------------| +| clippy-describe-function | /Clippy describes function under point/ | SPC c h f | +| clippy-describe-variable | /Clippy describes variable under point/ | SPC c h v | + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("c h" . "Help info from Clippy") + :desc "Clippy describes function under point" "f" #'clippy-describe-function + :desc "Clippy describes variable under point" "v" #'clippy-describe-variable)) + +#+end_src + +* DIRED +Dired is the file manager within Emacs. Below, I setup keybindings for image previews (peep-dired). Doom Emacs does not use 'SPC d' for any of its keybindings, so I've chosen the format of 'SPC d' plus 'key'. + +** Keybindings To Open Dired + +| COMMAND | DESCRIPTION | KEYBINDING | +|------------+------------------------------------+------------| +| dired | /Open dired file manager/ | SPC d d | +| dired-jump | /Jump to current directory in dired/ | SPC d j | + +** Keybindings Within Dired +*** Basic dired commands + +| COMMAND | DESCRIPTION | KEYBINDING | +|------------------------+---------------------------------------------+------------| +| dired-view-file | /View file in dired/ | SPC d v | +| dired-up-directory | /Go up in directory tree/ | h | +| dired-find-file | /Go down in directory tree (or open if file)/ | l | +| dired-next-line | /Move down to next line/ | j | +| dired-previous-line | /Move up to previous line/ | k | +| dired-mark | /Mark file at point/ | m | +| dired-unmark | /Unmark file at point/ | u | +| dired-do-copy | /Copy current file or marked files/ | C | +| dired-do-rename | /Rename current file or marked files/ | R | +| dired-hide-details | /Toggle detailed listings on/off/ | ( | +| dired-git-info-mode | /Toggle git information on/off/ | ) | +| dired-create-directory | /Create new empty directory/ | + | +| dired-diff | /Compare file at point with another/ | = | +| dired-subtree-toggle | /Toggle viewing subtree at point/ | TAB | + +*** Dired commands using regex + +| COMMAND | DESCRIPTION | KEYBINDING | +|-------------------------+----------------------------+------------| +| dired-mark-files-regexp | /Mark files using regex/ | % m | +| dired-do-copy-regexp | /Copy files using regex/ | % C | +| dired-do-rename-regexp | /Rename files using regex/ | % R | +| dired-mark-files-regexp | /Mark all files using regex/ | * % | + +*** File permissions and ownership + +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------+----------------------------------+------------| +| dired-do-chgrp | /Change the group of marked files/ | g G | +| dired-do-chmod | /Change the mode of marked files/ | M | +| dired-do-chown | /Change the owner of marked files/ | O | +| dired-do-rename | /Rename file or all marked files/ | R | + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("d" . "dired") + :desc "Open dired" "d" #'dired + :desc "Dired jump to current" "j" #'dired-jump) + (:after dired + (:map dired-mode-map + :desc "Peep-dired image previews" "d p" #'peep-dired + :desc "Dired view file" "d v" #'dired-view-file))) + +(evil-define-key 'normal dired-mode-map + (kbd "M-RET") 'dired-display-file + (kbd "h") 'dired-up-directory + (kbd "l") 'dired-open-file ; use dired-find-file instead of dired-open. + (kbd "m") 'dired-mark + (kbd "t") 'dired-toggle-marks + (kbd "u") 'dired-unmark + (kbd "C") 'dired-do-copy + (kbd "D") 'dired-do-delete + (kbd "J") 'dired-goto-file + (kbd "M") 'dired-do-chmod + (kbd "O") 'dired-do-chown + (kbd "P") 'dired-do-print + (kbd "R") 'dired-do-rename + (kbd "T") 'dired-do-touch + (kbd "Y") 'dired-copy-filenamecopy-filename-as-kill ; copies filename to kill ring. + (kbd "Z") 'dired-do-compress + (kbd "+") 'dired-create-directory + (kbd "-") 'dired-do-kill-lines + (kbd "% l") 'dired-downcase + (kbd "% m") 'dired-mark-files-regexp + (kbd "% u") 'dired-upcase + (kbd "* %") 'dired-mark-files-regexp + (kbd "* .") 'dired-mark-extension + (kbd "* /") 'dired-mark-directories + (kbd "; d") 'epa-dired-do-decrypt + (kbd "; e") 'epa-dired-do-encrypt) +;; Get file icons in dired +;;(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) +;; With dired-open plugin, you can launch external programs for certain extensions +;; For example, I set all .png files to open in 'sxiv' and all .mp4 files to open in 'mpv' +(setq dired-open-extensions '(("gif" . "sxiv") + ("jpg" . "sxiv") + ("png" . "sxiv") + ("mkv" . "mpv") + ("mp4" . "mpv"))) +#+end_src + +** Keybindings Within Dired With Peep-Dired-Mode Enabled +If peep-dired is enabled, you will get image previews as you go up/down with 'j' and 'k' + +| COMMAND | DESCRIPTION | KEYBINDING | +|----------------------+------------------------------------------+------------| +| peep-dired | /Toggle previews within dired/ | SPC d p | +| peep-dired-next-file | /Move to next file in peep-dired-mode/ | j | +| peep-dired-prev-file | /Move to previous file in peep-dired-mode/ | k | + +#+BEGIN_SRC emacs-lisp +(evil-define-key 'normal peep-dired-mode-map + (kbd "j") 'peep-dired-next-file + (kbd "k") 'peep-dired-prev-file) +(add-hook 'peep-dired-hook 'evil-normalize-keymaps) +#+END_SRC + +** Making deleted files go to trash can +#+begin_src emacs-lisp +(setq delete-by-moving-to-trash t + trash-directory "~/.local/share/Trash/files/") +#+end_src + +=NOTE=: For convenience, you may want to create a symlink to 'local/share/Trash' in your home directory: +#+begin_example +cd ~/ +ln -s ~/.local/share/Trash . +#+end_example + +* DOOM THEME +Setting the theme to doom-one. To try out new themes, I set a keybinding for counsel-load-theme with 'SPC h t'. + +#+BEGIN_SRC emacs-lisp +(setq doom-theme 'doom-one) +(map! :leader + :desc "Load new theme" "h t" #'counsel-load-theme) +#+END_SRC + +* EDNC (Notifications) +The Emacs Desktop Notification Center (EDNC) is an Emacs package written in pure Lisp that implements a desktop notifications service according to the freedesktop.org specification. EDNC aspires to be a small, but flexible drop-in replacement of standalone daemons like dunst. + +=NOTE=: Ensure that no other notification daemon (such as dunst) is active to use EDNC. + +#+begin_src emacs-lisp +(ednc-mode 1) + +(defun show-notification-in-buffer (old new) + (let ((name (format "Notification %d" (ednc-notification-id (or old new))))) + (with-current-buffer (get-buffer-create name) + (if new (let ((inhibit-read-only t)) + (if old (erase-buffer) (ednc-view-mode)) + (insert (ednc-format-notification new t)) + (pop-to-buffer (current-buffer))) + (kill-buffer))))) + +(add-hook 'ednc-notification-presentation-functions + #'show-notification-in-buffer) + +(evil-define-key 'normal ednc-view-mode-map + (kbd "d") 'ednc-dismiss-notification + (kbd "RET") 'ednc-invoke-action + (kbd "e") 'ednc-toggle-expanded-view) +#+end_src + +* ELFEED +An RSS newsfeed reader for Emacs. + +#+BEGIN_SRC emacs-lisp +(setq elfeed-goodies/entry-pane-size 0.5) + +(evil-define-key 'normal elfeed-show-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +(evil-define-key 'normal elfeed-search-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +(setq elfeed-feeds (quote + (("https://www.reddit.com/r/linux.rss" reddit linux) + ("https://www.reddit.com/r/commandline.rss" reddit commandline) + ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) + ("https://www.reddit.com/r/emacs.rss" reddit emacs) + ("https://www.gamingonlinux.com/article_rss.php" gaming linux) + ("https://hackaday.com/blog/feed/" hackaday linux) + ("https://opensource.com/feed" opensource linux) + ("https://linux.softpedia.com/backend.xml" softpedia linux) + ("https://itsfoss.com/feed/" itsfoss linux) + ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) + ("https://www.phoronix.com/rss.php" phoronix linux) + ("http://feeds.feedburner.com/d0od" omgubuntu linux) + ("https://www.computerworld.com/index.rss" computerworld linux) + ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) + ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) + ("https://betanews.com/feed" betanews linux) + ("http://lxer.com/module/newswire/headlines.rss" lxer linux)))) +#+END_SRC + +* EMMS +One of the media players available for Emacs is emms, which stands for Emacs Multimedia System. By default, Doom Emacs does not use 'SPC a',' so the format I use for these bindings is 'SPC a' plus 'key'. + +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------------+-----------------------------------+------------| +| emms-playlist-mode-go | /Switch to the playlist buffer/ | SPC a a | +| emms-pause | /Pause the track/ | SPC a x | +| emms-stop | /Stop the track/ | SPC a s | +| emms-previous | /Play previous track in playlist/ | SPC a p | +| emms-next | /Play next track in playlist/ | SPC a n | + +#+BEGIN_SRC emacs-lisp +(emms-all) +(emms-default-players) +(emms-mode-line 1) +(emms-playing-time 1) +(setq emms-source-file-default-directory "~/Music/" + emms-playlist-buffer-name "*Music*" + emms-info-asynchronously t + emms-source-file-directory-tree-function 'emms-source-file-directory-tree-find) +(map! :leader + (:prefix ("a" . "EMMS audio player") + :desc "Go to emms playlist" "a" #'emms-playlist-mode-go + :desc "Emms pause track" "x" #'emms-pause + :desc "Emms stop track" "s" #'emms-stop + :desc "Emms play previous track" "p" #'emms-previous + :desc "Emms play next track" "n" #'emms-next)) +#+END_SRC + +* EMOJIS +Emojify is an Emacs extension to display emojis. It can display github style emojis like :smile: or plain ascii ones like :). + +#+begin_src emacs-lisp +(use-package emojify + :hook (after-init . global-emojify-mode)) +#+end_src + +* ERC +ERC is a built-in Emacs IRC client. + +| COMMAND | DESCRIPTION | KEYBINDING | +|---------+---------------------------------------------+------------| +| erc-tls | /Launch ERC using more secure TLS connection/ | SPC e E | + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("e". "evaluate/ERC/EWW") + :desc "Launch ERC with TLS connection" "E" #'erc-tls)) + +(setq erc-prompt (lambda () (concat "[" (buffer-name) "]")) + erc-server "irc.libera.chat" + erc-nick "distrotube" + erc-user-full-name "Derek Taylor" + erc-track-shorten-start 24 + erc-autojoin-channels-alist '(("irc.libera.chat" "#archlinux" "#linux" "#emacs")) + erc-kill-buffer-on-part t + erc-fill-column 100 + erc-fill-function 'erc-fill-static + erc-fill-static-center 20 + ;; erc-auto-query 'bury + ) +#+end_src + +* EVALUATE ELISP EXPRESSIONS +Changing some keybindings from their defaults to better fit with Doom Emacs, and to avoid conflicts with my window managers which sometimes use the control key in their keybindings. By default, Doom Emacs does not use 'SPC e' for anything, so I choose to use the format 'SPC e' plus 'key' for these (I also use 'SPC e' for 'eww' keybindings). + +| COMMAND | DESCRIPTION | KEYBINDING | +|-----------------+----------------------------------------------+------------| +| eval-buffer | /Evaluate elisp in buffer/ | SPC e b | +| eval-defun | /Evaluate the defun containing or after point/ | SPC e d | +| eval-expression | /Evaluate an elisp expression/ | SPC e e | +| eval-last-sexp | /Evaluate elisp expression before point/ | SPC e l | +| eval-region | /Evaluate elisp in region/ | SPC e r | + +#+Begin_src emacs-lisp +(map! :leader + (:prefix ("e". "evaluate/ERC/EWW") + :desc "Evaluate elisp in buffer" "b" #'eval-buffer + :desc "Evaluate defun" "d" #'eval-defun + :desc "Evaluate elisp expression" "e" #'eval-expression + :desc "Evaluate last sexpression" "l" #'eval-last-sexp + :desc "Evaluate elisp in region" "r" #'eval-region)) +#+END_SRC + +* EWW +EWW is the Emacs Web Wowser, the builtin browser in Emacs. Below I set urls to open in a specific browser (eww) with browse-url-browser-function. By default, Doom Emacs does not use 'SPC e' for anything, so I choose to use the format 'SPC e' plus 'key' for these (I also use 'SPC e' for 'eval' keybindings). I chose to use 'SPC s w' for eww-search-words because Doom Emacs uses 'SPC s' for 'search' commands. + +#+BEGIN_SRC emacs-lisp +(setq browse-url-browser-function 'eww-browse-url) +(map! :leader + :desc "Search web for text between BEG/END" + "s w" #'eww-search-words + (:prefix ("e" . "evaluate/ERC/EWW") + :desc "Eww web browser" "w" #'eww + :desc "Eww reload page" "R" #'eww-reload)) +#+END_SRC + +* EXWM +#+begin_src emacs-lisp +(autoload 'exwm-enable "exwm-config.el") +#+end_src + +* FONTS +Settings related to fonts within Doom Emacs: ++ 'doom-font' -- standard monospace font that is used for most things in Emacs. ++ 'doom-variable-pitch-font' -- variable font which is useful in some Emacs plugins. ++ 'doom-big-font' -- used in doom-big-font-mode; useful for presentations. ++ 'font-lock-comment-face' -- for comments. ++ 'font-lock-keyword-face' -- for keywords with special significance like 'setq' in elisp. + +DT font family is "JetBrains Mono" + +#+BEGIN_SRC emacs-lisp +(setq doom-font (font-spec :family "Fira Code" :size 15) + doom-variable-pitch-font (font-spec :family "Ubuntu" :size 15) + doom-big-font (font-spec :family "Fira Code" :size 24)) +(after! doom-themes + (setq doom-themes-enable-bold t + doom-themes-enable-italic t)) +(custom-set-faces! + '(font-lock-comment-face :slant italic) + '(font-lock-keyword-face :slant italic)) +#+END_SRC + +* IMENU +Imenu produces menus for accessing locations in documents, typically in the current buffer. You can access the locations using an ordinary menu (menu bar or other) or using minibuffer completion, or you can install 'imenu-list' and have the imenu displayed as a vertical split that you can toggle show/hide. + +| COMMAND | DESCRIPTION | KEYBINDING | +|-------------------------+----------------------------------+------------| +| counsel-imenu | /Menu to jump to places in buffer/ | SPC s i | +| imenu-list-smart-toggle | /Toggle imenu shown in a sidebar/ | SPC t i | + +#+BEGIN_SRC emacs-lisp +(setq imenu-list-focus-after-activation t) + +(map! :leader + (:prefix ("s" . "Search") + :desc "Menu to jump to places in buffer" "i" #'counsel-imenu)) + +(map! :leader + (:prefix ("t" . "Toggle") + :desc "Toggle imenu shown in a sidebar" "i" #'imenu-list-smart-toggle)) + +#+END_SRC + +* INSERT DATE +Some custom functions to insert the date. The function 'insert-todays-date' can be used one of three different ways: (1) just the keybinding without the universal argument prefix, (2) with one universal argument prefix, or (3) with two universal argument prefixes. The universal argument prefix is 'SPC-u' in Doom Emacs (C-u in standard GNU Emacs). The function 'insert-any-date' only outputs to one format, which is the same format as 'insert-todays-date' without a prefix. + +| COMMAND | EXAMPLE OUTPUT | KEYBINDING | +|-----------------------+---------------------------+-----------------------| +| dt/insert-todays-date | /Friday, November 19, 2021/ | SPC i d t | +| dt/insert-todays-date | /11-19-2021/ | SPC u SPC i d t | +| dt/insert-todays-date | /2021-11-19/ | SPC u SPC u SPC i d t | +| dt/insert-any-date | /Friday, November 19, 2021/ | SPC i d a | + +#+begin_src emacs-lisp +(defun dt/insert-todays-date (prefix) + (interactive "P") + (let ((format (cond + ((not prefix) "%A, %B %d, %Y") + ((equal prefix '(4)) "%m-%d-%Y") + ((equal prefix '(16)) "%Y-%m-%d")))) + (insert (format-time-string format)))) + +(require 'calendar) +(defun dt/insert-any-date (date) + "Insert DATE using the current locale." + (interactive (list (calendar-read-date))) + (insert (calendar-date-string date))) + +(map! :leader + (:prefix ("i d" . "Insert date") + :desc "Insert any date" "a" #'dt/insert-any-date + :desc "Insert todays date" "t" #'dt/insert-todays-date)) +#+end_src + +* IVY +Ivy is a generic completion mechanism for Emacs. + +** IVY-POSFRAME +Ivy-posframe is an ivy extension, which lets ivy use posframe to show its candidate menu. Some of the settings below involve: ++ ivy-posframe-display-functions-alist -- sets the display position for specific programs ++ ivy-posframe-height-alist -- sets the height of the list displayed for specific programs + +Available functions (positions) for 'ivy-posframe-display-functions-alist' ++ ivy-posframe-display-at-frame-center ++ ivy-posframe-display-at-window-center ++ ivy-posframe-display-at-frame-bottom-left ++ ivy-posframe-display-at-window-bottom-left ++ ivy-posframe-display-at-frame-bottom-window-center ++ ivy-posframe-display-at-point ++ ivy-posframe-display-at-frame-top-center + +=NOTE:= If the setting for 'ivy-posframe-display' is set to 'nil' (false), anything that is set to 'ivy-display-function-fallback' will just default to their normal position in Doom Emacs (usually a bottom split). However, if this is set to 't' (true), then the fallback position will be centered in the window. + +#+BEGIN_SRC emacs-lisp +(setq ivy-posframe-display-functions-alist + '((swiper . ivy-posframe-display-at-point) + (complete-symbol . ivy-posframe-display-at-point) + (counsel-M-x . ivy-display-function-fallback) + (counsel-esh-history . ivy-posframe-display-at-window-center) + (counsel-describe-function . ivy-display-function-fallback) + (counsel-describe-variable . ivy-display-function-fallback) + (counsel-find-file . ivy-display-function-fallback) + (counsel-recentf . ivy-display-function-fallback) + (counsel-register . ivy-posframe-display-at-frame-bottom-window-center) + (dmenu . ivy-posframe-display-at-frame-top-center) + (nil . ivy-posframe-display)) + ivy-posframe-height-alist + '((swiper . 20) + (dmenu . 20) + (t . 10))) +(ivy-posframe-mode 1) ; 1 enables posframe-mode, 0 disables it. +#+END_SRC + +** IVY KEYBINDINGS +By default, Doom Emacs does not use 'SPC v', so the format I use for these bindings is 'SPC v' plus 'key'. + +#+BEGIN_SRC emacs-lisp +(map! :leader + (:prefix ("v" . "Ivy") + :desc "Ivy push view" "v p" #'ivy-push-view + :desc "Ivy switch view" "v s" #'ivy-switch-view)) +#+END_SRC + +* LINE SETTINGS +I set comment-line to 'SPC TAB TAB' which is a rather comfortable keybinding for me on my ZSA Moonlander keyboard. The standard Emacs keybinding for comment-line is 'C-x C-;'. The other keybindings are for commands that toggle on/off various line-related settings. Doom Emacs uses 'SPC t' for "toggle" commands, so I choose 'SPC t' plus 'key' for those bindings. + +| COMMAND | DESCRIPTION | KEYBINDING | +|--------------------------+-------------------------------------------+-------------| +| comment-line | /Comment or uncomment lines/ | SPC TAB TAB | +| hl-line-mode | /Toggle line highlighting in current frame/ | SPC t h | +| global-hl-line-mode | /Toggle line highlighting globally/ | SPC t H | +| doom/toggle-line-numbers | /Toggle line numbers/ | SPC t l | +| toggle-truncate-lines | /Toggle truncate lines/ | SPC t t | + +#+BEGIN_SRC emacs-lisp +(setq display-line-numbers-type t) +(map! :leader + :desc "Comment or uncomment lines" "TAB TAB" #'comment-line + (:prefix ("t" . "toggle") + :desc "Toggle line numbers" "l" #'doom/toggle-line-numbers + :desc "Toggle line highlight in frame" "h" #'hl-line-mode + :desc "Toggle line highlight globally" "H" #'global-hl-line-mode + :desc "Toggle truncate lines" "t" #'toggle-truncate-lines)) +#+END_SRC + +* MARKDOWN + +#+begin_src emacs-lisp +(custom-set-faces + '(markdown-header-face ((t (:inherit font-lock-function-name-face :weight bold :family "variable-pitch")))) + '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 1.7)))) + '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.6)))) + '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.5)))) + '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.4)))) + '(markdown-header-face-5 ((t (:inherit markdown-header-face :height 1.3)))) + '(markdown-header-face-6 ((t (:inherit markdown-header-face :height 1.2))))) + +#+end_src + +* MINIMAP +A minimap sidebar displaying a smaller version of the current buffer on either the left or right side. It highlights the currently shown region and updates its position automatically. Be aware that this minimap program does not work in Org documents. This is not unusual though because I have tried several minimap programs and none of them can handle Org. + +| COMMAND | DESCRIPTION | KEYBINDING | +|--------------+-------------------------------------------+------------| +| minimap-mode | /Toggle minimap-mode/ | SPC t m | + +#+begin_src emacs-lisp +(setq minimap-window-location 'right) +(map! :leader + (:prefix ("t" . "toggle") + :desc "Toggle minimap-mode" "m" #'minimap-mode)) +#+end_src + +* MODELINE +The modeline is the bottom status bar that appears in Emacs windows. For more information on what is available to configure in the Doom modeline, check out: +https://github.com/seagle0128/doom-modeline + +#+begin_src emacs-lisp +(set-face-attribute 'mode-line nil :font "Ubuntu Mono-13") +(setq doom-modeline-height 30 ;; sets modeline height + doom-modeline-bar-width 5 ;; sets right bar width + doom-modeline-persp-name t ;; adds perspective name to modeline + doom-modeline-persp-icon t) ;; adds folder icon next to persp name +#+end_src + +* MOUSE SUPPORT +Adding mouse support in the terminal version of Emacs. + +#+begin_src emacs-lisp +(xterm-mouse-mode 1) +#+end_src + +* MU4E +email setup + +#+BEGIN_SRC emacs-lisp +(require 'mu4e) +(set-email-account! + "gmail" + '((mu4e-sent-folder . "/[Gmail]/Sent Mail") + (mu4e-trash-folder . "/[Gmail]/Bin") + (mu4e-drafts-folder . "/[Gmail]/Drafts") + (mu4e-refile-folder . "/[Gmail]/All Mail") + ;(smtpmail-smtp-server . "smtp.gmail.com") + ;(smtpmail-default-smtp-server . "smtp.gmail.com") + (user-mail-address . "christopherrparis1@gmail.com") + (user-full-name . "Christopher Paris")) + ;(smtpmail-smtp-service . 587) + ;(smtpmail-stream-type . starttls)) + ;(smtpmail-smtp-user . "christopherrparis1@gmail.com")) + t) +(require 'mu4e-org) +(setq mu4e-get-mail-command "mbsync gmail" + mu4e-change-filenames-when-moving t + ;; get emails and index every 5 minutes + mu4e-update-interval 300 + ;; send emails with format=flowed + mu4e-compose-format-flowed t + ;; no need to run cleanup after indexing for gmail + mu4e-index-cleanup nil + mu4e-index-lazy-check t + ;; more sensible date format + mu4e-headers-date-format "%d.%m.%y") +(require 'smtpmail) +(setq sendmail-program "msmtp" + message-sendmail-extra-arguments '("--read-envelope-from") + message-sendmail-f-is-evil 't + ;message-send-mail-function 'smtpmail-send-it + message-send-mail-function 'message-send-mail-with-sendmail + smtpmail-smtp-service 587 + smtpmail-smtp-server "smtp.gmail.com" + smtpmail-default-smtp-server "smtp.gmail.com" + smtpmail-stream-type 'starttls) + ;(smtpmail-smtp-user . "christopherrparis1@gmail.com")) + +#+END_SRC + + +** System Crafters - Mu4e quick Capturing +This makes capture templates even faster for email workflow +#+BEGIN_SRC emacs-lisp +(defun efs/capture-mail-follow-up (msg) + (interactive) + (call-interactively 'org-store-link) + (org-capture nil "mf")) + +(defun efs/capture-mail-read-later (msg) + (interactive) + (call-interactively 'org-store-link) + (org-capture nil "mr")) + +;; Add custom actions for our capture templates +(add-to-list 'mu4e-headers-actions + '("follow up" . efs/capture-mail-follow-up) t) +(add-to-list 'mu4e-view-actions + '("follow up" . efs/capture-mail-follow-up) t) +(add-to-list 'mu4e-headers-actions + '("read later" . efs/capture-mail-read-later) t) +(add-to-list 'mu4e-view-actions + '("read later" . efs/capture-mail-read-later) t) +#+End_SRC + +** System Crafters - Mu4e store link to current query: + +#+BEGIN_SRC emacs-lisp +(defun efs/store-link-to-mu4e-query () + (interactive) + (let ((org-mu4e-link-query-in-headers-mode t)) + (call-interactively 'org-store-link))) +#+END_SRC + + +* NEOTREE +Neotree is a file tree viewer. When you open neotree, it jumps to the current file thanks to neo-smart-open. The neo-window-fixed-size setting makes the neotree width be adjustable. Doom Emacs had no keybindings set for neotree. Since Doom Emacs uses 'SPC t' for 'toggle' keybindings, I used 'SPC t n' for toggle-neotree. + +| COMMAND | DESCRIPTION | KEYBINDING | +|----------------+---------------------------+------------| +| neotree-toggle | /Toggle neotree/ | SPC t n | +| neotree- dir | /Open directory in neotree/ | SPC d n | + +#+BEGIN_SRC emacs-lisp +(after! neotree + (setq neo-smart-open t + neo-window-fixed-size nil)) +(after! doom-themes + (setq doom-neotree-enable-variable-pitch t)) +(map! :leader + :desc "Toggle neotree file viewer" "t n" #'neotree-toggle + :desc "Open directory in neotree" "d n" #'neotree-dir) +#+END_SRC + +* OPEN SPECIFIC FILES +Keybindings to open files that I work with all the time using the find-file command, which is the interactive file search that opens with 'C-x C-f' in GNU Emacs or 'SPC f f' in Doom Emacs. These keybindings use find-file non-interactively since we specify exactly what file to open. The format I use for these bindings is 'SPC =' plus 'key' since Doom Emacs does not use 'SPC ='. + +=NOTE=: Doom Emacs already has a function 'doom/open-private-config' set to the keybinding 'SPC f p'. This allows you to open any file in your HOME/.config/doom directory, so the following keybindings that I created are not really necessary, but I created this section as an example of how to to create bindings that open specific files on your system. + +| PATH TO FILE | DESCRIPTION | KEYBINDING | +|-------------------------------+-----------------------------+------------| +| ~/.config/doom/start.org | /Edit start.org (start page)/ | SPC = = | +| ~/Nextcloud/Notes/Org/agenda.org | /Edit agenda file/ | SPC = a | +| ~/.config/doom/config.org | /Edit doom config.org/ | SPC = c | +| ~/.config/doom/init.el | /Edit doom init.el/ | SPC = i | +| ~/.config/doom/packages.el | /Edit doom packages.el/ | SPC = p | +| ~/.config/doom/eshell/aliases | /Edit eshell aliases/ | SPC = e a | +| ~/.config/doom/eshell/profile | /Edit eshell profile/ | SPC = e p | + +#+BEGIN_SRC emacs-lisp +(map! :leader + (:prefix ("=" . "open file") + :desc "Edit agenda file" "=" #'(lambda () (interactive) (find-file "~/.config/doom/start.org")) + :desc "Edit agenda file" "a" #'(lambda () (interactive) (find-file "~/Nextcloud/Notes/Org/agenda.org")) + :desc "Edit doom config.org" "c" #'(lambda () (interactive) (find-file "~/.config/doom/config.org")) + :desc "Edit doom init.el" "i" #'(lambda () (interactive) (find-file "~/.config/doom/init.el")) + :desc "Edit doom packages.el" "p" #'(lambda () (interactive) (find-file "~/.config/doom/packages.el")))) +(map! :leader + (:prefix ("= e" . "open eshell files") + :desc "Edit eshell aliases" "a" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) + :desc "Edit eshell profile" "p" #'(lambda () (interactive) (find-file "~/.config/doom/eshell/profile")))) +#+END_SRC + +* ORG MODE +I wrapped most of this block in (after! org). Without this, my settings might be evaluated too early, which will result in my settings being overwritten by Doom's defaults. I have also enabled org-journal, org-superstar and org-roam by adding (+journal +pretty +roam2) to the org section of my Doom Emacs init.el. + +=NOTE=: I have the location of my Org directory and Roam directory in $HOME/nc/ which is a Nextcloud folder that allows me to instantly sync all of my Org work between my home computer and my office computer. + +#+BEGIN_SRC emacs-lisp +(map! :leader + :desc "Org babel tangle" "m B" #'org-babel-tangle) +(after! org + (setq org-directory "~/Nextcloud/Notes/Org/" + org-default-notes-file (expand-file-name "notes.org" org-directory) + org-ellipsis " ▼ " + org-superstar-headline-bullets-list '("◉" "●" "○" "◆" "●" "○" "◆") + org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦)) ; changes +/- symbols in item lists + org-log-done 'time + org-hide-emphasis-markers t + ;; ex. of org-link-abbrev-alist in action + ;; [[arch-wiki:Name_of_Page][Description]] + org-link-abbrev-alist ; This overwrites the default Doom org-link-abbrev-list + '(("google" . "http://www.google.com/search?q=") + ("arch-wiki" . "https://wiki.archlinux.org/index.php/") + ("ddg" . "https://duckduckgo.com/?q=") + ("wiki" . "https://en.wikipedia.org/wiki/")) + org-table-convert-region-max-lines 20000 + org-todo-keywords ; This overwrites the default Doom org-todo-keywords + '((sequence + "TODO(t)" ; A task that is ready to be tackled + "BLOG(b)" ; Blog writing assignments + "GYM(g)" ; Things to accomplish at the gym + "PROJ(p)" ; A project that contains other tasks + "VIDEO(v)" ; Video assignments + "WAIT(w)" ; Something is holding up this task + "|" ; The pipe necessary to separate "active" states and "inactive" states + "DONE(d)" ; Task has been completed + "CANCELLED(c)" )) ; Task has been cancelled + org-log-into-drawer t + org-capture-templates + '(("p" "Private templates") + ("pt" "TODO entry" entry + (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" "Capture") + (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) + ("pj" "Journal entry" entry (file+olp+datetree + "~/Nextcloud/Notes/Org/org-roam/20241023165214-journal.org") "* %U - %^{Activity}") + ("pb" "Add book to read" entry (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315100949-mylife_org.org" + "Books To Read") (file "~/Nextcloud/Notes/Org/tpl-book.txt") + :empty-lines-after 2) + + ("w" "Work templates") + ("wt" "TODO entry" entry + (file+headline "~/Nextcloud/Notes/Org/org-roam/20240315170859-mywork.org" "Capture") + (file "~/Nextcloud/Notes/Org/tpl-todo.txt")) + ("wl" "Worklog entry" entry (file+olp+datetree + "~/Nextcloud/Notes/Org/org-roam/20241024113312-worklog.org") "* %U - %^{Activity}") + ("m" "Email Workflow") + ("mf" "Follow Up" entry (file+olp "~/Nextcloud/Notes/Org/Mail.org" "Follow Up") + "* TODO Follow up with %:fromname on %a\nSCHEDULED:%t\nDEADLINE: %(org-insert-time-stamp (org-read-date nil t \"+2d\"))\n\n%i" :immediate-finish t) + ("mr" "Read Later" entry (file+olp "~/Nextcloud/Notes/Org/Mail.org" "Read Later") + "* TODO Read %:subject\nSCHEDULED:%t\nDEADLINE: %(org-insert-time-stamp (org-read-date nil t \"+2d\"))\n\n%a\n\n%i" :immediate-finish t)) + + + org-excalidraw-directory "~/Nextcloud/Notes/Org/excalidraw")) + + + +#+END_SRC + +** Org-agenda +#+begin_src emacs-lisp +(after! org + (setq org-agenda-files + '(("~/Nextcloud/Notes/Org/agenda.org") + ("~/Nextcloud/Notes/Org/Mail.org")))) + +(setq + ;; org-fancy-priorities-list '("[A]" "[B]" "[C]") + ;; org-fancy-priorities-list '("❗" "[B]" "[C]") + org-fancy-priorities-list '("🟥" "🟧" "🟨") + org-priority-faces + '((?A :foreground "#ff6c6b" :weight bold) + (?B :foreground "#98be65" :weight bold) + (?C :foreground "#c678dd" :weight bold)) + org-agenda-block-separator 8411) + +(setq org-agenda-custom-commands + '(("v" "A better agenda view" + ((tags "PRIORITY=\"A\"" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "High-priority unfinished tasks:"))) + (tags "PRIORITY=\"B\"" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "Medium-priority unfinished tasks:"))) + (tags "PRIORITY=\"C\"" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "Low-priority unfinished tasks:"))) + (tags "customtag" + ((org-agenda-skip-function '(org-agenda-skip-entry-if 'todo 'done)) + (org-agenda-overriding-header "Tasks marked with customtag:"))) + + (agenda "") + (alltodo ""))))) +#+end_src + +** Org-auto-tangle +=org-auto-tangle= allows you to add the option =#+auto_tangle: t= in your Org file so that it automatically tangles when you save the document. I have made adding this to your file even easier by creating a function 'dt/insert-auto-tangle-tag' and setting it to a keybinding 'SPC i a'. + +#+begin_src emacs-lisp +(use-package! org-auto-tangle + :defer t + :hook (org-mode . org-auto-tangle-mode) + :config + (setq org-auto-tangle-default t)) + +(defun dt/insert-auto-tangle-tag () + "Insert auto-tangle tag in a literate config." + (interactive) + (evil-org-open-below 1) + (insert "#+auto_tangle: t ") + (evil-force-normal-state)) + +(map! :leader + :desc "Insert auto_tangle tag" "i a" #'dt/insert-auto-tangle-tag) +#+end_src + +** Org fonts +I have created an interactive function for each color scheme (M-x dt/org-colors-*). These functions will set appropriate colors and font attributes for org-level fonts and the org-table font. + +#+begin_src emacs-lisp +(defun dt/org-colors-doom-one () + "Enable Doom One colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.175 "#51afef" ultra-bold) + (org-level-2 1.15 "#c678dd" extra-bold) + (org-level-3 1.125 "#98be65" bold) + (org-level-4 1.1 "#da8548" semi-bold) + (org-level-5 1.075 "#5699af" normal) + (org-level-6 1.05 "#a9a1e1" normal) + (org-level-7 1.025 "#46d9ff" normal) + (org-level-8 1.0 "#ff6c6b" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-dracula () + "Enable Dracula colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#8be9fd" ultra-bold) + (org-level-2 1.6 "#bd93f9" extra-bold) + (org-level-3 1.5 "#50fa7b" bold) + (org-level-4 1.4 "#ff79c6" semi-bold) + (org-level-5 1.3 "#9aedfe" normal) + (org-level-6 1.2 "#caa9fa" normal) + (org-level-7 1.1 "#5af78e" normal) + (org-level-8 1.0 "#ff92d0" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-gruvbox-dark () + "Enable Gruvbox Dark colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#458588" ultra-bold) + (org-level-2 1.6 "#b16286" extra-bold) + (org-level-3 1.5 "#98971a" bold) + (org-level-4 1.4 "#fb4934" semi-bold) + (org-level-5 1.3 "#83a598" normal) + (org-level-6 1.2 "#d3869b" normal) + (org-level-7 1.1 "#d79921" normal) + (org-level-8 1.0 "#8ec07c" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-monokai-pro () + "Enable Monokai Pro colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#78dce8" ultra-bold) + (org-level-2 1.6 "#ab9df2" extra-bold) + (org-level-3 1.5 "#a9dc76" bold) + (org-level-4 1.4 "#fc9867" semi-bold) + (org-level-5 1.3 "#ff6188" normal) + (org-level-6 1.2 "#ffd866" normal) + (org-level-7 1.1 "#78dce8" normal) + (org-level-8 1.0 "#ab9df2" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-nord () + "Enable Nord colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#81a1c1" ultra-bold) + (org-level-2 1.6 "#b48ead" extra-bold) + (org-level-3 1.5 "#a3be8c" bold) + (org-level-4 1.4 "#ebcb8b" semi-bold) + (org-level-5 1.3 "#bf616a" normal) + (org-level-6 1.2 "#88c0d0" normal) + (org-level-7 1.1 "#81a1c1" normal) + (org-level-8 1.0 "#b48ead" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-oceanic-next () + "Enable Oceanic Next colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#6699cc" ultra-bold) + (org-level-2 1.6 "#c594c5" extra-bold) + (org-level-3 1.5 "#99c794" bold) + (org-level-4 1.4 "#fac863" semi-bold) + (org-level-5 1.3 "#5fb3b3" normal) + (org-level-6 1.2 "#ec5f67" normal) + (org-level-7 1.1 "#6699cc" normal) + (org-level-8 1.0 "#c594c5" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-palenight () + "Enable Palenight colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#82aaff" ultra-bold) + (org-level-2 1.6 "#c792ea" extra-bold) + (org-level-3 1.5 "#c3e88d" bold) + (org-level-4 1.4 "#ffcb6b" semi-bold) + (org-level-5 1.3 "#a3f7ff" normal) + (org-level-6 1.2 "#e1acff" normal) + (org-level-7 1.1 "#f07178" normal) + (org-level-8 1.0 "#ddffa7" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-solarized-dark () + "Enable Solarized Dark colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#268bd2" ultra-bold) + (org-level-2 1.6 "#d33682" extra-bold) + (org-level-3 1.5 "#859900" bold) + (org-level-4 1.4 "#b58900" semi-bold) + (org-level-5 1.3 "#cb4b16" normal) + (org-level-6 1.2 "#6c71c4" normal) + (org-level-7 1.1 "#2aa198" normal) + (org-level-8 1.0 "#657b83" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-solarized-light () + "Enable Solarized Light colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#268bd2" ultra-bold) + (org-level-2 1.6 "#d33682" extra-bold) + (org-level-3 1.5 "#859900" bold) + (org-level-4 1.4 "#b58900" semi-bold) + (org-level-5 1.3 "#cb4b16" normal) + (org-level-6 1.2 "#6c71c4" normal) + (org-level-7 1.1 "#2aa198" normal) + (org-level-8 1.0 "#657b83" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +(defun dt/org-colors-tomorrow-night () + "Enable Tomorrow Night colors for Org headers." + (interactive) + (dolist + (face + '((org-level-1 1.7 "#81a2be" ultra-bold) + (org-level-2 1.6 "#b294bb" extra-bold) + (org-level-3 1.5 "#b5bd68" bold) + (org-level-4 1.4 "#e6c547" semi-bold) + (org-level-5 1.3 "#cc6666" normal) + (org-level-6 1.2 "#70c0ba" normal) + (org-level-7 1.1 "#b77ee0" normal) + (org-level-8 1.0 "#9ec400" normal))) + (set-face-attribute (nth 0 face) nil :font doom-variable-pitch-font :weight (nth 3 face) :height (nth 1 face) :foreground (nth 2 face))) + (set-face-attribute 'org-table nil :font doom-font :weight 'normal :height 1.0 :foreground "#bfafdf")) + +;; Load our desired dt/org-colors-* theme on startup +(dt/org-colors-doom-one) +#+end_src + +** Org-export +We need ox-man for "Org eXporting" to manpage format and ox-gemini for exporting to gemtext (for the gemini protocol). + +=NOTE=: I also enable ox-publish for converting an Org site into an HTML site, but that is done in init.el (org +publish). + +#+BEGIN_SRC emacs-lisp +(use-package ox-man) +(use-package ox-gemini) +#+END_SRC + +** Org-journal +#+begin_src emacs-lisp +(setq org-journal-dir "~/Nextcloud/Notes/Org/journal/" + org-journal-date-prefix "* " + org-journal-time-prefix "** " + org-journal-date-format "%B %d, %Y (%A) " + org-journal-file-format "%Y-%m-%d.org") +#+end_src + +** Org-publish +#+begin_src emacs-lisp +(setq org-publish-use-timestamps-flag nil) +(setq org-export-with-broken-links t) +(setq org-publish-project-alist + '(("distro.tube without manpages" + :base-directory "~/nc/gitlab-repos/distro.tube/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/" + :recursive t + :exclude "org-html-themes/.*\\|man-org/man*" + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man0p" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man0p/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man0p/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man1" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man1p" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man1p/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man1p/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man2" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man2/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man2/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man3" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man3p" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man3p/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man3p/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man4" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man4/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man4/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man5" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man5/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man5/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man6" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man6/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man6/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man7" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man7/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man7/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("man8" + :base-directory "~/nc/gitlab-repos/distro.tube/man-org/man8/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/distro.tube/html/man-org/man8/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + ("org-static" + :base-directory "~/Org/website" + :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" + :publishing-directory "~/public_html/" + :recursive t + :exclude ".*/org-html-themes/.*" + :publishing-function org-publish-attachment) + ("dtos.dev" + :base-directory "~/nc/gitlab-repos/dtos.dev/" + :base-extension "org" + :publishing-directory "~/nc/gitlab-repos/dtos.dev/html/" + :recursive t + :publishing-function org-html-publish-to-html + :headline-levels 4 ; Just the default for this project. + :auto-preamble t) + + )) +#+end_src + +** Org-roam +[[https://github.com/org-roam/org-roam][Org-roam]] is a plain-text knowledge management system. Org-roam borrows principles from the =Zettelkasten= method, providing a solution for non-hierarchical note-taking. It should also work as a plug-and-play solution for anyone already using Org-mode for their personal wiki. + +| COMMAND | DESCRIPTION | KEYBINDING | +|------------------------+------------------------------------+------------| +| completion-at-point | /Completion of node-insert at point/ | SPC n r c | +| org-roam-node-find | /Find node or create a new one/ | SPC n r f | +| org-roam-graph | /Show graph of all nodes/ | SPC n r g | +| org-roam-node-insert | /Insert link to a node/ | SPC n r i | +| org-roam-capture | /Capture to node/ | SPC n r n | +| org-roam-buffer-toggle | /Toggle roam buffer/ | SPC n r r | + +#+begin_src emacs-lisp +(after! org + (setq org-roam-directory "~/Nextcloud/Notes/Org/org-roam/" + org-roam-graph-viewer "/usr/bin/brave" + org-roam-completion-everywhere t)) + +(map! :leader + (:prefix ("n r" . "org-roam") + :desc "Completion at point" "c" #'completion-at-point + :desc "Find node" "f" #'org-roam-node-find + :desc "Show graph" "g" #'org-roam-graph + :desc "Insert node" "i" #'org-roam-node-insert + :desc "Capture to node" "n" #'org-roam-capture + :desc "Toggle roam buffer" "r" #'org-roam-buffer-toggle)) +#+end_src + +* PASSWORD STORE +Uses the standard Unix password store "pass". Pass program must be installed, with custom directory pointing to pass store in bashrc or zshrc file. + +PASSWORD_STORE_DIR="$HOME/Nextcloud/Pass" + +#+begin_src emacs-lisp +(use-package! password-store) +#+end_src + +* PERSPECTIVE +Perspective provides multiple named workspaces (or "perspectives") in Emacs, similar to having multiple desktops in window managers like Awesome and XMonad. Each perspective has its own buffer list and its own window layout, making it easy to work on many separate projects without getting lost in all the buffers. Switching to a perspective activates its window configuration, and when in a perspective, only its buffers are available (by default). Doom Emacs uses 'SPC some_key' for binding some of the perspective commands, so I used this binging format for the perspective bindings that I created.. + +| COMMAND | DESCRIPTION | KEYBINDING | +|----------------------------+-------------------------------------+------------| +| persp-switch | /Switch to perspective NAME/ | SPC DEL | +| persp-switch-to-buffer | /Switch to buffer in perspective/ | SPC , | +| persp-next | /Switch to next perspective/ | SPC ] | +| persp-prev | /Switch to previous perspective/ | SPC [ | +| persp-add-buffer | /Add a buffer to current perspective/ | SPC + | +| persp-remove-by-name | /Remove perspective by name/ | SPC - | +| +workspace/switch-to-{0-9} | /Switch to workspace n/ | SPC 0-9 | + +#+begin_src emacs-lisp +(map! :leader + :desc "Switch to perspective NAME" "DEL" #'persp-switch + :desc "Switch to buffer in perspective" "," #'persp-switch-to-buffer + :desc "Switch to next perspective" "]" #'persp-next + :desc "Switch to previous perspective" "[" #'persp-prev + :desc "Add a buffer current perspective" "+" #'persp-add-buffer + :desc "Remove perspective by name" "-" #'persp-remove-by-name) +#+end_src + +* RAINBOW MODE +Rainbox mode displays the actual color for any hex value color. It's such a nice feature that I wanted it turned on all the time, regardless of what mode I am in. The following creates a global minor mode for rainbow-mode and enables it (exception: org-agenda-mode since rainbow-mode destroys all highlighting in org-agenda). + +#+begin_src emacs-lisp +(define-globalized-minor-mode global-rainbow-mode rainbow-mode + (lambda () + (when (not (memq major-mode + (list 'org-agenda-mode))) + (rainbow-mode 1)))) +(global-rainbow-mode 1 ) +#+end_src + +* REGISTERS +Emacs registers are compartments where you can save text, rectangles and positions for later use. Once you save text or a rectangle in a register, you can copy it into the buffer once or many times; once you save a position in a register, you can jump back to that position once or many times. The default GNU Emacs keybindings for these commands (with the exception of counsel-register) involves 'C-x r' followed by one or more other keys. I wanted to make this a little more user friendly, and since I am using Doom Emacs, I choose to replace the 'C-x r' part of the key chords with 'SPC r'. + +| COMMAND | DESCRIPTION | KEYBINDING | +|----------------------------------+----------------------------------+------------| +| copy-to-register | /Copy to register/ | SPC r c | +| frameset-to-register | /Frameset to register/ | SPC r f | +| insert-register | /Insert contents of register/ | SPC r i | +| jump-to-register | /Jump to register/ | SPC r j | +| list-registers | /List registers/ | SPC r l | +| number-to-register | /Number to register/ | SPC r n | +| counsel-register | /Interactively choose a register/ | SPC r r | +| view-register | /View a register/ | SPC r v | +| window-configuration-to-register | /Window configuration to register/ | SPC r w | +| increment-register | /Increment register/ | SPC r + | +| point-to-register | /Point to register/ | SPC r SPC | + +#+BEGIN_SRC emacs-lisp +(map! :leader + (:prefix ("r" . "registers") + :desc "Copy to register" "c" #'copy-to-register + :desc "Frameset to register" "f" #'frameset-to-register + :desc "Insert contents of register" "i" #'insert-register + :desc "Jump to register" "j" #'jump-to-register + :desc "List registers" "l" #'list-registers + :desc "Number to register" "n" #'number-to-register + :desc "Interactively choose a register" "r" #'counsel-register + :desc "View a register" "v" #'view-register + :desc "Window configuration to register" "w" #'window-configuration-to-register + :desc "Increment register" "+" #'increment-register + :desc "Point to register" "SPC" #'point-to-register)) +#+END_SRC + +* SHELLS +Settings for the various shells and terminal emulators within Emacs. + +| COMMAND | DESCRIPTION | KEYBINDING | +|---------------------+----------------------------+------------| +| eshell | /Launch the eshell/ | SPC e s | +| +eshell/toggle | /Toggle eshell popup window/ | SPC e t | +| counsel-esh-history | /Browse the eshell history/ | SPC e h | +| +vterm/toggle | /Toggle vterm popup window/ | SPC v t | + +#+BEGIN_SRC emacs-lisp +(setq shell-file-name "/bin/fish" + vterm-max-scrollback 5000) +(setq eshell-rc-script "~/.config/doom/eshell/profile" + eshell-aliases-file "~/.config/doom/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")) +(map! :leader + :desc "Eshell" "e s" #'eshell + :desc "Eshell popup toggle" "e t" #'+eshell/toggle + :desc "Counsel eshell history" "e h" #'counsel-esh-history + :desc "Vterm popup toggle" "v t" #'+vterm/toggle) +#+END_SRC + +* SPLITS +I set splits to default to opening on the right using 'prefer-horizontal-split'. I set a keybinding for 'clone-indirect-buffer-other-window' for when I want to have the same document in two splits. The text of the indirect buffer is always identical to the text of its base buffer; changes made by editing either one are visible immediately in the other. But in all other respects, the indirect buffer and its base buffer are completely separate. For example, I can fold one split but other will be unfolded. + +#+BEGIN_SRC emacs-lisp +(defun prefer-horizontal-split () + (set-variable 'split-height-threshold nil t) + (set-variable 'split-width-threshold 40 t)) ; make this as low as needed +(add-hook 'markdown-mode-hook 'prefer-horizontal-split) +(map! :leader + :desc "Clone indirect buffer other window" "b c" #'clone-indirect-buffer-other-window) +#+END_SRC + +* START PAGE +Instead of using Doom's Dashboard or the Emacs Dashboard program, I have decided to just set an custom start file as my "dashboard" since it allows me more customization options. I have added to the 'start-mode-hook' the argument 'read-only-mode'. This is to prevent accidental editing of the start file, and to prevent clashes with the 'start-mode' specific keybindings. You can toggle on/off read-only-mode with 'SPC t r'. + +#+begin_src emacs-lisp +(setq initial-buffer-choice "~/.config/doom/start.org") + +(define-minor-mode start-mode + "Provide functions for custom start page." + :lighter " start" + :keymap (let ((map (make-sparse-keymap))) + ;;(define-key map (kbd "M-z") 'eshell) + (evil-define-key 'normal start-mode-map + (kbd "1") '(lambda () (interactive) (find-file "~/.config/doom/config.org")) + (kbd "2") '(lambda () (interactive) (find-file "~/.config/doom/init.el")) + (kbd "3") '(lambda () (interactive) (find-file "~/.config/doom/packages.el")) + (kbd "4") '(lambda () (interactive) (find-file "~/.config/doom/eshell/aliases")) + (kbd "5") '(lambda () (interactive) (find-file "~/.config/doom/eshell/profile"))) + map)) + +(add-hook 'start-mode-hook 'read-only-mode) ;; make start.org read-only; use 'SPC t r' to toggle off read-only. +(provide 'start-mode) +#+end_src + +* TRANSPARENCY +Makes the emacs window transparent globally on start up. + +#+begin_src emacs-lisp +(add-to-list 'default-frame-alist '(alpha-background . 95)) +#+end_src + +* WINNER MODE +Winner mode has been included with GNU Emacs since version 20. This is a global minor mode and, when activated, it allows you to “undo” (and “redo”) changes in the window configuration with the key commands 'SCP w ' and 'SPC w '. + +#+BEGIN_SRC emacs-lisp +(map! :leader + (:prefix ("w" . "window") + :desc "Winner redo" "" #'winner-redo + :desc "Winner undo" "" #'winner-undo)) +#+END_SRC + +* ZAP TO CHAR +Emacs provides a 'zap-to-char' command that kills from the current point to a character. It is bound to 'M-z' in standard GNU Emacs but since Doom Emacs uses 'SPC' as its leader key and does not have 'SPC z' binded to anything, it just makes since to use it for 'zap-to-char'. Note that 'zap-to-char' can be used with the universal argument 'SPC u' to modify its behavior. Examples of 'zap-to-char' usage are listed in the table below: + +| KEYBINDING | WHAT IS DOES | +|---------------------------+------------------------------------------------------------| +| SPC z e | /deletes all chars to the next occurrence of 'e'/ | +| SPC u 2 SPC z e | /deletes all chars to the second occurrence of 'e'/ | +| SPC u - SPC z e | /deletes all chars to the previous occurrence of 'e'/ | +| SPC u - 2 SPC z e | /deletes all chars to the second previous occurrence of 'e'/ | +| SPC u 1 0 0 SPC u SPC z e | /deletes all chars to the 100th occurrence of 'e'/ | + +=TIP=: The universal argument (SPC u) can only take a single integer by default. If you need to use a multi-digit number (like 100 in the last example in the table above), then you must terminate the universal argument with another 'SPC u' after typing the number. + +'zap-up-to-char' is an alternative command that does not zap the char specified. It is binded to 'SPC Z'. It can also be used in conjunction with the universal argument 'SPC u' in similar fashion to the the 'zap-to-char' examples above. + +=NOTE=: Vim (evil mode) has similar functionality builtin. You can delete to the next occurrence of 'e' by using 'dte' in normal. To delete to the next occurrence of 'e' including the 'e', then you would use 'dfe'. And you can modify 'dt' and 'df' by prefixing them with numbers, so '2dte' would delete to the second occurrence of 'e'. + +#+BEGIN_SRC emacs-lisp +(map! :leader + :desc "Zap to char" "z" #'zap-to-char + :desc "Zap up to char" "Z" #'zap-up-to-char) +#+END_SRC diff --git a/.config/doom/eshell/aliases b/.config/doom/eshell/aliases new file mode 100644 index 0000000..ba389dc --- /dev/null +++ b/.config/doom/eshell/aliases @@ -0,0 +1,29 @@ +# Aliases for emacs commands +alias ff find-file $1 + +# Aliasing standard shell commands to better emacs alternatives +alias less view-file $1 + +# Changing "ls" to "exa" +alias ls exa -al --color=always --group-directories-first $* # my preferred listing +alias la exa -a --color=always --group-directories-first $* # all files and dirs +alias ll exa -l --color=always --group-directories-first $* # long format +alias lt exa -aT --color=always --group-directories-first $* # tree listing +alias l. exa -a1 $* | grep "^\." # list hidden files + +# Merge Xresources +alias merge xrdb -merge ~/.Xresources + +# Aliases for doom emacs utilties +alias doomsync ~/.emacs.d/bin/doom sync +alias doomdoctor ~/.emacs.d/bin/doom doctor +alias doomupgrade ~/.emacs.d/bin/doom upgrade +alias doompurge ~/.emacs.d/bin/doom purge + +# Confirm before overwriting something +alias cp cp -i $1 +alias mv mv -i $1 +alias rm rm -i $1 + +# Bare git repo alias for dotfiles +alias config /usr/bin/git --git-dir=$HOME/dotfiles --work-tree=$HOME $* diff --git a/.config/doom/eshell/profile b/.config/doom/eshell/profile new file mode 100644 index 0000000..3c871d6 --- /dev/null +++ b/.config/doom/eshell/profile @@ -0,0 +1 @@ +colorscript random \ No newline at end of file diff --git a/.config/doom/images/doom-emacs-dash.png b/.config/doom/images/doom-emacs-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..53141eeef884abc6070c9dacaa265d897d1a8d93 GIT binary patch literal 28349 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 Y1I6cR)As`}rT_o{07*qoM6N<$f--9{CIA2c literal 0 HcmV?d00001 diff --git a/.config/doom/images/emacs-dash.png b/.config/doom/images/emacs-dash.png new file mode 100644 index 0000000000000000000000000000000000000000..931758fcdf779bc7371bff1ae4e1c2c34d82e139 GIT binary patch literal 36692 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 P00000NkvXXu0mjfJI177 literal 0 HcmV?d00001 diff --git a/.config/doom/images/emacs-start-page.png b/.config/doom/images/emacs-start-page.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6441ea1c52e1bb885ea161631fc80a5385123d GIT binary patch literal 34520 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 UA9zzZg#idWUHx3vIVCg!0KI