;;; $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 "John Doe" ;; user-mail-address "john@doe.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-symbol-font' -- for symbols ;; - `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 "~/org/") ;; 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 ;; - `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. (setq doom-font (font-spec :family "DejaVu Sans Mono" :size 12) doom-variable-pitch-font (font-spec :family "Libertinus Serif" :size 15)) ;; theme ; my eyes won't accept anything else than tomorrow night (setq doom-theme 'doom-tomorrow-night ) ;(setq doom-theme 'doom-meltbus ) ; depressed, muted colors. ;(setq doom-theme 'doom-plain-dark ) ; themes for writing ;(setq doom-theme 'doom-plain ) ;; splash (setq fancy-splash-image (expand-file-name "img/camcorder.jpeg" doom-user-dir) +doom-dashboard-banner-padding '(0 . 0)) ;; doom dashboard ;; remove useless dashboard info (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-shortmenu) (remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-footer) (add-hook! '+doom-dashboard-mode-hook (hide-mode-line-mode 1) (hl-line-mode -1)) (setq-hook! '+doom-dashboard-mode-hook evil-normal-state-cursor (list nil)) ;; opacity ;(set-frame-parameter (selected-frame) 'alpha-background 90) (add-to-list 'default-frame-alist '(alpha-background . 90)) (after! org (setq display-line-numbers-type nil org-hide-emphasis-markers t org-pretty-entities t org-ellipsis "…" org-image-actual-width 600)) (setq display-line-numbers-type nil) ;; disable flyspell-mode (after! flyspell (setq-default spell-checking-enable-by-default nil)) ;; disable gutter for org-mode (after! git-gutter (setq git-gutter:disabled-modes '(fundamental-mode image-mode pdf-view-mode org-mode))) (after! org-journal (setq org-journal-dir "~/diary" org-journal-date-prefix "#+TITLE: " org-journal-time-prefix "+ " org-journal-date-format "%a, %Y-%m-%d" org-journal-file-format "%Y-%m-%d.org")) (use-package! org-books :defer t :config (setq org-books-file "~/notebook/readinglist.org")) (after! org (setq org-log-done 'time org-log-into-drawer t ;About the 2 elisp lines below: If you want to send items without explicit ;priorities to the bottom of the list you have to set org-default-priority to the ;value of org-lowest-priority). I did this to make recognize that: PRIORITY=0 are ;items without explicit priorities (not A, B or C, but just TODO) org-lowest-priority ?E org-default-priority ?E) (defun jethro/org-archive-done-tasks () "Archive all done tasks." (interactive) (org-map-entries 'org-archive-subtree "/DONE" 'file))) (setq org-directory "~/notebook/" bookmark-default-file "~/.doom.d/bookmarks") (setq org-agenda-files '("~/housekeeping/calendar.org" "~/notebook/ag/habits.org" "~/notebook/ag/todo.org" "~/notebook/ag/projects.org" "~/notebook/ag/refile.org" "~/notebook/ag/pomodoro.org" "~/notebook/ag/events/birthdays.org" "~/notebook/refile.org" )) (after! org-agenda (setq org-agenda-sticky t)) ; dont kill agendas (use-package! org-super-agenda :after org-agenda :init (setq org-agenda-skip-scheduled-if-done t org-agenda-skip-deadline-if-done t org-agenda-include-deadlines t org-agenda-block-separator nil org-agenda-compact-blocks t org-agenda-start-day nil ;; i.e. today org-agenda-span 1 org-agenda-start-on-weekday nil) (add-to-list 'org-agenda-custom-commands '("c" "Super view" ((agenda "" ((org-agenda-overriding-header "") (org-super-agenda-groups '((:name "Soon" :deadline future :order 3) (:name "Today" :time-grid t :date today :order 2) (:name "Due today" :deadline today :scheduled today :order 2) (:name "Overdue" :deadline past :scheduled past :order 1))))) (alltodo "" ((org-agenda-overriding-header "") (org-super-agenda-groups '(;(:name "Future" ; :scheduled future) (:discard (:anything t))))))))) :config (org-super-agenda-mode)) (setq org-agenda-prefix-format '( (agenda . " %?-12t% s") (todo . " %i %-12:c") (tags . " %i %-12:c") (search . " %i %-12:c"))) ;; hide tags (after! org-agenda (setq org-agenda-hide-tags-regexp (concat org-agenda-hide-tags-regexp "\\|sometag"))) ;; org-pomodoro (setq org-pomodoro-ask-upon-killing t org-pomodoro-keep-killed-pomodoro-time t org-pomodoro-length 25 org-pomodoro-manual-break t) (defun +org-pomodoro/3-5 () "Set Pomodoro intervals to 3-5" (interactive) (setq org-pomodoro-length 3) (setq org-pomodoro-short-break-length 5) (message "Pomodoro set to 3-5" (buffer-name))) (defun +org-pomodoro/5-5 () "Set Pomodoro intervals to 5-5" (interactive) (setq org-pomodoro-length 5) (setq org-pomodoro-short-break-length 5) (message "Pomodoro set to 3-5" (buffer-name))) (defun +org-pomodoro/10-5 () "Set Pomodoro intervals to 10-5" (interactive) (setq org-pomodoro-length 10) (setq org-pomodoro-short-break-length 5) (message "Pomodoro set to 10-5" (buffer-name))) (defun +org-pomodoro/15-5 () "Set Pomodoro intervals to 15-5" (interactive) (setq org-pomodoro-length 15) (setq org-pomodoro-short-break-length 5) (message "Pomodoro set to 15-5" (buffer-name))) (defun +org-pomodoro/25-5 () "Set Pomodoro intervals to 25-5" (interactive) (setq org-pomodoro-length 25) (setq org-pomodoro-short-break-length 5) (message "Pomodoro set to 25-5" (buffer-name))) (defun +org-pomodoro/30-10 () "Set Pomodoro intervals to 30-10" (interactive) (setq org-pomodoro-length 30) (setq org-pomodoro-short-break-length 10) (message "Pomodoro set to 30-10" (buffer-name))) (defun +org-pomodoro/50-10 () "Set Pomodoro intervals to 50-10" (interactive) (setq org-pomodoro-length 50) (setq org-pomodoro-short-break-length 10) (message "Pomodoro set to 50-10" (buffer-name))) ;; eisenhower matrix (after! org-agenda (add-to-list 'org-agenda-custom-commands '("1" "Eisenhower matrix" ((tags-todo "+PRIORITY=\"A\"-habits+todo" ((org-agenda-overriding-header "Urgent and important")))) nil)) (add-to-list 'org-agenda-custom-commands '("2" "Eisenhower matrix" ((tags-todo "+PRIORITY=\"B\"-habits+todo" ((org-agenda-overriding-header "Important but not urgent")))) nil)) (add-to-list 'org-agenda-custom-commands '("3" "Eisenhower matrix" ((tags-todo "+PRIORITY=\"C\"-habits+todo" ((org-agenda-overriding-header "Urgent but not important")))) nil)) (add-to-list 'org-agenda-custom-commands '("4" "Eisenhower matrix" ((tags-todo "+PRIORITY=0-PRIORITY=\"A\"-PRIORITY=\"B\"-PRIORITY=\"C\"-habits+todo" ;"+PRIORITY=0+PRIORITY=\"D\"-habits+todo" ((org-agenda-overriding-header "Neither important nor urgent")))) nil)) ;;; same but using lists (add-to-list 'org-agenda-custom-commands '("x" "Eisenhower Matrix (list)" ((tags-todo "+PRIORITY=\"A\"-habits+todo" ((org-agenda-overriding-header "Urgent and important"))) (tags-todo "+PRIORITY=\"B\"-habits+todo" ((org-agenda-overriding-header "Important but not urgent"))) (tags-todo "+PRIORITY=\"C\"-habits+todo" ((org-agenda-overriding-header "Urgent but not important"))) (tags-todo "+PRIORITY=0-PRIORITY=\"A\"-PRIORITY=\"B\"-PRIORITY=\"C\"-habits+todo" ((org-agenda-overriding-header "Neither important nor urgent")))) nil))) ;; eisenhower matrix grid (defun +eisenhower-matrix/agenda-1 () (interactive) (org-agenda nil "1")) (defun +eisenhower-matrix/agenda-2 () (interactive) (org-agenda nil "2")) (defun +eisenhower-matrix/agenda-3 () (interactive) (org-agenda nil "3")) (defun +eisenhower-matrix/agenda-4 () (interactive) (org-agenda nil "4")) (defun split-4-ways () (interactive) (delete-other-windows) (split-window-right) (split-window-below) (windmove-right) (split-window-below) (windmove-left)) (defun +eisenhower-matrix/redo-all-agenda-buffers () (interactive) (dolist (buffer (buffer-list)) (with-current-buffer buffer (when (derived-mode-p 'org-agenda-mode) (org-agenda-redo t))))) (defun +eisenhower-matrix/make-agendas () (interactive) (+eisenhower-matrix/agenda-1) (hide-mode-line-mode) (+eisenhower-matrix/agenda-2) (hide-mode-line-mode) (+eisenhower-matrix/agenda-3) (hide-mode-line-mode) (+eisenhower-matrix/agenda-4) (hide-mode-line-mode) ) (defun +eisenhower-matrix/make-eisenhower-matrix () (interactive) (+eisenhower-matrix/make-agendas) (split-4-ways) (switch-to-buffer "*Org Agenda(1)*") (windmove-right) (switch-to-buffer "*Org Agenda(2)*") (windmove-down) (switch-to-buffer "*Org Agenda(4)*") (windmove-left) (switch-to-buffer "*Org Agenda(3)*") ) ;; workspaces ;;; Commentary: provides 2 grid workspaces via function; ;;; +todo-workspaces/make-todo-workspace ;;; +todo-workspaces/make-todo-workspace-min (defun +todo-workspaces/agenda1 () (org-agenda nil "a")) (defun +todo-workspaces/agenda2 () (org-agenda nil "x")) (defun +todo-workspaces/make-todo-agendas () (+todo-workspaces/agenda1) (hide-mode-line-mode) (+todo-workspaces/agenda2) (hide-mode-line-mode)) (defun +todo-workspaces/split-todo-workspace () (delete-other-windows) (split-window-below) (windmove-down) (split-window-right) (windmove-up)) (defun +todo-workspaces/split-todo-workspace-min () (delete-other-windows) (split-window-below)) (defun +todo-workspaces/redo-all-agenda-buffers () (interactive) (dolist (buffer (buffer-list)) (with-current-buffer buffer (when (derived-mode-p 'org-agenda-mode) (org-agenda-redo t))))) (defun +todo-workspaces/make-todo-workspace () (interactive) ;(+todo-workspaces/redo-all-agenda-buffers) (+todo-workspaces/make-todo-agendas) (+todo-workspaces/split-todo-workspace) (switch-to-buffer "*Org Agenda(a)*") (windmove-down) (switch-to-buffer "*Org Agenda(x)*") (windmove-right) (find-file "~/notebook/ag/todo.org")) (defun +todo-workspaces/make-todo-workspace-min () (interactive) ;(+todo-workspaces/redo-all-agenda-buffers) (+todo-workspaces/make-todo-agendas) (+todo-workspaces/split-todo-workspace-min) (switch-to-buffer "*Org Agenda(a)*") (windmove-down) (switch-to-buffer "*Org Agenda(x)*")) (map! :leader (:prefix-map ("o" . "open") (:prefix-map ("w" . "workspaces") :desc "Eisenhower Matrix" "e" #'+eisenhower-matrix/make-eisenhower-matrix ;; classic eisenhower matrix :desc "Schedule/Eisenhower-list/todo" "t" #'+todo-workspaces/make-todo-workspace :desc "Schedule/Eisenhower-list" "s" #'+todo-workspaces/make-todo-workspace-min) (:prefix ("a" . "org agenda") :desc "Eisenhower Matrix" "e" #'+eisenhower-matrix/make-eisenhower-matrix ;; classic eisenhower matrix :desc "Rebuild All agendas" "r" #'+eisenhower-matrix/redo-all-agenda-buffers :desc "Schedule/Eisenhower-list/todo" "t" #'+todo-workspaces/make-todo-workspace ;; todo list is useless :desc "Schedule/Eisenhower-list" "s" #'+todo-workspaces/make-todo-workspace-min))) ;; org-roam configurations (use-package! org-roam :init :custom (org-roam-directory "~/notebook/roam/" ) (org-roam-dailies-capture-templates '(("d" "default" entry "* %<%I:%M %p>: %?" :if-new (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n"))))) ;; looks (cl-defmethod org-roam-node-type ((node org-roam-node)) "Return the TYPE of NODE." (condition-case nil (file-name-nondirectory (directory-file-name (file-name-directory (file-relative-name (org-roam-node-file node) org-roam-directory)))) (error ""))) (setq org-roam-node-display-template (concat "${type:15} ${title:30} " (propertize "${tags:10}" 'face 'org-tag))) (setq org-roam-capture-templates '(("d" "default" plain "%?" :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n") :unnarrowed t) ; main things ("l" "literature" plain "%?" :if-new (file+head "literature/%<%Y%m%d%H%M%S>-${title}.org" "#+title: ${title}\n") :immediate-finish t :unnarrowed t) ("p" "permanent" plain "%?" :if-new (file+head "permanent/%<%Y%m%d%H%M%S>-${title}.org" "#+title: ${title}\n") :immediate-finish t :unnarrowed t) ; now using inbox.org via org-capture ("f" "fleeting" plain "%?" :if-new (file+head "fleeting/%<%Y%m%d%H%M%S>-${title}.org" "#+title: ${title}\n") :immediate-finish t :unnarrowed t) ("s" "school" plain "%?" :if-new (file+head "school/%<%Y%m%d%H%M%S>-${title}.org" "#+title: ${title}\n") :immediate-finish t :unnarrowed t))) ;; org-capture (after! org ;; examples: file:~/.emacs.d/modules/lang/org/config.el ;; file:~/.emacs.d/modules/lang/org/autoload/org-capture.el ;; set locations personal and centralized files (defvar +org-capture-refile-file "ag/refile.org") (defun +org-capture-refile-file () (expand-file-name +org-capture-refile-file org-directory)) (defvar +org-capture-todo-custom-file "ag/todo.org") (defun +org-capture-todo-custom-file () (expand-file-name +org-capture-todo-custom-file org-directory)) (defvar +org-capture-custom-projects-file "ag/projects.org") (defun +org-capture-custom-central-project-todo-file () "TODO" (+org--capture-central-file +org-capture-custom-projects-file (projectile-project-name))) (defun +org-capture-custom-central-project-notes-file () "TODO" (+org--capture-central-file +org-capture-custom-projects-file (projectile-project-name))) (defun +org-capture-custom-central-project-changelog-file () "TODO" (+org--capture-central-file +org-capture-custom-projects-file (projectile-project-name))) ;(add-to-list 'org-capture-templates ; '(("s" "Slipbox" entry (file "braindump/org/inbox.org") ; "* %?\n") ; ("t" "Personal todo" entry ; (file+headline +org-capture-todo-file "Inbox") ; "* [ ] %?\n%i\n%a" :prepend t) ; ) (setq org-capture-templates '(("t" "Personal todo" entry (file+headline +org-capture-todo-custom-file "todo") "* TODO %?\n%i\n%a" :prepend t) ("T" "Personal todo (no link)" entry (file+headline +org-capture-todo-custom-file "todo") "* TODO %?\n" :prepend t) ;;; i never use this ;("n" "Personal notes" entry ;(file+headline +org-capture-notes-file "Inbox") ;"* %u %?\n%i\n%a" :prepend t) ("r" "Personal refile file" entry (file +org-capture-refile-file) "* %u %?\n%i\n%a" :prepend t) ;; using org-journal atm, i will likely never use this ;("j" "Journal" entry ;(file+olp+datetree +org-capture-journal-file) ;"* %U %?\n%i\n%a" :prepend t) ;; Will use {project-root}/{todo,notes,changelog}.org, unless a ;; {todo,notes,changelog}.org file is found in a parent directory. ;; Uses the basename from `+org-capture-todo-file', ;; `+org-capture-changelog-file' and `+org-capture-notes-file'. ("p" "Templates for projects") ("pt" "Project-local todo" entry ; {project-root}/todo.org (file+headline +org-capture-project-todo-file "Inbox") "* TODO %?\n%i\n%a" :prepend t) ("pn" "Project-local notes" entry ; {project-root}/notes.org (file+headline +org-capture-project-notes-file "Inbox") "* %U %?\n%i\n%a" :prepend t) ("pc" "Project-local changelog" entry ; {project-root}/changelog.org (file+headline +org-capture-project-changelog-file "Unreleased") "* %U %?\n%i\n%a" :prepend t) ;; reference for function: [[file:~/.emacs.d/modules/lang/org/autoload/org-capture.el::defun +org--capture-central-file (file project]] ;; Will use {org-directory}/{+org-capture-projects-file} and store ;; these under {ProjectName}/{Tasks,Notes,Changelog} headings. They ;; support `:parents' to specify what headings to put them under, e.g. ;; :parents ("Projects") ("o" "Centralized templates for projects") ("ot" "Project todo" entry (function +org-capture-custom-central-project-todo-file) "* TODO %?\n %i\n %a" :heading "Tasks" :prepend nil) ("on" "Project notes" entry (function +org-capture-custom-central-project-notes-file) "* %U %?\n %i\n %a" :heading "Notes" :prepend t) ("oc" "Project changelog" entry (function +org-capture-custom-central-project-changelog-file) "* %U %?\n %i\n %a" :heading "Changelog" :prepend t) ;; org books / general logging ("b" "Book log / General log (org)" item (function org-books-visit-book-log) "- %U %?" :prepend t) ;; zettelkasten ("s" "Slipbox" entry (file "roam/inbox.org") "* %U %?\n") ("S" "Slipbox link" entry (file "roam/inbox.org") "* %U %?\n %i\n %a")))) (use-package! org-wild-notifier :init (add-hook 'doom-post-init-hook (org-wild-notifier-mode)) :config (require 'org-duration) ;(setq alert-default-style 'libnotify) (setq org-wild-notifier-alert-time '(10 0)) (setq org-wild-notifier-keyword-whitelist nil) (setq org-wild-notifier-keyword-blacklist '("DONE")) (alert-add-rule :category "org-wild-notifier" :style (cond (alert-libnotify-command 'libnotify) (alert-default-style)))) ;;; play audio for for alerts (defun +org-wild-notifier/play-sound () (interactive) (start-process-shell-command "org-wild-notifier-audio-player" nil "mpg123 -f 23000 ~/resources/sounds/alerts/metal-gear-item-drop.mp3")) (defadvice org-wild-notifier--notify (after org-wild-notifier--play-sound-after-notify activate) (+org-wild-notifier/play-sound)) ;;; for testing notifications (defun org-wild-notifier-alert-test () (interactive) (alert "test" :category 'org-wild-notifier))