summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-02-08 16:07:01 +0100
committercashmere <cashmere@autistici.org>2026-02-08 16:07:01 +0100
commitebcd63abb46c407439050813d03dc310125920e1 (patch)
treea7dc1b2af294a57b505631653a4afe3ec694ccb8
parent830ecab976acfb5e18ec5095aeda2cb695931d8c (diff)
downloademacs-ebcd63abb46c407439050813d03dc310125920e1.tar.gz
add new configs
-rw-r--r--config.el595
-rw-r--r--config.org674
-rw-r--r--init.el6
-rw-r--r--org-clock-save.el1
-rw-r--r--themes/noctalia-theme.el361
5 files changed, 1526 insertions, 111 deletions
diff --git a/config.el b/config.el
index efe39c6..4f6e81b 100644
--- a/config.el
+++ b/config.el
@@ -571,6 +571,40 @@
(setq gptel-default-mode 'markdown-mode)
(setq gptel-backends (list my/openrouter-backend)))
+(use-package claude-code
+ :ensure t
+ :straight (:type git :host github :repo "stevemolitor/claude-code.el" :branch "main" :depth 1
+ :files ("*.el" (:exclude "images/*")))
+ :bind-keymap
+ ("C-c c" . claude-code-command-map) ;; or your preferred key
+ ;; Optionally define a repeat map so that "M" will cycle thru Claude auto-accept/plan/confirm modes after invoking claude-code-cycle-mode / C-c M.
+ :bind
+ (:repeat-map my-claude-code-map ("M" . claude-code-cycle-mode))
+ :config
+ ;; optional IDE integration with Monet
+ (add-hook 'claude-code-process-environment-functions #'monet-start-server-function)
+ (monet-mode 1)
+ (setq claude-code-terminal-backend 'vterm)
+ (claude-code-mode))
+
+(use-package inheritenv
+ :ensure t
+ :straight (:type git :host github :repo "purcell/inheritenv"))
+
+(use-package monet
+ :ensure t
+ :straight (:host github :repo "stevemolitor/monet"))
+
+(use-package agent-shell
+ :ensure t
+ ;; Add agent installation configs here
+ :config
+ (setq agent-shell-highlight-blocks t)
+ )
+
+(use-package acp
+ :ensure t)
+
(use-package eldoc
:straight nil
:ensure t
@@ -788,6 +822,427 @@ and convert it to Org using the pandoc utility."
(kill-region (point-min) (point-max)))
(yank)))
+(with-eval-after-load 'org
+ ;; Log state changes with timestamps
+ (setq org-log-done 'time
+ org-log-redeadline 'time
+ org-log-reschedule 'time
+ org-log-into-drawer t
+ org-enforce-todo-dependencies t)
+
+ ;; Update TODO keywords to require notes for WAIT and CANCELLED
+ ;; @ means: prompt for note when entering state
+ ;; ! means: timestamp when leaving state
+ (setq org-todo-keywords
+ '((sequence "TODO(t)" "NEXT(n)" "ACTIVE(a!)" "WAIT(w@/!)" "PLAN(p)" "|" "DONE(d!)" "CANCELLED(c@)")))
+
+ ;; Customize note prompts
+ (setq org-log-note-headings
+ '((done . "CLOSING NOTE %t")
+ (state . "State %-12s from %-12S %t")
+ (note . "Note taken on %t")
+ (reschedule . "Rescheduled from %S on %t")
+ (delschedule . "Not scheduled, was %S on %t")
+ (redeadline . "New deadline from %S on %t")
+ (deldeadline . "Removed deadline, was %S on %t")
+ (refile . "Refiled on %t")
+ (clock-out . ""))))
+
+(use-package org-clock
+ :after org
+ :straight nil
+ :ensure nil
+ :commands (org-clock-in org-clock-out org-clock-goto)
+ :config
+ ;; Setup hooks for clock persistence
+ (org-clock-persistence-insinuate)
+ (setq org-clock-clocked-in-display nil
+ org-clock-history-length 23
+ org-clock-in-switch-to-state 'my/clock-in-to-started
+ org-clock-out-when-done t
+ org-clock-persist t
+ org-clock-persist-query-resume nil)
+
+ ;; Helper function: detect if heading is a project
+ (defun my/is-project-p ()
+ "Any task with a todo keyword subtask."
+ (save-restriction
+ (widen)
+ (let ((has-subtask)
+ (subtree-end (save-excursion (org-end-of-subtree t)))
+ (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
+ (save-excursion
+ (forward-line 1)
+ (while (and (not has-subtask)
+ (< (point) subtree-end)
+ (re-search-forward "^\\*+ " subtree-end t))
+ (when (member (org-get-todo-state) org-todo-keywords-1)
+ (setq has-subtask t))))
+ (and is-a-task has-subtask))))
+
+ ;; Helper function: detect if heading is a task
+ (defun my/is-task-p ()
+ "Any task with a todo keyword and no subtask."
+ (save-restriction
+ (widen)
+ (let ((has-subtask)
+ (subtree-end (save-excursion (org-end-of-subtree t)))
+ (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
+ (save-excursion
+ (forward-line 1)
+ (while (and (not has-subtask)
+ (< (point) subtree-end)
+ (re-search-forward "^\\*+ " subtree-end t))
+ (when (member (org-get-todo-state) org-todo-keywords-1)
+ (setq has-subtask t))))
+ (and is-a-task (not has-subtask)))))
+
+ ;; Auto-change state when clocking in
+ (defun my/clock-in-to-started (kw)
+ "Switch task from TODO/NEXT to ACTIVE when clocking in.
+Skips capture tasks and projects."
+ (when (not (and (boundp 'org-capture-mode) org-capture-mode))
+ (cond
+ ;; Change TODO/NEXT tasks to ACTIVE when clocking in
+ ((and (member (org-get-todo-state) (list "TODO" "NEXT"))
+ (my/is-task-p))
+ "ACTIVE")
+ ;; Change ACTIVE projects back to TODO (projects shouldn't be clocked directly)
+ ((and (member (org-get-todo-state) (list "ACTIVE"))
+ (my/is-project-p))
+ "TODO"))))
+
+ :bind (("<f11>" . org-clock-goto)
+ ("C-c C-x C-i" . org-clock-in)
+ ("C-c C-x C-o" . org-clock-out)))
+
+(with-eval-after-load 'org
+ ;; Update effort values for longer focus sessions (night owl, deep work)
+ ;; Added 4h, 8h, 16h, 40h for multi-hour deep work blocks
+ (setq org-global-properties
+ '(("EFFORT_ALL" . "0:30 1:00 2:00 4:00 8:00 16:00 40:00")
+ ("COMPLEXITY_ALL" . "low medium high")
+ ("PRIORITY_ALL" . "A B C D")))
+
+ ;; Enhanced column view format with clocksum comparison
+ (setq org-columns-default-format
+ "%40ITEM(Task) %TODO %10EFFORT{+} %10CLOCKSUM %10PROGRESS %COMPLEXITY %DEADLINE")
+
+ ;; Auto-set effort from complexity (already exists, keeping it here for reference)
+ ;; Low complexity = 30 min, Medium = 2h, High = 5h
+ (defun my/org-set-effort-from-complexity ()
+ "Auto-set EFFORT property based on COMPLEXITY property."
+ (interactive)
+ (let* ((complexity (org-entry-get (point) "COMPLEXITY"))
+ (effort (org-entry-get (point) "EFFORT")))
+ (unless effort
+ (cond
+ ((string= complexity "low") (org-set-property "EFFORT" "0:30"))
+ ((string= complexity "medium") (org-set-property "EFFORT" "2:00"))
+ ((string= complexity "high") (org-set-property "EFFORT" "5:00"))))))
+
+ ;; Keybinding for manual effort setting
+ (define-key org-mode-map (kbd "C-c e") 'my/org-set-effort-from-complexity))
+
+(defun my/create-project ()
+ "Create a new project file with denote and comprehensive project structure."
+ (interactive)
+ (let* ((project-name (read-string "Project name: "))
+ (tags (completing-read-multiple "Additional tags (comma-separated): "
+ '("work" "personal" "university" "learning")))
+ (all-tags (cons "project" tags))
+ (deadline-str (org-read-date nil nil nil "Project deadline (optional, RET to skip): "))
+ (effort-str (completing-read "Estimated total effort: "
+ '("10h" "20h" "40h" "80h" "160h") nil nil "40h"))
+ (file-name (denote project-name all-tags)))
+ (find-file file-name)
+ (goto-char (point-max))
+ (insert "\n")
+ (insert "* " project-name "\n")
+ (insert ":PROPERTIES:\n")
+ (when (and deadline-str (not (string-empty-p deadline-str)))
+ (insert ":DEADLINE: <" deadline-str ">\n"))
+ (insert ":EFFORT: " effort-str "\n")
+ (insert ":PROGRESS: 0%\n")
+ (insert ":END:\n\n")
+
+ (insert "** Overview\n\n")
+ (insert "- Goal :: \n")
+ (insert "- Why :: \n")
+ (insert "- Success Criteria :: \n")
+ (insert "- Status :: Planning\n\n")
+
+ (insert "** Phases\n\n")
+ (insert "*** PLAN Phase 1: Planning & Research\n")
+ (when (and deadline-str (not (string-empty-p deadline-str)))
+ (insert "DEADLINE: <" deadline-str ">\n"))
+ (insert ":PROPERTIES:\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (insert "- [ ] Define scope\n")
+ (insert "- [ ] Research requirements\n")
+ (insert "- [ ] Break down into tasks\n\n")
+
+ (insert "*** PLAN Phase 2: Implementation\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+
+ (insert "*** PLAN Phase 3: Review & Polish\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+
+ (insert "** Resources\n\n")
+ (insert "- Links :: \n")
+ (insert "- Files :: \n")
+ (insert "- References :: \n\n")
+
+ (insert "** Time Tracking\n\n")
+ (insert "#+BEGIN: clocktable :scope file :maxlevel 3 :emphasize nil :link t\n")
+ (insert "#+END:\n\n")
+ (insert "Update with C-c C-c on the BEGIN line\n\n")
+
+ (insert "** Status Updates\n\n")
+ (insert "Use =C-c C-x C-c= for column view to update PROGRESS and see overview.\n\n")
+
+ (insert "** Retrospective\n\n")
+ (insert "- What worked :: \n")
+ (insert "- What didn't :: \n")
+ (insert "- Lessons learned :: \n")
+ (insert "- Would do differently :: \n")
+
+ (org-mode)
+ (goto-char (point-min))
+ (search-forward "- Goal :: " nil t)))
+
+(defun my/daily-review ()
+ "Append a simple daily review to today's journal - whenever you feel like it."
+ (interactive)
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Create or open today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add review section
+ (goto-char (point-max))
+ (unless (save-excursion
+ (beginning-of-line)
+ (looking-at "^\\*\\* Day Closed"))
+ (insert "\n** Day Closed " (format-time-string "[%H:%M]") "\n\n"))
+
+ (insert "*** What I did today\n")
+ (insert "#+BEGIN: clocktable :scope agenda :maxlevel 2 :block today\n")
+ (insert "#+END:\n\n")
+
+ (insert "*** Brain dump\n")
+ (insert "Thoughts, notes, captures, whatever:\n\n")
+
+ (insert "*** Projects check\n")
+ (insert "Quick status (or skip if nothing changed):\n")
+ (insert "- \n\n")
+
+ (insert "*** Tomorrow\n")
+ (insert "What to focus on (1-3 things):\n")
+ (insert "- \n\n")
+
+ (insert "*** How I felt\n")
+ (insert "- Energy: \n")
+ (insert "- Focus: \n")
+ (insert "- Notes: \n\n")
+
+ (org-mode)
+ (goto-char (point-max))
+ (search-backward "*** Brain dump" nil t)
+ (forward-line 2)
+ (end-of-line)))
+
+(defun my/reflection ()
+ "Create a reflection note - use whenever you feel like reviewing progress."
+ (interactive)
+ (require 'denote)
+ (let* ((title (read-string "Reflection on: " "Recent progress"))
+ (file-name (denote title '("reflection"))))
+ (find-file file-name)
+ (goto-char (point-max))
+ (insert "\n* " title "\n\n")
+
+ (insert "** Time spent recently\n\n")
+ (insert "#+BEGIN: clocktable :scope agenda :maxlevel 2 :block thisweek\n")
+ (insert "#+END:\n\n")
+ (insert "Or change to :block lastweek, :block thismonth, etc.\n\n")
+
+ (insert "** What's working?\n")
+ (insert "- \n\n")
+
+ (insert "** What's not working?\n")
+ (insert "- \n\n")
+
+ (insert "** Projects status\n")
+ (insert "#+BEGIN: columnview :id global :match \"project\" :format \"%ITEM %PROGRESS %EFFORT\"\n")
+ (insert "#+END:\n\n")
+
+ (insert "** What needs attention?\n")
+ (insert "- \n\n")
+
+ (insert "** Ideas / Changes\n")
+ (insert "- \n")
+
+ (org-mode)
+ (goto-char (point-min))
+ (search-forward "** What's working?" nil t)
+ (forward-line 1)
+ (end-of-line)))
+
+(defun my/org-capture-timeblock-to-journal ()
+ "Capture a time block to today's journal (refile later if needed)."
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((description (read-string "What: "))
+ (datetime (org-read-date t nil nil "When (date + time): "))
+ (duration (completing-read "Duration: "
+ '("30m" "1h" "1h30m" "2h" "3h" "4h" "6h" "8h")
+ nil nil "2h"))
+ (type (completing-read "Type: "
+ '("Work" "Personal" "Meal" "Break" "Focus" "Learning" "Exercise")
+ nil nil "Work"))
+ (today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Open or create today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add time block
+ (goto-char (point-max))
+ (insert "\n* TODO " description "\n")
+ (insert "SCHEDULED: <" datetime ">\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":DURATION: " duration "\n")
+ (insert ":TYPE: " type "\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (insert "Capture in journal - refile with C-c C-w if needed\n")
+ (current-buffer)))
+
+(defun my/org-capture-recurring-to-journal ()
+ "Capture a recurring time block to today's journal (habits like meals, exercise)."
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((description (read-string "What (recurring): "))
+ (start-date (org-read-date nil nil nil "Start date: "))
+ (time (read-string "Time (HH:MM): " "12:00"))
+ (repeat (completing-read "Repeat: "
+ '(".+1d" ".+2d" ".+1w" ".+1m")
+ nil nil ".+1d"))
+ (duration (completing-read "Duration: "
+ '("15m" "30m" "1h" "1h30m" "2h")
+ nil nil "1h"))
+ (type (completing-read "Type: "
+ '("Meal" "Exercise" "Break" "Routine")
+ nil nil "Meal"))
+ (today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Open or create today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add recurring block
+ (goto-char (point-max))
+ (insert "\n* TODO " description "\n")
+ (insert "SCHEDULED: <" start-date " " time " " repeat ">\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":STYLE: habit\n")
+ (insert ":DURATION: " duration "\n")
+ (insert ":TYPE: " type "\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (insert "Recurring habit - tracked with org-habit. Refile with C-c C-w if needed.\n")
+ (current-buffer)))
+
+(defun my/org-capture-meeting-to-journal ()
+ "Capture a meeting to today's journal (can refile to separate file later if needed)."
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((topic (read-string "Meeting topic: "))
+ (datetime (org-read-date t nil nil "When (date + time): "))
+ (duration (completing-read "Duration: "
+ '("15m" "30m" "1h" "1h30m" "2h")
+ nil nil "1h"))
+ (participants (read-string "Participants (optional): "))
+ (today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Open or create today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add meeting
+ (goto-char (point-max))
+ (insert "\n* Meeting: " topic "\n")
+ (insert "SCHEDULED: <" datetime ">\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":DURATION: " duration "\n")
+ (insert ":TYPE: Meeting\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (when (and participants (not (string-empty-p participants)))
+ (insert "** Attendees\n")
+ (insert "- " participants "\n\n"))
+ (insert "** Agenda\n")
+ (insert "- \n\n")
+ (insert "** Notes\n\n")
+ (insert "** Action Items\n")
+ (insert "- [ ] \n\n")
+ (insert "Captured in journal - refile to separate meeting file with C-c C-w if needed\n")
+ (org-mode)
+ (search-backward "** Agenda" nil t)
+ (forward-line 1)
+ (end-of-line)
+ (current-buffer)))
+
+;; Add to org-capture-templates (captures to journal, refile later if needed)
+(with-eval-after-load 'org-capture
+ (add-to-list 'org-capture-templates
+ '("b" "Time Block" plain
+ (function my/org-capture-timeblock-to-journal)
+ "" :immediate-finish t :jump-to-captured t))
+
+ (add-to-list 'org-capture-templates
+ '("r" "Recurring Block" plain
+ (function my/org-capture-recurring-to-journal)
+ "" :immediate-finish t :jump-to-captured t))
+
+ (add-to-list 'org-capture-templates
+ '("m" "Meeting" plain
+ (function my/org-capture-meeting-to-journal)
+ "" :immediate-finish nil :jump-to-captured t)))
+
(use-package org-noter
:ensure t
:defer t)
@@ -875,18 +1330,37 @@ and convert it to Org using the pandoc utility."
(
(org-ql-block '(and (scheduled :to today)
(not (done)))
- ((org-ql-block-header "Today's Schedule")
+ ((org-ql-block-header "πŸ“… Today's Schedule")
(org-super-agenda-groups
'(
- (:name "Morning Block (Before 12:00)"
- :time-grid t
+ (:name "πŸŒ™ Night (00:00-06:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 0) (< hour 6)))))
:order 1)
- (:name "Afternoon Block (12:00-17:00)"
- :time-grid t
+ (:name "πŸŒ… Morning (06:00-12:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 6) (< hour 12)))))
:order 2)
- (:name "Evening Block (After 17:00)"
- :time-grid t
+ (:name "β˜€οΈ Afternoon (12:00-18:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 12) (< hour 18)))))
:order 3)
+ (:name "πŸŒ† Evening (18:00-00:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 18) (< hour 24)))))
+ :order 4)
(:discard (:anything t))))))
(org-ql-block '(and (or (tags "self")
@@ -894,35 +1368,35 @@ and convert it to Org using the pandoc utility."
(not (scheduled))
(not (tags "project"))
(not (done)))
- ((org-ql-block-header "Unscheduled Today")
+ ((org-ql-block-header "πŸ“‹ Unscheduled Tasks")
(org-super-agenda-groups
'(
- (:name "ACTIVE"
+ (:name "πŸ”₯ ACTIVE (Currently Working)"
:todo "ACTIVE"
:order 1)
- (:name "NEXT"
+ (:name "⏭️ NEXT (Ready to Start)"
:todo "NEXT"
:order 2)
- (:name "TODO"
+ (:name "πŸ“ TODO (Backlog)"
:todo "TODO"
:order 3)
- (:name "WAIT"
+ (:name "⏸️ WAIT (Blocked)"
:todo "WAIT"
:order 4)
(:discard (:anything t))))))
(org-ql-block '(and (tags "project")
(not (done)))
- ((org-ql-block-header "Project Tasks")
+ ((org-ql-block-header "🎯 Project Tasks")
(org-super-agenda-groups
'(
- (:name "ACTIVE"
+ (:name "πŸ”₯ ACTIVE Projects"
:todo "ACTIVE"
:order 1)
- (:name "NEXT"
+ (:name "⏭️ NEXT Up"
:todo "NEXT"
:order 2)
- (:name "TODO"
+ (:name "πŸ“ TODO"
:todo "TODO"
:order 3)
(:discard (:anything t)))))))
@@ -1084,10 +1558,7 @@ and convert it to Org using the pandoc utility."
(setq org-columns-default-format
"%40ITEM(Task) %10TODO(State) %10EFFORT(Effort) %10COMPLEXITY(Complexity) %PRIORITY")
-(setq org-global-properties
- '(("EFFORT_ALL" . "0:15 0:30 1:00 2:00 3:00 5:00 8:00")
- ("COMPLEXITY_ALL" . "low medium high")
- ("PRIORITY_ALL" . "A B C")))
+;; org-global-properties now defined in workflow enhancements section above
(setq org-agenda-time-grid
'((daily today require-timed)
@@ -1097,8 +1568,7 @@ and convert it to Org using the pandoc utility."
(setq org-agenda-current-time-string
"--- NOW ---------------")
-(setq org-todo-keywords
- '((sequence "TODO(t)" "NEXT(n)" "ACTIVE(a)" "WAIT(w)" "|" "DONE(d)" "CANCELLED(c)")))
+;; org-todo-keywords now defined in workflow enhancements section above
(setq org-todo-keyword-faces
'(("TODO" . (:inherit (warning org-todo)))
@@ -1122,17 +1592,7 @@ and convert it to Org using the pandoc utility."
(add-hook 'after-load-theme-hook #'my/update-org-modern-faces)
(my/update-org-modern-faces)
-(defun org-set-effort-from-complexity ()
- (interactive)
- (let* ((complexity (org-entry-get (point) "COMPLEXITY"))
- (effort (org-entry-get (point) "EFFORT")))
- (unless effort
- (cond
- ((string= complexity "low") (org-set-property "EFFORT" "0:30"))
- ((string= complexity "medium") (org-set-property "EFFORT" "2:00"))
- ((string= complexity "high") (org-set-property "EFFORT" "5:00"))))))
-
-(define-key org-mode-map (kbd "C-c e") 'org-set-effort-from-complexity)
+;; org-set-effort-from-complexity now defined in workflow enhancements section above
(defun my/org-agenda-remove-tags ()
(save-excursion
@@ -1398,7 +1858,7 @@ Works on the base filename (without extension), e.g. matches \"-task\", \":task:
:hook
(after-init . vertico-mode)
:custom
- (vertico-count 10)
+ (vertico-count 16)
(vertico-resize nil)
(vertico-cycle nil)
:bind (:map vertico-map
@@ -1414,20 +1874,20 @@ Works on the base filename (without extension), e.g. matches \"-task\", \":task:
" ")
cand))))
-;; (use-package vertico-posframe
-;; :init
-;; (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes
-;; (right-fringe . 12)
-;; (accept-focus . t)))
-;; ;; (undecorated . nil) ;; Rounded frame
+(use-package vertico-posframe
+ :init
+ (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes
+ (right-fringe . 12)
+ (accept-focus . t)))
+ (undecorated . nil) ;; Rounded frame
-;; :config
-;; (vertico-posframe-mode 1)
-;; (setq vertico-posframe-width 96 ;; Narrow frame
-;; vertico-posframe-height vertico-count ;; Default height
-;; ;; Don't create posframe for these commands
-;; vertico-multiform-commands '((consult-line (:not posframe))
-;; (consult-ripgrep (:not posframe)))))
+ :config
+ (vertico-posframe-mode 1)
+ (setq vertico-posframe-width 124 ;; Narrow frame
+ vertico-posframe-height vertico-count ;; Default height
+ ;; Don't create posframe for these commands
+ vertico-multiform-commands '((consult-line (:not posframe))
+ (consult-ripgrep (:not posframe)))))
(use-package corfu
:ensure t
@@ -1599,10 +2059,11 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
(setq eglot-events-buffer-size 0)
(setq eglot-report-progress nil)
- (add-hook 'eglot-managed-mode-hook
- (lambda ()
+ (add-hook 'eglot-managed-mode-hook
+ (lambda ()
(eglot-inlay-hints-mode -1)
- (eglot-semantic-tokens-mode 1)))
+ (when (fboundp 'eglot-semantic-tokens-mode)
+ (eglot-semantic-tokens-mode 1))))
(setq eglot-ignored-server-capabilities
'(:inlayhintprovider :documenthighlightprovider)))
@@ -2316,7 +2777,7 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
:straight (:host github :repo "honmaple/emacs-maple-modeline")
:hook (after-init . maple-modeline-mode)
:config
- (setq maple-modeline-separator 'nil)
+ (setq maple-modeline-separator 'arrow)
(setq maple-modeline-height 25)
(setq maple-modeline-icon t)
@@ -2338,7 +2799,8 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
version-control
remote-host
region)
- :right (narrow
+ :right (misc-info
+ narrow
python
my-modeline-time
process
@@ -2386,9 +2848,9 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
(blink-cursor-mode 0)
(setq-default cursor-type 'box)
-(defvar cashmere/font-height 120)
+(defvar cashmere/font-height 140)
-(set-face-attribute 'default nil :family "MonoLisa Nerd Font" :weight 'medium :height cashmere/font-height)
+(set-face-attribute 'default nil :family "MonoLisa Nerd Font" :weight 'regular :height cashmere/font-height)
(set-face-attribute 'fixed-pitch nil :family "RobotoMono Nerd Font" :weight 'regular)
(set-face-attribute 'variable-pitch nil :family "Poppins" :weight 'regular :height 1.1)
@@ -2770,6 +3232,9 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
;; (base16-theme-define 'base24-nightfox base24-nightfox-colors)
;; (enable-theme 'base24-nightfox))
+(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/")
+(load-theme 'noctalia t)
+
(use-package dirvish
:straight t
:init
@@ -2891,6 +3356,13 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
;; Optional: Cache expires after 5 minutes for security.
(setq auth-source-cache-expiry 300)))
+(use-package eshell
+ :ensure nil
+ :straight nil)
+
+(use-package eshell-prompt-extras
+ :ensure t)
+
(use-package zoom
:ensure t)
(custom-set-variables
@@ -2938,9 +3410,13 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
"d" '(:ignore t :wk "denote")
"dj" '(denote-journal-new-or-existing-entry :wk "journal")
"dd" '(denote-menu-list-notes t :wk "List all notes")
+ "dl" '(denote-link t :wk "Link note")
"dg" '(consult-denote-grep t :wk "Search")
"dn" '(denote t :wk "Create a new note")
"dr" '(denote-rename-file t :wk "Rename Note")
+ "dp" '(my/create-project :wk "Create project")
+ "dR" '(my/daily-review :wk "Daily review")
+ "dD" '(my/reflection :wk "Reflection")
"dtl" '(tmr-list-timers :wk "list timer")
"dtt" '(tmr :wk "set timer")
@@ -2989,7 +3465,13 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
"gs" '(magit-file-stage :wk "stage file")
"gb" '(vc-annotate :wk "blame")
- "o" '(:ignore t :wk "open")
+ "o" '(:ignore t :wk "org/open")
+ "oa" '(:ignore t :wk "agenda")
+ "oad" '(org-agenda :wk "daily dashboard")
+ "oaw" '((lambda () (interactive) (org-agenda nil "w")) :wk "weekly overview")
+ "oap" '((lambda () (interactive) (org-agenda nil "p")) :wk "projects")
+ "oae" '((lambda () (interactive) (org-agenda nil "e")) :wk "evaluation")
+ "oac" '((lambda () (interactive) (org-agenda nil "c")) :wk "complexity matrix")
"h" '(:ignore t :wk "help")
"hm" '(describe-mode :wk "mode")
@@ -3382,6 +3864,9 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
(use-package emacs-everywhere
:ensure t)
+(use-package rg
+ :ensure t)
+
;; (profiler-start 'cpu)
;; (org-agenda nil "c")
;; (profiler-report)
diff --git a/config.org b/config.org
index 4ddb561..6e4f94a 100644
--- a/config.org
+++ b/config.org
@@ -1,4 +1,4 @@
-#+title: config.ors
+#+title: config.org
#+date: [2025-10-20 Mon 08:33]
#+identifier: 20251020T083323
#+PROPERTY: header-args
@@ -386,6 +386,8 @@
(message "centered-cursor on"))))
#+end_src
+*
+
* cursory
#+begin_src emacs-lisp
@@ -667,6 +669,60 @@ Not necessary but an eyecandy to look at!
(setq gptel-backends (list my/openrouter-backend)))
#+end_src
+** claude-code
+
+#+begin_src emacs-lisp
+(use-package claude-code
+ :ensure t
+ :straight (:type git :host github :repo "stevemolitor/claude-code.el" :branch "main" :depth 1
+ :files ("*.el" (:exclude "images/*")))
+ :bind-keymap
+ ("C-c c" . claude-code-command-map) ;; or your preferred key
+ ;; Optionally define a repeat map so that "M" will cycle thru Claude auto-accept/plan/confirm modes after invoking claude-code-cycle-mode / C-c M.
+ :bind
+ (:repeat-map my-claude-code-map ("M" . claude-code-cycle-mode))
+ :config
+ ;; optional IDE integration with Monet
+ (add-hook 'claude-code-process-environment-functions #'monet-start-server-function)
+ (monet-mode 1)
+ (setq claude-code-terminal-backend 'vterm)
+ (claude-code-mode))
+#+end_src
+
+*** inheritenv
+
+#+begin_src emacs-lisp
+(use-package inheritenv
+ :ensure t
+ :straight (:type git :host github :repo "purcell/inheritenv"))
+#+end_src
+
+** monet
+
+#+begin_src emacs-lisp
+(use-package monet
+ :ensure t
+ :straight (:host github :repo "stevemolitor/monet"))
+#+end_src
+
+* agent-shell
+
+#+begin_src emacs-lisp
+(use-package agent-shell
+ :ensure t
+ ;; Add agent installation configs here
+ :config
+ (setq agent-shell-highlight-blocks t)
+ )
+#+end_src
+
+** acp
+
+#+begin_src emacs-lisp
+(use-package acp
+ :ensure t)
+#+end_src
+
* eldoc
#+begin_src emacs-lisp
@@ -966,6 +1022,474 @@ and convert it to Org using the pandoc utility."
#+end_src
+** workflow enhancements
+
+These enhancements implement a comprehensive org-mode workflow based on GTD principles and your personal needs.
+
+*** org-log settings
+
+Track when and why tasks change state - essential for accountability and retrospectives.
+
+#+begin_src emacs-lisp
+(with-eval-after-load 'org
+ ;; Log state changes with timestamps
+ (setq org-log-done 'time
+ org-log-redeadline 'time
+ org-log-reschedule 'time
+ org-log-into-drawer t
+ org-enforce-todo-dependencies t)
+
+ ;; Update TODO keywords to require notes for WAIT and CANCELLED
+ ;; @ means: prompt for note when entering state
+ ;; ! means: timestamp when leaving state
+ (setq org-todo-keywords
+ '((sequence "TODO(t)" "NEXT(n)" "ACTIVE(a!)" "WAIT(w@/!)" "PLAN(p)" "|" "DONE(d!)" "CANCELLED(c@)")))
+
+ ;; Customize note prompts
+ (setq org-log-note-headings
+ '((done . "CLOSING NOTE %t")
+ (state . "State %-12s from %-12S %t")
+ (note . "Note taken on %t")
+ (reschedule . "Rescheduled from %S on %t")
+ (delschedule . "Not scheduled, was %S on %t")
+ (redeadline . "New deadline from %S on %t")
+ (deldeadline . "Removed deadline, was %S on %t")
+ (refile . "Refiled on %t")
+ (clock-out . ""))))
+#+end_src
+
+*** org-clock enhancements
+
+Automatic task state management when clocking in/out. Tasks automatically become ACTIVE when you start working.
+
+#+begin_src emacs-lisp
+(use-package org-clock
+ :after org
+ :straight nil
+ :ensure nil
+ :commands (org-clock-in org-clock-out org-clock-goto)
+ :config
+ ;; Setup hooks for clock persistence
+ (org-clock-persistence-insinuate)
+ (setq org-clock-clocked-in-display nil
+ org-clock-history-length 23
+ org-clock-in-switch-to-state 'my/clock-in-to-started
+ org-clock-out-when-done t
+ org-clock-persist t
+ org-clock-persist-query-resume nil)
+
+ ;; Helper function: detect if heading is a project
+ (defun my/is-project-p ()
+ "Any task with a todo keyword subtask."
+ (save-restriction
+ (widen)
+ (let ((has-subtask)
+ (subtree-end (save-excursion (org-end-of-subtree t)))
+ (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
+ (save-excursion
+ (forward-line 1)
+ (while (and (not has-subtask)
+ (< (point) subtree-end)
+ (re-search-forward "^\\*+ " subtree-end t))
+ (when (member (org-get-todo-state) org-todo-keywords-1)
+ (setq has-subtask t))))
+ (and is-a-task has-subtask))))
+
+ ;; Helper function: detect if heading is a task
+ (defun my/is-task-p ()
+ "Any task with a todo keyword and no subtask."
+ (save-restriction
+ (widen)
+ (let ((has-subtask)
+ (subtree-end (save-excursion (org-end-of-subtree t)))
+ (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
+ (save-excursion
+ (forward-line 1)
+ (while (and (not has-subtask)
+ (< (point) subtree-end)
+ (re-search-forward "^\\*+ " subtree-end t))
+ (when (member (org-get-todo-state) org-todo-keywords-1)
+ (setq has-subtask t))))
+ (and is-a-task (not has-subtask)))))
+
+ ;; Auto-change state when clocking in
+ (defun my/clock-in-to-started (kw)
+ "Switch task from TODO/NEXT to ACTIVE when clocking in.
+Skips capture tasks and projects."
+ (when (not (and (boundp 'org-capture-mode) org-capture-mode))
+ (cond
+ ;; Change TODO/NEXT tasks to ACTIVE when clocking in
+ ((and (member (org-get-todo-state) (list "TODO" "NEXT"))
+ (my/is-task-p))
+ "ACTIVE")
+ ;; Change ACTIVE projects back to TODO (projects shouldn't be clocked directly)
+ ((and (member (org-get-todo-state) (list "ACTIVE"))
+ (my/is-project-p))
+ "TODO"))))
+
+ :bind (("<f11>" . org-clock-goto)
+ ("C-c C-x C-i" . org-clock-in)
+ ("C-c C-x C-o" . org-clock-out)))
+#+end_src
+
+*** effort and complexity enhancements
+
+Better effort estimates for deep work sessions and automatic complexity mapping.
+
+#+begin_src emacs-lisp
+(with-eval-after-load 'org
+ ;; Update effort values for longer focus sessions (night owl, deep work)
+ ;; Added 4h, 8h, 16h, 40h for multi-hour deep work blocks
+ (setq org-global-properties
+ '(("EFFORT_ALL" . "0:30 1:00 2:00 4:00 8:00 16:00 40:00")
+ ("COMPLEXITY_ALL" . "low medium high")
+ ("PRIORITY_ALL" . "A B C D")))
+
+ ;; Enhanced column view format with clocksum comparison
+ (setq org-columns-default-format
+ "%40ITEM(Task) %TODO %10EFFORT{+} %10CLOCKSUM %10PROGRESS %COMPLEXITY %DEADLINE")
+
+ ;; Auto-set effort from complexity (already exists, keeping it here for reference)
+ ;; Low complexity = 30 min, Medium = 2h, High = 5h
+ (defun my/org-set-effort-from-complexity ()
+ "Auto-set EFFORT property based on COMPLEXITY property."
+ (interactive)
+ (let* ((complexity (org-entry-get (point) "COMPLEXITY"))
+ (effort (org-entry-get (point) "EFFORT")))
+ (unless effort
+ (cond
+ ((string= complexity "low") (org-set-property "EFFORT" "0:30"))
+ ((string= complexity "medium") (org-set-property "EFFORT" "2:00"))
+ ((string= complexity "high") (org-set-property "EFFORT" "5:00"))))))
+
+ ;; Keybinding for manual effort setting
+ (define-key org-mode-map (kbd "C-c e") 'my/org-set-effort-from-complexity))
+#+end_src
+
+*** project templates
+
+Interactive project creation with denote - includes structure, deadlines, timers, and clocktables.
+
+#+begin_src emacs-lisp
+(defun my/create-project ()
+ "Create a new project file with denote and comprehensive project structure."
+ (interactive)
+ (let* ((project-name (read-string "Project name: "))
+ (tags (completing-read-multiple "Additional tags (comma-separated): "
+ '("work" "personal" "university" "learning")))
+ (all-tags (cons "project" tags))
+ (deadline-str (org-read-date nil nil nil "Project deadline (optional, RET to skip): "))
+ (effort-str (completing-read "Estimated total effort: "
+ '("10h" "20h" "40h" "80h" "160h") nil nil "40h"))
+ (file-name (denote project-name all-tags)))
+ (find-file file-name)
+ (goto-char (point-max))
+ (insert "\n")
+ (insert "* " project-name "\n")
+ (insert ":PROPERTIES:\n")
+ (when (and deadline-str (not (string-empty-p deadline-str)))
+ (insert ":DEADLINE: <" deadline-str ">\n"))
+ (insert ":EFFORT: " effort-str "\n")
+ (insert ":PROGRESS: 0%\n")
+ (insert ":END:\n\n")
+
+ (insert "** Overview\n\n")
+ (insert "- Goal :: \n")
+ (insert "- Why :: \n")
+ (insert "- Success Criteria :: \n")
+ (insert "- Status :: Planning\n\n")
+
+ (insert "** Phases\n\n")
+ (insert "*** PLAN Phase 1: Planning & Research\n")
+ (when (and deadline-str (not (string-empty-p deadline-str)))
+ (insert "DEADLINE: <" deadline-str ">\n"))
+ (insert ":PROPERTIES:\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (insert "- [ ] Define scope\n")
+ (insert "- [ ] Research requirements\n")
+ (insert "- [ ] Break down into tasks\n\n")
+
+ (insert "*** PLAN Phase 2: Implementation\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+
+ (insert "*** PLAN Phase 3: Review & Polish\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+
+ (insert "** Resources\n\n")
+ (insert "- Links :: \n")
+ (insert "- Files :: \n")
+ (insert "- References :: \n\n")
+
+ (insert "** Time Tracking\n\n")
+ (insert "#+BEGIN: clocktable :scope file :maxlevel 3 :emphasize nil :link t\n")
+ (insert "#+END:\n\n")
+ (insert "Update with C-c C-c on the BEGIN line\n\n")
+
+ (insert "** Status Updates\n\n")
+ (insert "Use =C-c C-x C-c= for column view to update PROGRESS and see overview.\n\n")
+
+ (insert "** Retrospective\n\n")
+ (insert "- What worked :: \n")
+ (insert "- What didn't :: \n")
+ (insert "- Lessons learned :: \n")
+ (insert "- Would do differently :: \n")
+
+ (org-mode)
+ (goto-char (point-min))
+ (search-forward "- Goal :: " nil t)))
+
+#+end_src
+
+*** daily review - your way
+
+Flexible end-of-day closure ritual. Use whenever you feel like wrapping up the day.
+
+#+begin_src emacs-lisp
+(defun my/daily-review ()
+ "Append a simple daily review to today's journal - whenever you feel like it."
+ (interactive)
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Create or open today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add review section
+ (goto-char (point-max))
+ (unless (save-excursion
+ (beginning-of-line)
+ (looking-at "^\\*\\* Day Closed"))
+ (insert "\n** Day Closed " (format-time-string "[%H:%M]") "\n\n"))
+
+ (insert "*** What I did today\n")
+ (insert "#+BEGIN: clocktable :scope agenda :maxlevel 2 :block today\n")
+ (insert "#+END:\n\n")
+
+ (insert "*** Brain dump\n")
+ (insert "Thoughts, notes, captures, whatever:\n\n")
+
+ (insert "*** Projects check\n")
+ (insert "Quick status (or skip if nothing changed):\n")
+ (insert "- \n\n")
+
+ (insert "*** Tomorrow\n")
+ (insert "What to focus on (1-3 things):\n")
+ (insert "- \n\n")
+
+ (insert "*** How I felt\n")
+ (insert "- Energy: \n")
+ (insert "- Focus: \n")
+ (insert "- Notes: \n\n")
+
+ (org-mode)
+ (goto-char (point-max))
+ (search-backward "*** Brain dump" nil t)
+ (forward-line 2)
+ (end-of-line)))
+#+end_src
+
+*** reflection template
+
+For when YOU feel like doing a bigger review - no schedule, no pressure.
+
+#+begin_src emacs-lisp
+(defun my/reflection ()
+ "Create a reflection note - use whenever you feel like reviewing progress."
+ (interactive)
+ (require 'denote)
+ (let* ((title (read-string "Reflection on: " "Recent progress"))
+ (file-name (denote title '("reflection"))))
+ (find-file file-name)
+ (goto-char (point-max))
+ (insert "\n* " title "\n\n")
+
+ (insert "** Time spent recently\n\n")
+ (insert "#+BEGIN: clocktable :scope agenda :maxlevel 2 :block thisweek\n")
+ (insert "#+END:\n\n")
+ (insert "Or change to :block lastweek, :block thismonth, etc.\n\n")
+
+ (insert "** What's working?\n")
+ (insert "- \n\n")
+
+ (insert "** What's not working?\n")
+ (insert "- \n\n")
+
+ (insert "** Projects status\n")
+ (insert "#+BEGIN: columnview :id global :match \"project\" :format \"%ITEM %PROGRESS %EFFORT\"\n")
+ (insert "#+END:\n\n")
+
+ (insert "** What needs attention?\n")
+ (insert "- \n\n")
+
+ (insert "** Ideas / Changes\n")
+ (insert "- \n")
+
+ (org-mode)
+ (goto-char (point-min))
+ (search-forward "** What's working?" nil t)
+ (forward-line 1)
+ (end-of-line)))
+#+end_src
+
+*** time block captures
+
+Schedule everything - work, meals, personal time - with interactive time blocks.
+
+#+begin_src emacs-lisp
+(defun my/org-capture-timeblock-to-journal ()
+ "Capture a time block to today's journal (refile later if needed)."
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((description (read-string "What: "))
+ (datetime (org-read-date t nil nil "When (date + time): "))
+ (duration (completing-read "Duration: "
+ '("30m" "1h" "1h30m" "2h" "3h" "4h" "6h" "8h")
+ nil nil "2h"))
+ (type (completing-read "Type: "
+ '("Work" "Personal" "Meal" "Break" "Focus" "Learning" "Exercise")
+ nil nil "Work"))
+ (today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Open or create today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add time block
+ (goto-char (point-max))
+ (insert "\n* TODO " description "\n")
+ (insert "SCHEDULED: <" datetime ">\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":DURATION: " duration "\n")
+ (insert ":TYPE: " type "\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (insert "Capture in journal - refile with C-c C-w if needed\n")
+ (current-buffer)))
+
+(defun my/org-capture-recurring-to-journal ()
+ "Capture a recurring time block to today's journal (habits like meals, exercise)."
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((description (read-string "What (recurring): "))
+ (start-date (org-read-date nil nil nil "Start date: "))
+ (time (read-string "Time (HH:MM): " "12:00"))
+ (repeat (completing-read "Repeat: "
+ '(".+1d" ".+2d" ".+1w" ".+1m")
+ nil nil ".+1d"))
+ (duration (completing-read "Duration: "
+ '("15m" "30m" "1h" "1h30m" "2h")
+ nil nil "1h"))
+ (type (completing-read "Type: "
+ '("Meal" "Exercise" "Break" "Routine")
+ nil nil "Meal"))
+ (today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Open or create today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add recurring block
+ (goto-char (point-max))
+ (insert "\n* TODO " description "\n")
+ (insert "SCHEDULED: <" start-date " " time " " repeat ">\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":STYLE: habit\n")
+ (insert ":DURATION: " duration "\n")
+ (insert ":TYPE: " type "\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (insert "Recurring habit - tracked with org-habit. Refile with C-c C-w if needed.\n")
+ (current-buffer)))
+
+(defun my/org-capture-meeting-to-journal ()
+ "Capture a meeting to today's journal (can refile to separate file later if needed)."
+ (require 'denote)
+ (require 'denote-journal)
+ (let* ((topic (read-string "Meeting topic: "))
+ (datetime (org-read-date t nil nil "When (date + time): "))
+ (duration (completing-read "Duration: "
+ '("15m" "30m" "1h" "1h30m" "2h")
+ nil nil "1h"))
+ (participants (read-string "Participants (optional): "))
+ (today (format-time-string "%Y-%m-%d"))
+ (journal-files (denote-directory-files "journal"))
+ (today-journal (seq-find
+ (lambda (file)
+ (string-match-p today (file-name-nondirectory file)))
+ journal-files)))
+
+ ;; Open or create today's journal
+ (if today-journal
+ (find-file today-journal)
+ (denote-journal-new-or-existing-entry))
+
+ ;; Go to end and add meeting
+ (goto-char (point-max))
+ (insert "\n* Meeting: " topic "\n")
+ (insert "SCHEDULED: <" datetime ">\n")
+ (insert ":PROPERTIES:\n")
+ (insert ":DURATION: " duration "\n")
+ (insert ":TYPE: Meeting\n")
+ (insert ":CREATED: " (format-time-string "[%Y-%m-%d %a %H:%M]") "\n")
+ (insert ":END:\n\n")
+ (when (and participants (not (string-empty-p participants)))
+ (insert "** Attendees\n")
+ (insert "- " participants "\n\n"))
+ (insert "** Agenda\n")
+ (insert "- \n\n")
+ (insert "** Notes\n\n")
+ (insert "** Action Items\n")
+ (insert "- [ ] \n\n")
+ (insert "Captured in journal - refile to separate meeting file with C-c C-w if needed\n")
+ (org-mode)
+ (search-backward "** Agenda" nil t)
+ (forward-line 1)
+ (end-of-line)
+ (current-buffer)))
+
+;; Add to org-capture-templates (captures to journal, refile later if needed)
+(with-eval-after-load 'org-capture
+ (add-to-list 'org-capture-templates
+ '("b" "Time Block" plain
+ (function my/org-capture-timeblock-to-journal)
+ "" :immediate-finish t :jump-to-captured t))
+
+ (add-to-list 'org-capture-templates
+ '("r" "Recurring Block" plain
+ (function my/org-capture-recurring-to-journal)
+ "" :immediate-finish t :jump-to-captured t))
+
+ (add-to-list 'org-capture-templates
+ '("m" "Meeting" plain
+ (function my/org-capture-meeting-to-journal)
+ "" :immediate-finish nil :jump-to-captured t)))
+#+end_src
+
** notation
*** org-noter
@@ -1086,18 +1610,37 @@ and convert it to Org using the pandoc utility."
(
(org-ql-block '(and (scheduled :to today)
(not (done)))
- ((org-ql-block-header "Today's Schedule")
+ ((org-ql-block-header "πŸ“… Today's Schedule")
(org-super-agenda-groups
'(
- (:name "Morning Block (Before 12:00)"
- :time-grid t
+ (:name "πŸŒ™ Night (00:00-06:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 0) (< hour 6)))))
:order 1)
- (:name "Afternoon Block (12:00-17:00)"
- :time-grid t
+ (:name "πŸŒ… Morning (06:00-12:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 6) (< hour 12)))))
:order 2)
- (:name "Evening Block (After 17:00)"
- :time-grid t
+ (:name "β˜€οΈ Afternoon (12:00-18:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 12) (< hour 18)))))
:order 3)
+ (:name "πŸŒ† Evening (18:00-00:00)"
+ :and (:scheduled today :time-grid t)
+ :pred (lambda (item)
+ (when-let ((time (org-get-scheduled-time (point))))
+ (let ((hour (nth 2 (decode-time time))))
+ (and (>= hour 18) (< hour 24)))))
+ :order 4)
(:discard (:anything t))))))
(org-ql-block '(and (or (tags "self")
@@ -1105,35 +1648,35 @@ and convert it to Org using the pandoc utility."
(not (scheduled))
(not (tags "project"))
(not (done)))
- ((org-ql-block-header "Unscheduled Today")
+ ((org-ql-block-header "πŸ“‹ Unscheduled Tasks")
(org-super-agenda-groups
'(
- (:name "ACTIVE"
+ (:name "πŸ”₯ ACTIVE (Currently Working)"
:todo "ACTIVE"
:order 1)
- (:name "NEXT"
+ (:name "⏭️ NEXT (Ready to Start)"
:todo "NEXT"
:order 2)
- (:name "TODO"
+ (:name "πŸ“ TODO (Backlog)"
:todo "TODO"
:order 3)
- (:name "WAIT"
+ (:name "⏸️ WAIT (Blocked)"
:todo "WAIT"
:order 4)
(:discard (:anything t))))))
(org-ql-block '(and (tags "project")
(not (done)))
- ((org-ql-block-header "Project Tasks")
+ ((org-ql-block-header "🎯 Project Tasks")
(org-super-agenda-groups
'(
- (:name "ACTIVE"
+ (:name "πŸ”₯ ACTIVE Projects"
:todo "ACTIVE"
:order 1)
- (:name "NEXT"
+ (:name "⏭️ NEXT Up"
:todo "NEXT"
:order 2)
- (:name "TODO"
+ (:name "πŸ“ TODO"
:todo "TODO"
:order 3)
(:discard (:anything t)))))))
@@ -1295,10 +1838,7 @@ and convert it to Org using the pandoc utility."
(setq org-columns-default-format
"%40ITEM(Task) %10TODO(State) %10EFFORT(Effort) %10COMPLEXITY(Complexity) %PRIORITY")
-(setq org-global-properties
- '(("EFFORT_ALL" . "0:15 0:30 1:00 2:00 3:00 5:00 8:00")
- ("COMPLEXITY_ALL" . "low medium high")
- ("PRIORITY_ALL" . "A B C")))
+;; org-global-properties now defined in workflow enhancements section above
(setq org-agenda-time-grid
'((daily today require-timed)
@@ -1308,8 +1848,7 @@ and convert it to Org using the pandoc utility."
(setq org-agenda-current-time-string
"--- NOW ---------------")
-(setq org-todo-keywords
- '((sequence "TODO(t)" "NEXT(n)" "ACTIVE(a)" "WAIT(w)" "|" "DONE(d)" "CANCELLED(c)")))
+;; org-todo-keywords now defined in workflow enhancements section above
(setq org-todo-keyword-faces
'(("TODO" . (:inherit (warning org-todo)))
@@ -1333,17 +1872,7 @@ and convert it to Org using the pandoc utility."
(add-hook 'after-load-theme-hook #'my/update-org-modern-faces)
(my/update-org-modern-faces)
-(defun org-set-effort-from-complexity ()
- (interactive)
- (let* ((complexity (org-entry-get (point) "COMPLEXITY"))
- (effort (org-entry-get (point) "EFFORT")))
- (unless effort
- (cond
- ((string= complexity "low") (org-set-property "EFFORT" "0:30"))
- ((string= complexity "medium") (org-set-property "EFFORT" "2:00"))
- ((string= complexity "high") (org-set-property "EFFORT" "5:00"))))))
-
-(define-key org-mode-map (kbd "C-c e") 'org-set-effort-from-complexity)
+;; org-set-effort-from-complexity now defined in workflow enhancements section above
(defun my/org-agenda-remove-tags ()
(save-excursion
@@ -1704,7 +2233,7 @@ Some goodies for better integration with org files.
:hook
(after-init . vertico-mode)
:custom
- (vertico-count 10)
+ (vertico-count 16)
(vertico-resize nil)
(vertico-cycle nil)
:bind (:map vertico-map
@@ -1724,20 +2253,20 @@ Some goodies for better integration with org files.
** vertico-posframe
#+begin_src emacs-lisp
-;; (use-package vertico-posframe
-;; :init
-;; (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes
-;; (right-fringe . 12)
-;; (accept-focus . t)))
-;; ;; (undecorated . nil) ;; Rounded frame
+(use-package vertico-posframe
+ :init
+ (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes
+ (right-fringe . 12)
+ (accept-focus . t)))
+ (undecorated . nil) ;; Rounded frame
-;; :config
-;; (vertico-posframe-mode 1)
-;; (setq vertico-posframe-width 96 ;; Narrow frame
-;; vertico-posframe-height vertico-count ;; Default height
-;; ;; Don't create posframe for these commands
-;; vertico-multiform-commands '((consult-line (:not posframe))
-;; (consult-ripgrep (:not posframe)))))
+ :config
+ (vertico-posframe-mode 1)
+ (setq vertico-posframe-width 124 ;; Narrow frame
+ vertico-posframe-height vertico-count ;; Default height
+ ;; Don't create posframe for these commands
+ vertico-multiform-commands '((consult-line (:not posframe))
+ (consult-ripgrep (:not posframe)))))
#+end_src
** corfu
@@ -1953,10 +2482,11 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
(setq eglot-events-buffer-size 0)
(setq eglot-report-progress nil)
- (add-hook 'eglot-managed-mode-hook
- (lambda ()
+ (add-hook 'eglot-managed-mode-hook
+ (lambda ()
(eglot-inlay-hints-mode -1)
- (eglot-semantic-tokens-mode 1)))
+ (when (fboundp 'eglot-semantic-tokens-mode)
+ (eglot-semantic-tokens-mode 1))))
(setq eglot-ignored-server-capabilities
'(:inlayhintprovider :documenthighlightprovider)))
@@ -3197,7 +3727,7 @@ ily <3.
:straight (:host github :repo "honmaple/emacs-maple-modeline")
:hook (after-init . maple-modeline-mode)
:config
- (setq maple-modeline-separator 'nil)
+ (setq maple-modeline-separator 'arrow)
(setq maple-modeline-height 25)
(setq maple-modeline-icon t)
@@ -3219,7 +3749,8 @@ ily <3.
version-control
remote-host
region)
- :right (narrow
+ :right (misc-info
+ narrow
python
my-modeline-time
process
@@ -3277,9 +3808,9 @@ ily <3.
(blink-cursor-mode 0)
(setq-default cursor-type 'box)
-(defvar cashmere/font-height 120)
+(defvar cashmere/font-height 140)
-(set-face-attribute 'default nil :family "MonoLisa Nerd Font" :weight 'medium :height cashmere/font-height)
+(set-face-attribute 'default nil :family "MonoLisa Nerd Font" :weight 'regular :height cashmere/font-height)
(set-face-attribute 'fixed-pitch nil :family "RobotoMono Nerd Font" :weight 'regular)
(set-face-attribute 'variable-pitch nil :family "Poppins" :weight 'regular :height 1.1)
@@ -3700,6 +4231,9 @@ ily <3.
;; (base16-theme-define 'base24-nightfox base24-nightfox-colors)
;; (enable-theme 'base24-nightfox))
+
+(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/")
+(load-theme 'noctalia t)
#+end_src
* dirvish
@@ -3876,6 +4410,16 @@ ily <3.
(setq auth-source-cache-expiry 300)))
#+end_src
+* eshell
+#+begin_src emacs-lisp
+(use-package eshell
+ :ensure nil
+ :straight nil)
+
+(use-package eshell-prompt-extras
+ :ensure t)
+#+end_src
+
* zoom
#+begin_src emacs-lisp
@@ -3938,9 +4482,13 @@ ily <3.
"d" '(:ignore t :wk "denote")
"dj" '(denote-journal-new-or-existing-entry :wk "journal")
"dd" '(denote-menu-list-notes t :wk "List all notes")
+ "dl" '(denote-link t :wk "Link note")
"dg" '(consult-denote-grep t :wk "Search")
"dn" '(denote t :wk "Create a new note")
"dr" '(denote-rename-file t :wk "Rename Note")
+ "dp" '(my/create-project :wk "Create project")
+ "dR" '(my/daily-review :wk "Daily review")
+ "dD" '(my/reflection :wk "Reflection")
"dtl" '(tmr-list-timers :wk "list timer")
"dtt" '(tmr :wk "set timer")
@@ -3989,7 +4537,13 @@ ily <3.
"gs" '(magit-file-stage :wk "stage file")
"gb" '(vc-annotate :wk "blame")
- "o" '(:ignore t :wk "open")
+ "o" '(:ignore t :wk "org/open")
+ "oa" '(:ignore t :wk "agenda")
+ "oad" '(org-agenda :wk "daily dashboard")
+ "oaw" '((lambda () (interactive) (org-agenda nil "w")) :wk "weekly overview")
+ "oap" '((lambda () (interactive) (org-agenda nil "p")) :wk "projects")
+ "oae" '((lambda () (interactive) (org-agenda nil "e")) :wk "evaluation")
+ "oac" '((lambda () (interactive) (org-agenda nil "c")) :wk "complexity matrix")
"h" '(:ignore t :wk "help")
"hm" '(describe-mode :wk "mode")
@@ -4132,6 +4686,7 @@ ily <3.
"mC" '(rust-check :wk "check"))
#+end_src
+
** denote-menu keymaps
#+begin_src emacs-lisp
@@ -4462,6 +5017,13 @@ this package provides the ability to display rgb and hex colors.
+* rg
+
+#+begin_src emacs-lisp
+(use-package rg
+ :ensure t)
+#+end_src
+
* profiler
#+begin_src emacs-lisp
diff --git a/init.el b/init.el
index 0380708..b65140e 100644
--- a/init.el
+++ b/init.el
@@ -19,6 +19,12 @@
(straight-use-package '(project :type built-in))
(straight-use-package '(xref :type built-in))
+(straight-use-package '(eglot :type built-in))
+(straight-use-package '(flymake :type built-in))
+(straight-use-package '(jsonrpc :type built-in))
+(straight-use-package '(eldoc :type built-in))
+(straight-use-package '(external-completion :type built-in))
+(straight-use-package '(seq :type built-in))
(straight-use-package 'use-package)
(setq straight-use-package-by-default t)
diff --git a/org-clock-save.el b/org-clock-save.el
new file mode 100644
index 0000000..fc2aea6
--- /dev/null
+++ b/org-clock-save.el
@@ -0,0 +1 @@
+;; org-clock-save.el - workstation at <2026-02-08 Sun 03:36> -*- lexical-binding: t; -*-
diff --git a/themes/noctalia-theme.el b/themes/noctalia-theme.el
new file mode 100644
index 0000000..9518af8
--- /dev/null
+++ b/themes/noctalia-theme.el
@@ -0,0 +1,361 @@
+;;; noctalia-theme.el --- Theme using Template SCSS variables -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025
+
+;; Author: Generated (Improved)
+;; Version: 1.2
+;; Package-Requires: ((emacs "24.1"))
+;; Keywords: faces
+
+;;; Commentary:
+
+;; A theme using Template SCSS variables with quality of life improvements:
+;; - Better source block distinction
+;; - Improved text visibility when selected
+;; - Refined org-mode styling with hidden asterisks
+;; - Enhanced contrast and readability
+;; - Seamless integration of source blocks with consistent styling
+
+;;; Code:
+
+(deftheme noctalia "Theme using Template variables with quality of life improvements.")
+
+;; Define all the color variables (replaced by template processor)
+(let* ((bg "#f6f2ee")
+ (err "#a5222f")
+ (err-container "#db9ea4")
+ (on-background "#3d2b5a")
+ (on-err "#f6f2ee")
+ (on-err-container "#3f0d12")
+ (on-primary "#f6f2ee")
+ (on-primary-container "#0f1a3e")
+ (on-secondary "#f6f2ee")
+ (on-secondary-container "#1b3122")
+ (on-surface "#3d2b5a")
+ (on-surface-variant "#534c45")
+ (on-tertiary "#f6f2ee")
+ (on-tertiary-container "#210f3e")
+ (outline-color "#824d5b")
+ (outline-variant "#ab7180")
+ (primary "#2848a9")
+ (primary-container "#a8b5db")
+ (secondary "#396847")
+ (secondary-container "#90c39f")
+ (shadow "#d3c7bb")
+ (surface "#f6f2ee")
+ (surface-container "#d3c7bb")
+ (surface-container-high "#cbbdaf")
+ (surface-container-highest "#c3b3a2")
+ (surface-container-low "#e4dcd4")
+ (surface-container-lowest "#efe9e3")
+ (surface-variant "#d3c7bb")
+ (tertiary "#6e33ce")
+ (tertiary-container "#d5c9e9")
+ ;; Map success colors to tertiary (as used in other templates)
+ (success "#6e33ce")
+ (on-success "#f6f2ee")
+ (success-container "#d5c9e9")
+ (on-success-container "#210f3e")
+ ;; Map fixed colors to regular colors
+ (primary-fixed "#2848a9")
+ (primary-fixed-dim "#a8b5db")
+ (secondary-fixed "#396847")
+ (secondary-fixed-dim "#90c39f")
+ (tertiary-fixed "#6e33ce")
+ (tertiary-fixed-dim "#d5c9e9")
+ (on-primary-fixed "#f6f2ee")
+ (on-primary-fixed-variant "#0f1a3e")
+ (on-secondary-fixed "#f6f2ee")
+ (on-secondary-fixed-variant "#1b3122")
+ (on-tertiary-fixed "#f6f2ee")
+ (on-tertiary-fixed-variant "#210f3e")
+ ;; Map inverse colors to surface variants
+ (inverse-on-surface "#3d2b5a")
+ (inverse-primary "#2848a9")
+ (inverse-surface "#f6f2ee")
+ ;; Map terminal colors (term0-term15) to available colors
+ (term0 "#f6f2ee")
+ (term1 "#a5222f")
+ (term2 "#6e33ce")
+ (term3 "#396847")
+ (term4 "#2848a9")
+ (term5 "#d5c9e9")
+ (term6 "#90c39f")
+ (term7 "#3d2b5a")
+ (term8 "#824d5b")
+ (term9 "#a5222f")
+ (term10 "#6e33ce")
+ (term11 "#396847")
+ (term12 "#2848a9")
+ (term13 "#d5c9e9")
+ (term14 "#90c39f")
+ (term15 "#3d2b5a"))
+
+ (custom-theme-set-faces
+ 'noctalia
+ ;; Basic faces
+ `(default ((t (:background ,bg :foreground ,on-background))))
+ `(cursor ((t (:background ,primary))))
+ `(highlight ((t (:background ,surface-container-high))))
+ `(region ((t (:background ,primary-container :foreground ,on-primary-container :extend t))))
+ `(secondary-selection ((t (:background ,secondary-container :foreground ,on-secondary-container :extend t))))
+ `(isearch ((t (:background ,tertiary-container :foreground ,on-tertiary-container :weight bold))))
+ `(lazy-highlight ((t (:background ,secondary-container :foreground ,on-secondary-container))))
+ `(vertical-border ((t (:foreground ,surface-variant))))
+ `(border ((t (:background ,surface-variant :foreground ,surface-variant))))
+ `(fringe ((t (:background ,surface :foreground ,outline-variant))))
+ `(shadow ((t (:foreground ,outline-variant))))
+ `(link ((t (:foreground ,primary :underline t))))
+ `(link-visited ((t (:foreground ,tertiary :underline t))))
+ `(success ((t (:foreground ,success))))
+ `(warning ((t (:foreground ,secondary))))
+ `(error ((t (:foreground ,err))))
+ `(match ((t (:background ,secondary-container :foreground ,on-secondary-container))))
+
+ ;; Font-lock
+ `(font-lock-builtin-face ((t (:foreground ,primary))))
+ `(font-lock-comment-face ((t (:foreground ,outline-color :slant italic))))
+ `(font-lock-comment-delimiter-face ((t (:foreground ,outline-variant))))
+ `(font-lock-constant-face ((t (:foreground ,tertiary :weight bold))))
+ `(font-lock-doc-face ((t (:foreground ,on-surface-variant :slant italic))))
+ `(font-lock-function-name-face ((t (:foreground ,primary :weight bold))))
+ `(font-lock-keyword-face ((t (:foreground ,secondary :weight bold))))
+ `(font-lock-string-face ((t (:foreground ,tertiary))))
+ `(font-lock-type-face ((t (:foreground ,primary-fixed))))
+ `(font-lock-variable-name-face ((t (:foreground ,on-surface))))
+ `(font-lock-warning-face ((t (:foreground ,err :weight bold))))
+ `(font-lock-preprocessor-face ((t (:foreground ,secondary-fixed-dim))))
+ `(font-lock-negation-char-face ((t (:foreground ,tertiary-fixed))))
+
+ ;; Show paren
+ `(show-paren-match ((t (:background ,primary-container :foreground ,on-primary-container :weight bold))))
+ `(show-paren-mismatch ((t (:background ,err-container :foreground ,on-err-container :weight bold))))
+
+ ;; Mode line - improved status bar styling
+ `(mode-line ((t (:background ,surface-container-high :foreground ,on-surface :box nil))))
+ `(mode-line-inactive ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+ `(mode-line-buffer-id ((t (:foreground ,primary :weight bold))))
+ `(mode-line-emphasis ((t (:foreground ,primary :weight bold))))
+ `(mode-line-highlight ((t (:foreground ,primary :box nil))))
+
+ ;; Improved Source blocks - make them integrated with the theme
+ `(org-block ((t (:background ,surface-container-low :extend t :inherit fixed-pitch))))
+ `(org-block-begin-line ((t (:background ,surface-container-low :foreground ,primary-fixed-dim :extend t :slant italic :inherit fixed-pitch))))
+ `(org-block-end-line ((t (:background ,surface-container-low :foreground ,primary-fixed-dim :extend t :slant italic :inherit fixed-pitch))))
+ `(org-code ((t (:background ,surface-container-low :foreground ,tertiary-fixed :inherit fixed-pitch))))
+ `(org-verbatim ((t (:background ,surface-container-low :foreground ,primary-fixed :inherit fixed-pitch))))
+ `(org-meta-line ((t (:foreground ,outline-color :slant italic))))
+
+ ;; Org mode with hidden asterisks
+ `(org-level-1 ((t (:foreground ,primary :weight bold :height 1.2))))
+ `(org-level-2 ((t (:foreground ,primary-container :weight bold :height 1.1))))
+ `(org-level-3 ((t (:foreground ,secondary :weight bold))))
+ `(org-level-4 ((t (:foreground ,secondary-container :weight bold))))
+ `(org-level-5 ((t (:foreground ,tertiary :weight bold))))
+ `(org-level-6 ((t (:foreground ,tertiary-container :weight bold))))
+ `(org-level-7 ((t (:foreground ,primary-fixed :weight bold))))
+ `(org-level-8 ((t (:foreground ,primary-fixed-dim :weight bold))))
+ `(org-document-title ((t (:foreground ,primary :weight bold :height 1.3))))
+ `(org-document-info ((t (:foreground ,primary-container))))
+ `(org-todo ((t (:foreground ,err :weight bold))))
+ `(org-done ((t (:foreground ,success :weight bold))))
+ `(org-headline-done ((t (:foreground ,on-surface-variant))))
+ `(org-hide ((t (:foreground ,bg)))) ;; Hide leading asterisks
+ `(org-ellipsis ((t (:foreground ,tertiary :underline nil)))) ;; Style for folded content indicator
+ `(org-table ((t (:foreground ,secondary-fixed :inherit fixed-pitch))))
+ `(org-formula ((t (:foreground ,tertiary :inherit fixed-pitch))))
+ `(org-checkbox ((t (:foreground ,primary :weight bold :inherit fixed-pitch))))
+ `(org-date ((t (:foreground ,secondary-fixed :underline t))))
+ `(org-special-keyword ((t (:foreground ,on-surface-variant :slant italic))))
+ `(org-tag ((t (:foreground ,outline-color :weight normal))))
+
+ ;; Magit
+ `(magit-section-highlight ((t (:background ,surface-container-low))))
+ `(magit-diff-hunk-heading ((t (:background ,surface-container :foreground ,on-surface-variant))))
+ `(magit-diff-hunk-heading-highlight ((t (:background ,surface-container-high :foreground ,on-surface))))
+ `(magit-diff-context ((t (:foreground ,on-surface-variant))))
+ `(magit-diff-context-highlight ((t (:background ,surface-container-low :foreground ,on-surface))))
+ `(magit-diff-added ((t (:background ,success-container :foreground ,on-success-container))))
+ `(magit-diff-added-highlight ((t (:background ,success-container :foreground ,on-success-container :weight bold))))
+ `(magit-diff-removed ((t (:background ,err-container :foreground ,on-err-container))))
+ `(magit-diff-removed-highlight ((t (:background ,err-container :foreground ,on-err-container :weight bold))))
+ `(magit-hash ((t (:foreground ,outline-color))))
+ `(magit-branch-local ((t (:foreground ,tertiary :weight bold))))
+ `(magit-branch-remote ((t (:foreground ,primary :weight bold))))
+
+ ;; Company
+ `(company-tooltip ((t (:background ,surface-container :foreground ,on-surface))))
+ `(company-tooltip-selection ((t (:background ,primary-container :foreground ,on-primary-container))))
+ `(company-tooltip-common ((t (:foreground ,primary))))
+ `(company-tooltip-common-selection ((t (:foreground ,on-primary-container :weight bold))))
+ `(company-tooltip-annotation ((t (:foreground ,tertiary))))
+ `(company-scrollbar-fg ((t (:background ,primary))))
+ `(company-scrollbar-bg ((t (:background ,surface-variant))))
+ `(company-preview ((t (:foreground ,on-surface-variant :slant italic))))
+ `(company-preview-common ((t (:foreground ,primary :slant italic))))
+
+ ;; Ido
+ `(ido-first-match ((t (:foreground ,primary :weight bold))))
+ `(ido-only-match ((t (:foreground ,tertiary :weight bold))))
+ `(ido-subdir ((t (:foreground ,secondary))))
+ `(ido-indicator ((t (:foreground ,err))))
+ `(ido-virtual ((t (:foreground ,outline-color))))
+
+ ;; Helm
+ `(helm-selection ((t (:background ,primary-container :foreground ,on-primary-container))))
+ `(helm-match ((t (:foreground ,primary :weight bold))))
+ `(helm-source-header ((t (:background ,surface-container-high :foreground ,primary :weight bold :height 1.1))))
+ `(helm-candidate-number ((t (:foreground ,tertiary :weight bold))))
+ `(helm-ff-directory ((t (:foreground ,primary :weight bold))))
+ `(helm-ff-file ((t (:foreground ,on-surface))))
+ `(helm-ff-executable ((t (:foreground ,tertiary))))
+
+ ;; corfu
+ `(corfu-default ((t (:background ,surface-container :foreground ,on-surface))))
+ `(corfu-current ((t (:background ,primary-container :foreground ,on-primary-container))))
+
+ ;; Which-key
+ `(which-key-key-face ((t (:foreground ,primary :weight bold))))
+ `(which-key-separator-face ((t (:foreground ,outline-variant))))
+ `(which-key-command-description-face ((t (:foreground ,on-surface))))
+ `(which-key-group-description-face ((t (:foreground ,secondary))))
+ `(which-key-special-key-face ((t (:foreground ,tertiary :weight bold))))
+
+ ;; Line numbers
+ `(line-number ((t (:foreground ,outline-variant :inherit fixed-pitch))))
+ `(line-number-current-line ((t (:foreground ,primary :weight bold :inherit fixed-pitch))))
+
+ ;; Parenthesis matching
+ `(sp-show-pair-match-face ((t (:background ,primary-container :foreground ,on-primary-container))))
+ `(sp-show-pair-mismatch-face ((t (:background ,err-container :foreground ,on-err-container))))
+
+ ;; Rainbow delimiters
+ `(rainbow-delimiters-depth-1-face ((t (:foreground ,primary))))
+ `(rainbow-delimiters-depth-2-face ((t (:foreground ,secondary))))
+ `(rainbow-delimiters-depth-3-face ((t (:foreground ,tertiary))))
+ `(rainbow-delimiters-depth-4-face ((t (:foreground ,primary-fixed))))
+ `(rainbow-delimiters-depth-5-face ((t (:foreground ,secondary-fixed))))
+ `(rainbow-delimiters-depth-6-face ((t (:foreground ,tertiary-fixed))))
+ `(rainbow-delimiters-depth-7-face ((t (:foreground ,primary-fixed-dim))))
+ `(rainbow-delimiters-depth-8-face ((t (:foreground ,secondary-fixed-dim))))
+ `(rainbow-delimiters-depth-9-face ((t (:foreground ,tertiary-fixed-dim))))
+ `(rainbow-delimiters-mismatched-face ((t (:foreground ,err :weight bold))))
+ `(rainbow-delimiters-unmatched-face ((t (:foreground ,err :weight bold))))
+
+ ;; Dired
+ `(dired-directory ((t (:foreground ,primary :weight bold))))
+ `(dired-ignored ((t (:foreground ,outline-variant))))
+ `(dired-flagged ((t (:foreground ,err))))
+ `(dired-marked ((t (:foreground ,tertiary :weight bold))))
+ `(dired-symlink ((t (:foreground ,secondary :slant italic))))
+ `(dired-header ((t (:foreground ,primary :weight bold :height 1.1))))
+
+ ;; Terminal colors
+ `(term-color-black ((t (:foreground ,term0 :background ,term0))))
+ `(term-color-red ((t (:foreground ,term1 :background ,term1))))
+ `(term-color-green ((t (:foreground ,term2 :background ,term2))))
+ `(term-color-yellow ((t (:foreground ,term3 :background ,term3))))
+ `(term-color-blue ((t (:foreground ,term4 :background ,term4))))
+ `(term-color-magenta ((t (:foreground ,term5 :background ,term5))))
+ `(term-color-cyan ((t (:foreground ,term6 :background ,term6))))
+ `(term-color-white ((t (:foreground ,term7 :background ,term7))))
+
+ ;; EShell
+ `(eshell-prompt ((t (:foreground ,primary :weight bold))))
+ `(eshell-ls-directory ((t (:foreground ,primary :weight bold))))
+ `(eshell-ls-symlink ((t (:foreground ,secondary :slant italic))))
+ `(eshell-ls-executable ((t (:foreground ,tertiary))))
+ `(eshell-ls-archive ((t (:foreground ,on-tertiary-container))))
+ `(eshell-ls-backup ((t (:foreground ,outline-variant))))
+ `(eshell-ls-clutter ((t (:foreground ,err))))
+ `(eshell-ls-missing ((t (:foreground ,err))))
+ `(eshell-ls-product ((t (:foreground ,on-surface-variant))))
+ `(eshell-ls-readonly ((t (:foreground ,on-surface-variant))))
+ `(eshell-ls-special ((t (:foreground ,secondary-fixed))))
+ `(eshell-ls-unreadable ((t (:foreground ,outline-variant))))
+
+ ;; Improved markdown mode
+ `(markdown-header-face ((t (:foreground ,primary :weight bold))))
+ `(markdown-header-face-1 ((t (:foreground ,primary :weight bold :height 1.2))))
+ `(markdown-header-face-2 ((t (:foreground ,primary-container :weight bold :height 1.1))))
+ `(markdown-header-face-3 ((t (:foreground ,secondary :weight bold))))
+ `(markdown-header-face-4 ((t (:foreground ,secondary-container :weight bold))))
+ `(markdown-inline-code-face ((t (:foreground ,tertiary-fixed :background ,surface-container-low :inherit fixed-pitch))))
+ `(markdown-code-face ((t (:background ,surface-container-low :extend t :inherit fixed-pitch))))
+ `(markdown-pre-face ((t (:background ,surface-container-low :inherit fixed-pitch))))
+ `(markdown-table-face ((t (:foreground ,secondary-fixed :inherit fixed-pitch))))
+
+ ;; Web mode
+ `(web-mode-html-tag-face ((t (:foreground ,primary))))
+ `(web-mode-html-tag-bracket-face ((t (:foreground ,on-surface-variant))))
+ `(web-mode-html-attr-name-face ((t (:foreground ,secondary))))
+ `(web-mode-html-attr-value-face ((t (:foreground ,tertiary))))
+ `(web-mode-css-selector-face ((t (:foreground ,primary))))
+ `(web-mode-css-property-name-face ((t (:foreground ,secondary))))
+ `(web-mode-css-string-face ((t (:foreground ,tertiary))))
+
+ ;; Flycheck
+ `(flycheck-error ((t (:underline (:style wave :color ,err)))))
+ `(flycheck-warning ((t (:underline (:style wave :color ,secondary)))))
+ `(flycheck-info ((t (:underline (:style wave :color ,tertiary)))))
+ `(flycheck-fringe-error ((t (:foreground ,err))))
+ `(flycheck-fringe-warning ((t (:foreground ,secondary))))
+ `(flycheck-fringe-info ((t (:foreground ,tertiary))))
+
+ ;; Mini-buffer customization
+ `(minibuffer-prompt ((t (:foreground ,primary :weight bold))))
+
+ ;; Improved search highlighting
+ `(lsp-face-highlight-textual ((t (:background ,primary-container :foreground ,on-primary-container :weight bold))))
+ `(lsp-face-highlight-read ((t (:background ,secondary-container :foreground ,on-secondary-container :weight bold))))
+ `(lsp-face-highlight-write ((t (:background ,tertiary-container :foreground ,on-tertiary-container :weight bold))))
+
+ ;; Info and help modes
+ `(info-title-1 ((t (:foreground ,primary :weight bold :height 1.3))))
+ `(info-title-2 ((t (:foreground ,primary-container :weight bold :height 1.2))))
+ `(info-title-3 ((t (:foreground ,secondary :weight bold :height 1.1))))
+ `(info-title-4 ((t (:foreground ,secondary-container :weight bold))))
+ `(Info-quoted ((t (:foreground ,tertiary))))
+ `(info-menu-header ((t (:foreground ,primary :weight bold))))
+ `(info-menu-star ((t (:foreground ,primary))))
+ `(info-node ((t (:foreground ,tertiary :weight bold))))
+
+ ;; Tabs
+ `(tab-bar ((t (:background ,surface-container-high :foreground ,on-surface :box nil))))
+ `(tab-bar-tab ((t (:background ,surface-container-high :foreground ,on-surface :weight bold :box nil))))
+ `(tab-bar-tab-inactive ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+
+ `(tab-line ((t (:background ,surface-container-high :foreground ,on-surface :box nil))))
+ `(tab-line-tab ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+ `(tab-line-tab-current ((t (:background ,surface-container-high :foreground ,on-surface :weight bold :box nil))))
+ `(tab-line-tab-inactive ((t (:background ,surface :foreground ,on-surface-variant :box nil))))
+ `(tab-line-highlight ((t (:background ,surface-container-highest :foreground ,on-surface))))
+
+ `(centaur-tabs-default ((t (:background ,surface-container-high :foreground ,on-surface))))
+ `(centaur-tabs-selected ((t (:background ,surface-container-high :foreground ,on-surface :weight bold))))
+ `(centaur-tabs-unselected ((t (:background ,surface :foreground ,on-surface-variant))))
+ `(centaur-tabs-selected-modified ((t (:background ,surface-container-high :foreground ,tertiary :weight bold))))
+ `(centaur-tabs-unselected-modified ((t (:background ,surface :foreground ,tertiary))))
+ `(centaur-tabs-active-bar-face ((t (:background ,primary))))
+
+ ;; Fixed-pitch faces
+ `(fixed-pitch ((t (:family "monospace"))))
+ `(fixed-pitch-serif ((t (:family "monospace serif"))))
+
+ ;; Variable-pitch face
+ `(variable-pitch ((t (:family "sans serif"))))
+ ))
+
+;; Add org-mode hooks for hiding leading stars
+(with-eval-after-load 'org
+ (setq org-hide-leading-stars t)
+ (setq org-startup-indented t))
+
+;;;###autoload
+(when load-file-name
+ (add-to-list 'custom-theme-load-path
+ (file-name-as-directory (file-name-directory load-file-name))))
+
+(provide-theme 'noctalia)
+;;; noctalia-theme.el ends here
+