From ebcd63abb46c407439050813d03dc310125920e1 Mon Sep 17 00:00:00 2001 From: cashmere Date: Sun, 8 Feb 2026 16:07:01 +0100 Subject: add new configs --- config.el | 595 +++++++++++++++++++++++++++++++++++++---- config.org | 674 +++++++++++++++++++++++++++++++++++++++++++---- init.el | 6 + org-clock-save.el | 1 + themes/noctalia-theme.el | 361 +++++++++++++++++++++++++ 5 files changed, 1526 insertions(+), 111 deletions(-) create mode 100644 org-clock-save.el create mode 100644 themes/noctalia-theme.el 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 (("" . 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 (("" . 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 + -- cgit v1.3.1