IC
This commit is contained in:
@@ -0,0 +1,394 @@
|
||||
;;; config.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; ============================================================
|
||||
;; Custom
|
||||
;; ============================================================
|
||||
(let ((custom-dir (expand-file-name "custom/" user-emacs-directory)))
|
||||
(when (file-directory-p custom-dir)
|
||||
(mapc #'load (directory-files custom-dir t "\\.el$"))))
|
||||
|
||||
(add-to-list 'custom-theme-load-path (expand-file-name "themes/" user-emacs-directory))
|
||||
|
||||
;; ============================================================
|
||||
;; Keybindings
|
||||
;; ============================================================
|
||||
(use-package general
|
||||
:config
|
||||
(general-def
|
||||
:keymaps 'global
|
||||
"C-S-c" #'my/system-copy
|
||||
"C-S-x" #'my/system-cut
|
||||
"C-S-v" #'my/system-paste
|
||||
"C-z" #'undo
|
||||
"C-S-z" #'undo-redo
|
||||
)
|
||||
|
||||
(general-def
|
||||
:keymaps 'override
|
||||
"C-k" #'avy-kill-whole-line
|
||||
"C-s C-f" #'avy-goto-char-timer
|
||||
"C-s C-s C-f" #'my/avy-char-region
|
||||
"C-s C-S-s" #'my/avy-line-region
|
||||
"C-s C-l" #'consult-line
|
||||
"C-s C-e" #'er/expand-region
|
||||
"C-x C-b" #'buffer-table
|
||||
"M-g g" #'avy-goto-line
|
||||
"C-r" #'recenter-top-bottom
|
||||
"C-s w" #'my/vterm-sync-here
|
||||
"C-b" #'scroll-down-command
|
||||
"C-<backspace>" #'my/delete-word-backward)
|
||||
|
||||
(general-define-key
|
||||
:keymaps 'global
|
||||
"C-w" nil)
|
||||
;; If you want certain keys to ONLY work in Meow Normal state, use :states.
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; Settings, UI
|
||||
;; ============================================================
|
||||
(setq kill-ring-max 1
|
||||
select-enable-clipboard nil
|
||||
select-enable-primary nil
|
||||
save-interprogram-paste-before-kill nil
|
||||
xterm-extra-capabilities '(getSelection setSelection modifyOtherKeys)
|
||||
mouse-drag-copy-region nil
|
||||
truncate-lines nil
|
||||
|
||||
display-line-numbers-type t
|
||||
cursor-type 'bar
|
||||
savehist-additional-variables '(kill-ring search-ring)
|
||||
recentf-max-saved-items 75
|
||||
)
|
||||
|
||||
;; Modes
|
||||
(global-hl-line-mode t )
|
||||
(global-display-line-numbers-mode 1)
|
||||
(hl-line-mode 1)
|
||||
(savehist-mode 1)
|
||||
(global-clipetty-mode)
|
||||
|
||||
;; Fonts
|
||||
(set-face-attribute 'default nil :family "Fira Code" :height 120)
|
||||
(set-face-attribute 'variable-pitch nil :family "Noto Sans" :height 140)
|
||||
|
||||
;; Apply variable pitch to specific modes
|
||||
(dolist (hook '(markdown-mode-hook org-mode-hook json-mode-hook))
|
||||
(add-hook hook (lambda () (buffer-face-set '(:family "Noto Sans" :height 140)))))
|
||||
|
||||
(add-to-list 'auto-mode-alist '("\\.qd$" . markdown-mode))
|
||||
(add-to-list 'term-file-aliases '("xterm-256" . "xterm"))
|
||||
|
||||
;; Recentf cleanup
|
||||
(with-eval-after-load 'recentf
|
||||
(run-at-time nil 600 #'recentf-cleanup)
|
||||
(setq recentf-exclude '(".*/$"))) ;; don't include dirs
|
||||
|
||||
;; ============================================================
|
||||
;; packages
|
||||
;; ============================================================
|
||||
|
||||
(use-package emacs
|
||||
:ensure nil
|
||||
:custom
|
||||
(tab-always-indent 'complete)
|
||||
(TEXT-mode-ispell-word-completion nil)
|
||||
(read-extended-command-predicate #'command-completion-default-include-p)
|
||||
)
|
||||
|
||||
(use-package corfu
|
||||
:init
|
||||
(global-corfu-mode)
|
||||
(corfu-popupinfo-mode)
|
||||
:custom
|
||||
(corfu-auto t)
|
||||
(corfu-auto-delay 0.2)
|
||||
(corfu-auto-prefix 2)
|
||||
(corfu-popupinfo-delay '(0.5 . 0.3)))
|
||||
|
||||
(use-package vertico
|
||||
:config
|
||||
:init
|
||||
(vertico-mode))
|
||||
|
||||
(use-package mason
|
||||
:config
|
||||
:init
|
||||
(mason-ensure))
|
||||
|
||||
(use-package marginalia
|
||||
:config
|
||||
:init
|
||||
(marginalia-mode))
|
||||
|
||||
(use-package orderless
|
||||
:custom
|
||||
(completion-styles '(orderless basic))
|
||||
(completion-category-overrides '((file (styles partial-completion))))
|
||||
(completion-pcm-leading-wildcard t)) ;; Emacs 31: partial-completion behaves like substring
|
||||
|
||||
|
||||
(use-package meow
|
||||
:init (setq meow--kbd-kill-region "C-S-x")
|
||||
:config
|
||||
(setq meow-use-clipboard nil)
|
||||
(meow-setup)
|
||||
(meow-global-mode 1)
|
||||
(setq meow-use-clipboard t))
|
||||
|
||||
(use-package avy
|
||||
:config
|
||||
(setq avy-timeout-seconds 0.25
|
||||
avy-style 'at-full
|
||||
avy-keys (number-sequence ?a ?z)))
|
||||
|
||||
(use-package treesit-auto
|
||||
:custom
|
||||
(treesit-auto-install 'prompt)
|
||||
:config
|
||||
(treesit-auto-add-to-auto-mode-alist 'all)
|
||||
(global-treesit-auto-mode)
|
||||
)
|
||||
|
||||
(use-package treesit-fold
|
||||
:commands (treesit-fold-close
|
||||
treesit-fold-close-all
|
||||
treesit-fold-open
|
||||
treesit-fold-toggle
|
||||
treesit-fold-open-all
|
||||
treesit-fold-mode
|
||||
global-treesit-fold-mode
|
||||
treesit-fold-open-recursively
|
||||
treesit-fold-line-comment-mode)
|
||||
|
||||
:custom
|
||||
(treesit-fold-line-count-show t)
|
||||
(treesit-fold-line-count-format " ▼")
|
||||
|
||||
:config
|
||||
(set-face-attribute 'treesit-fold-replacement-face nil
|
||||
:foreground "#808080"
|
||||
:box nil
|
||||
:weight 'bold))
|
||||
|
||||
;; Systems and General Purpose
|
||||
(add-hook 'c-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'c++-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'java-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'rust-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'go-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'ruby-ts-mode-hook #'treesit-fold-mode)
|
||||
|
||||
;; Web and Frontend
|
||||
(add-hook 'js-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'typescript-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'tsx-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'css-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'html-ts-mode-hook #'treesit-fold-mode)
|
||||
|
||||
;; Scripting and Infrastructure
|
||||
(add-hook 'bash-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'cmake-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'dockerfile-ts-mode-hook #'treesit-fold-mode)
|
||||
|
||||
;; Data and Configuration
|
||||
(add-hook 'json-ts-mode-hook #'treesit-fold-mode)
|
||||
(add-hook 'toml-ts-mode-hook #'treesit-fold-mode)
|
||||
|
||||
(add-hook 'emacs-lisp-mode-hook #'outline-minor-mode)
|
||||
(add-hook 'lisp-interaction-mode-hook #'hs-minor-mode) ; scratch
|
||||
(add-hook 'lisp-mode-hook #'outline-minor-mode)
|
||||
(add-hook 'conf-mode-hook #'outline-minor-mode)
|
||||
(add-hook 'markdown-mode-hook #'outline-minor-mode)
|
||||
(add-hook 'diff-mode-hook #'outline-minor-mode)
|
||||
|
||||
(use-package highlight-quoted
|
||||
:hook (emacs-lisp-mode . highlight-quoted-mode))
|
||||
|
||||
(use-package highlight-defined
|
||||
:hook (emacs-lisp-mode . highlight-defined-mode))
|
||||
|
||||
(use-package color-identifiers-mode
|
||||
:hook (emacs-lisp-mode . color-identifiers-mode))
|
||||
|
||||
(use-package rainbow-delimiters
|
||||
:hook
|
||||
(prog-mode . rainbow-delimiters-mode)
|
||||
(inferior-ess-mode . rainbow-delimiters-mode))
|
||||
|
||||
(use-package nerd-icons-completion
|
||||
:after marginalia
|
||||
:config
|
||||
(nerd-icons-completion-mode)
|
||||
(add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup))
|
||||
|
||||
(use-package nerd-icons-corfu)
|
||||
|
||||
(use-package nerd-icons-dired
|
||||
:hook
|
||||
(dired-mode . nerd-icons-dired-mode))
|
||||
|
||||
(use-package smartparens
|
||||
:init (smartparens-global-mode 1)
|
||||
:config
|
||||
(sp-pair "\"" "\"" :wrap "C-c \"")
|
||||
(sp-pair "'" "'" :wrap "C-c '")
|
||||
(sp-pair "<<" ">>" :wrap "C-c <"))
|
||||
|
||||
(use-package indent-bars
|
||||
:config
|
||||
(setq indent-bars-prefer-character ?.
|
||||
indent-bars-pattern "true"
|
||||
indent-bars-width-frac 1
|
||||
indent-bars-pad-frac 0.2
|
||||
indent-bars-color-by-depth '(:regexp "outline-\\([0-9]+\\)" :blend 0.9)
|
||||
indent-bars-highlight-current-depth '(:face default :blend 0.4)
|
||||
)
|
||||
:init
|
||||
(add-hook 'prog-mode-hook #'indent-bars-mode))
|
||||
|
||||
(use-package kirigami
|
||||
:commands (kirigami-open-fold kirigami-open-fold-rec kirigami-close-fold
|
||||
kirigami-toggle-fold kirigami-open-folds
|
||||
kirigami-close-folds-except-current
|
||||
kirigami-close-folds))
|
||||
|
||||
(use-package clipetty
|
||||
:hook (after-init . global-clipetty-mode))
|
||||
|
||||
(use-package denote
|
||||
:config
|
||||
(setq denote-directory (list (expand-file-name "~/lyfi/SOR/Notes/"))
|
||||
denote-file-type 'markdown-yaml
|
||||
denote-prompts '(title subdirectory keywords)))
|
||||
|
||||
(use-package colorful-mode
|
||||
:init (setq colorful-allow-mouse-clicks nil))
|
||||
|
||||
;; Tree-sitter & LSP tweaks
|
||||
(with-eval-after-load 'treesit
|
||||
(setq treesit-font-lock-level 4))
|
||||
|
||||
(with-eval-after-load 'typescript-ts-mode
|
||||
(setq typescript-ts-mode-indent-offset 2)
|
||||
(defvaralias 'typescript-indent-level 'typescript-ts-mode-indent-offset))
|
||||
|
||||
(with-eval-after-load 'lsp-mode
|
||||
(setq lsp-completion-provider :none))
|
||||
|
||||
;; ============================================================
|
||||
;; Functions
|
||||
;; ============================================================
|
||||
|
||||
(defun my/system-copy (beg end)
|
||||
"Copy region directly to system clipboard, bypassing Emacs' kill ring.
|
||||
Uses wl-copy on Wayland GUI, and Clipetty (OSC 52) in TUI/SSH."
|
||||
(interactive "r")
|
||||
(unless (region-active-p)
|
||||
(user-error "No active region to copy"))
|
||||
(let ((text (buffer-substring-no-properties beg end)))
|
||||
(if (display-graphic-p)
|
||||
;; GUI: Pipe text directly to Wayland clipboard
|
||||
(let ((process-connection-type nil))
|
||||
(let ((proc (start-process "wl-copy" nil "wl-copy")))
|
||||
(process-send-string proc text)
|
||||
(process-send-eof proc)))
|
||||
;; TUI/SSH: Use clipetty to send OSC 52 sequence to kitty
|
||||
(if (fboundp 'clipetty-set-selection)
|
||||
(clipetty-set-selection text)
|
||||
(error "Clipetty not loaded. Ensure (global-clipetty-mode) is active")))
|
||||
(deactivate-mark)
|
||||
(message "Copied to system clipboard")))
|
||||
|
||||
(defun my/system-cut (beg end)
|
||||
"Cut region directly to system clipboard, bypassing the kill ring."
|
||||
(interactive "r")
|
||||
(my/system-copy beg end)
|
||||
;; delete-region deletes without adding to the kill ring
|
||||
(delete-region beg end))
|
||||
|
||||
(defun my/system-paste ()
|
||||
"Paste from system clipboard directly to point, bypassing the kill ring."
|
||||
(interactive)
|
||||
(if (display-graphic-p)
|
||||
;; GUI: Read directly from Wayland clipboard and insert
|
||||
(let ((text (shell-command-to-string "wl-paste -n")))
|
||||
(insert text))
|
||||
;; TUI/SSH: Warn the user to use the terminal's native paste
|
||||
(message "In a terminal, use your terminal emulator's native paste shortcut (e.g., Ctrl-Shift-V).")))
|
||||
|
||||
|
||||
(defun dired-follow-symlink ()
|
||||
"In dired, visit the file or directory at point by its true physical path."
|
||||
(interactive)
|
||||
(let ((filename (dired-get-file-for-visit)))
|
||||
(if filename
|
||||
(find-file (file-truename filename))
|
||||
(message "No file at point"))))
|
||||
|
||||
(defun my/vterm-sync-here ()
|
||||
"Switch to vterm and instantly 'cd' to the current buffer's directory."
|
||||
(interactive)
|
||||
(let ((cwd default-directory))
|
||||
(vterm-toggle)
|
||||
(vterm-send-string (format "cd %s" (shell-quote-argument cwd)))
|
||||
(vterm-send-return)))
|
||||
|
||||
(defun my/delete-word-backward ()
|
||||
"Delete the word and any preceding whitespace without affecting the kill ring."
|
||||
(interactive)
|
||||
(let ((start (point)))
|
||||
(skip-chars-backward "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
||||
(skip-chars-backward " \t")
|
||||
(delete-region (point) start)))
|
||||
|
||||
(defun my-modern-delete-word-backward ()
|
||||
"Delete a block of similar characters backward without using the kill ring.
|
||||
Similar characters are grouped as:
|
||||
1. Whitespace (including newlines)
|
||||
2. Alphanumerics
|
||||
3. Special characters/symbols"
|
||||
(interactive)
|
||||
(let ((end (point))
|
||||
(start (1- (point))))
|
||||
(when (>= start 1)
|
||||
(let* ((first-char (char-before end))
|
||||
(first-type (my-get-char-type first-char)))
|
||||
;; Move start point backward as long as the character type matches
|
||||
(while (and (>= start 1)
|
||||
(string= first-type (my-get-char-type (char-before start))))
|
||||
(setq start (1- start)))
|
||||
;; Delete the range without adding to the kill ring
|
||||
(delete-region start end)))))
|
||||
|
||||
(defun my-get-char-type (char)
|
||||
"Helper to categorize characters into three groups."
|
||||
(let ((cat (char-category char)))
|
||||
(cond
|
||||
((member cat '("space" "newline")) "whitespace")
|
||||
((member cat '("letter" "number")) "alphanum")
|
||||
(t "special"))))
|
||||
|
||||
;; Bind it to Ctrl-Backspace
|
||||
;; Note: In many terminals, C-Backspace is sent as C-h or C-Delete.
|
||||
;; This binding works in GUI Emacs.
|
||||
(global-set-key (kbd "C-<backspace>") 'my-modern-delete-word-backward)
|
||||
|
||||
|
||||
;; ============================================================
|
||||
;; Theming, ui
|
||||
;; ============================================================
|
||||
;;
|
||||
|
||||
(my/apply-theme (selected-frame))
|
||||
;; Apply to all future frames (important for emacsclient users)
|
||||
(add-hook 'after-make-frame-functions 'my/apply-theme)
|
||||
;;fonts
|
||||
(setq doom-font "Fira Code 12")
|
||||
(setq doom-variable-pitch-font "Noto Sans 14")
|
||||
(setq nerd-icons-font-family "Symbols Nerd Font Mono")
|
||||
(defun my-set-buffer-font ()
|
||||
"Set a specific font for the current buffer only."
|
||||
(buffer-face-set '(:family "Noto Sans" :height 140)))
|
||||
|
||||
(add-hook 'after-make-frame-functions #'my/apply-theme)
|
||||
@@ -0,0 +1,29 @@
|
||||
;;; ../../lyfi/configs/apps/doom/custom/avy-region.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defun my/avy-region (jump-fn &optional inclusive)
|
||||
"Select region between two points chosen with JUMP-FN.
|
||||
JUMP-FN is a command like `avy-goto-char-timer' or `avy-goto-line'.
|
||||
When INCLUSIVE is non-nil, include the character at the end point."
|
||||
(interactive)
|
||||
(let (p1 p2)
|
||||
(cl-labels ((do-jump () (call-interactively jump-fn) (point)))
|
||||
(setq p1 (do-jump))
|
||||
(setq p2 (do-jump)))
|
||||
(when (and p1 p2)
|
||||
(let ((beg (min p1 p2))
|
||||
(end (max p1 p2)))
|
||||
(push-mark beg nil t)
|
||||
(goto-char end)
|
||||
(when inclusive
|
||||
(unless (eobp) (forward-char 1)))))))
|
||||
|
||||
(defun my/avy-char-region ()
|
||||
"mark region between 2 chars using avy-char"
|
||||
(interactive)
|
||||
(my/avy-region 'avy-goto-char-timer t))
|
||||
|
||||
(defun my/avy-line-region ()
|
||||
"mark region between 2 lines using avy-line"
|
||||
(interactive)
|
||||
(my/avy-region 'avy-goto-line)
|
||||
(forward-line 1))
|
||||
@@ -0,0 +1,199 @@
|
||||
;;; buffer-table.el --- Tabular view of buffers and recent files -*- lexical-binding: t; -*-
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'recentf)
|
||||
|
||||
(defgroup buffer-table nil
|
||||
"Tabular view of buffers and recent files."
|
||||
:group 'convenience)
|
||||
|
||||
;; Faces for distinction
|
||||
(defface buffer-table-open '((t :inherit font-lock-keyword-face :bold t)) "Face for open files.")
|
||||
(defface buffer-table-recent '((t :inherit shadow)) "Face for recent closed files.")
|
||||
(defface buffer-table-special '((t :inherit font-lock-comment-face)) "Face for internal buffers.")
|
||||
(defface buffer-table-modified '((t :inherit error :bold t)) "Face for modified flag.")
|
||||
(defface buffer-table-marked '((t :inherit warning :bold t)) "Face for marked entries.")
|
||||
|
||||
;; Mark tracking - set of entry IDs currently marked
|
||||
(defvar buffer-table--marked nil
|
||||
"Set of marked entry IDs (buffer objects or file paths).")
|
||||
|
||||
(defun buffer-table--get-entries ()
|
||||
"Collect all items and format them for tabulated-list-entries."
|
||||
(let ((file-entries nil)
|
||||
(recent-entries nil)
|
||||
(special-entries nil)
|
||||
(processed-files (make-hash-table :test 'equal)))
|
||||
|
||||
;; 1. Open File-visiting Buffers
|
||||
(dolist (buf (buffer-list))
|
||||
(let ((file (buffer-file-name buf)))
|
||||
(when (and file (not (string-prefix-p " " (buffer-name buf))))
|
||||
(puthash file t processed-files)
|
||||
(push (list buf
|
||||
(vector
|
||||
(if (buffer-modified-p buf) (propertize "*" 'face 'buffer-table-modified) " ")
|
||||
(propertize "File" 'face 'buffer-table-open)
|
||||
(propertize (buffer-name buf) 'face 'buffer-table-open)
|
||||
(abbreviate-file-name (file-name-directory file))
|
||||
(if (gethash buf buffer-table--marked)
|
||||
(propertize "☑" 'face 'buffer-table-marked)
|
||||
"☐")))
|
||||
file-entries))))
|
||||
|
||||
;; 2. Recent Files (Closed)
|
||||
(recentf-mode 1)
|
||||
(dolist (file recentf-list)
|
||||
(unless (gethash file processed-files)
|
||||
(push (list file
|
||||
(vector
|
||||
" "
|
||||
(propertize "Recent" 'face 'buffer-table-recent)
|
||||
(propertize (file-name-nondirectory file) 'face 'buffer-table-recent)
|
||||
(abbreviate-file-name (file-name-directory file))
|
||||
(if (gethash file buffer-table--marked)
|
||||
(propertize "☑" 'face 'buffer-table-marked)
|
||||
"☐")))
|
||||
recent-entries)))
|
||||
|
||||
;; 3. Special Buffers
|
||||
(dolist (buf (buffer-list))
|
||||
(unless (or (buffer-file-name buf) (string-prefix-p " " (buffer-name buf)))
|
||||
(push (list buf
|
||||
(vector
|
||||
(if (buffer-modified-p buf) (propertize "*" 'face 'buffer-table-modified) " ")
|
||||
(propertize "Special" 'face 'buffer-table-special)
|
||||
(propertize (buffer-name buf) 'face 'buffer-table-special)
|
||||
""
|
||||
(if (gethash buf buffer-table--marked)
|
||||
(propertize "☑" 'face 'buffer-table-marked)
|
||||
"☐")))
|
||||
special-entries)))
|
||||
|
||||
;; Return in requested order: Special, then File, then Recent
|
||||
(append (nreverse special-entries)
|
||||
(nreverse file-entries)
|
||||
(nreverse recent-entries))))
|
||||
|
||||
(defun buffer-table--refresh ()
|
||||
"Refresh the list."
|
||||
(setq tabulated-list-entries (buffer-table--get-entries))
|
||||
(tabulated-list-print t))
|
||||
|
||||
(defun buffer-table-mark ()
|
||||
"Mark the entry at point."
|
||||
(interactive)
|
||||
(let ((id (tabulated-list-get-id)))
|
||||
(when id
|
||||
(puthash id t buffer-table--marked)
|
||||
(buffer-table--refresh))))
|
||||
|
||||
(defun buffer-table-unmark ()
|
||||
"Unmark the entry at point."
|
||||
(interactive)
|
||||
(let ((id (tabulated-list-get-id)))
|
||||
(when id
|
||||
(remhash id buffer-table--marked)
|
||||
(buffer-table--refresh))))
|
||||
|
||||
(defun buffer-table-mark-all ()
|
||||
"Mark all entries."
|
||||
(interactive)
|
||||
(dolist (entry tabulated-list-entries)
|
||||
(puthash (car entry) t buffer-table--marked))
|
||||
(buffer-table--refresh))
|
||||
|
||||
(defun buffer-table-unmark-all ()
|
||||
"Unmark all entries."
|
||||
(interactive)
|
||||
(setq buffer-table--marked (make-hash-table))
|
||||
(buffer-table--refresh))
|
||||
|
||||
(defun buffer-table-kill-marked ()
|
||||
"Kill all marked buffers. For recent files, remove from recentf list."
|
||||
(interactive)
|
||||
(unless (hash-table-p buffer-table--marked)
|
||||
(user-error "No entries marked"))
|
||||
(when (or (null (buffer-table--marked-count))
|
||||
(zerop (buffer-table--marked-count)))
|
||||
(user-error "No entries marked"))
|
||||
|
||||
(let ((buffers-to-kill nil)
|
||||
(recent-to-remove nil))
|
||||
(maphash (lambda (id _)
|
||||
(if (bufferp id)
|
||||
(push id buffers-to-kill)
|
||||
(push id recent-to-remove)))
|
||||
buffer-table--marked)
|
||||
|
||||
;; Kill buffers
|
||||
(when buffers-to-kill
|
||||
(let ((count (length buffers-to-kill)))
|
||||
(dolist (buf buffers-to-kill)
|
||||
(when (buffer-live-p buf)
|
||||
(kill-buffer buf)))
|
||||
(message "Killed %d buffer%s" count (if (> count 1) "s" ""))))
|
||||
|
||||
;; Remove from recentf
|
||||
(when recent-to-remove
|
||||
(let ((count (length recent-to-remove)))
|
||||
(dolist (file recent-to-remove)
|
||||
(setq recentf-list (delq file recentf-list)))
|
||||
(recentf-save-list)
|
||||
(message "Removed %d file%s from recentf" count (if (> count 1) "s" ""))))
|
||||
|
||||
(setq buffer-table--marked (make-hash-table))
|
||||
(buffer-table--refresh)))
|
||||
|
||||
(defun buffer-table--marked-count ()
|
||||
"Return the number of marked entries."
|
||||
(hash-table-count buffer-table--marked))
|
||||
|
||||
(defun buffer-table-visit ()
|
||||
"Visit the buffer or file at point."
|
||||
(interactive)
|
||||
(let ((id (tabulated-list-get-id)))
|
||||
(cond
|
||||
((bufferp id) (switch-to-buffer id))
|
||||
((stringp id) (find-file id))
|
||||
(t (user-error "Nothing to visit here")))))
|
||||
|
||||
(defun buffer-table-revert ()
|
||||
"Revert the table, clearing marks."
|
||||
(interactive)
|
||||
(setq buffer-table--marked (make-hash-table))
|
||||
(buffer-table--refresh))
|
||||
|
||||
(define-derived-mode buffer-table-mode tabulated-list-mode "Buffer-Table"
|
||||
"Major mode for a unified buffer and file list."
|
||||
(setq buffer-table--marked (make-hash-table))
|
||||
(setq tabulated-list-format
|
||||
[("S" 1 t) ; Status (Modified)
|
||||
("Type" 8 t) ; File, Recent, or Special
|
||||
("Name" 35 t) ; File/Buffer name
|
||||
("Path" 0 t) ; Directory path (flexible width)
|
||||
("M" 3 t)]) ; Mark column
|
||||
(setq tabulated-list-padding 2)
|
||||
(setq tabulated-list-sort-key '("Type" . nil))
|
||||
(add-hook 'tabulated-list-revert-hook #'buffer-table--refresh nil t)
|
||||
(tabulated-list-init-header))
|
||||
|
||||
(define-key buffer-table-mode-map (kbd "RET") #'buffer-table-visit)
|
||||
(define-key buffer-table-mode-map (kbd "g") #'buffer-table-revert)
|
||||
(define-key buffer-table-mode-map (kbd "m") #'buffer-table-mark)
|
||||
(define-key buffer-table-mode-map (kbd "M") #'buffer-table-mark-all)
|
||||
(define-key buffer-table-mode-map (kbd "u") #'buffer-table-unmark-all)
|
||||
(define-key buffer-table-mode-map (kbd "U") #'buffer-table-unmark)
|
||||
(define-key buffer-table-mode-map (kbd "D") #'buffer-table-kill-marked)
|
||||
|
||||
;;;###autoload
|
||||
(defun buffer-table ()
|
||||
"Display the unified buffer and file table."
|
||||
(interactive)
|
||||
(let ((buf (get-buffer-create "*Buffer Table*")))
|
||||
(with-current-buffer buf
|
||||
(buffer-table-mode)
|
||||
(buffer-table--refresh))
|
||||
(switch-to-buffer buf)))
|
||||
|
||||
(provide 'buffer-table)
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
;;; ../../lyfi/configs/apps/doom/custom/meow.el -*- lexical-binding: t; -*-
|
||||
;;Custom Meow Cheatsheet Renderer
|
||||
|
||||
(defvar my-meow-board-grid
|
||||
'(("1" "2" "3" "4" "5" "6" "7" "8" "9" "0")
|
||||
("q" "w" "e" "r" "t" "y" "u" "i" "o" "p")
|
||||
("a" "s" "d" "f" "g" "h" "j" "k" "l" ";")
|
||||
("z" "x" "c" "v" "b" "n" "m" "," "." "/" "'"))
|
||||
"The physical layout of the board as a 2D array.")
|
||||
|
||||
(defun my-meow-get-cmd-name (key)
|
||||
"Helper to get the short name of a command for a given key, or a placeholder."
|
||||
(let ((cmd (key-binding key)))
|
||||
(if cmd
|
||||
(meow--short-command-name cmd)
|
||||
(if (member key '("TAB" "SFT" "CTL" "CAPS" "GUI" "ALT" "MO1" "SPC" "ENT" "BKSL" "LMB" "RMB" "UP" "DN" "N2"))
|
||||
key
|
||||
"<not bound>"))))
|
||||
|
||||
(defun my-meow-render-grid ()
|
||||
"Generates a clean table of Meow commands with base and shift layers."
|
||||
(let ((output ""))
|
||||
(dolist (row my-meow-board-grid)
|
||||
(let ((row-lower "")
|
||||
(row-upper ""))
|
||||
(dolist (key row)
|
||||
(let* ((low-name (my-meow-get-cmd-name key))
|
||||
(up-key (upcase key))
|
||||
(up-name (my-meow-get-cmd-name up-key)))
|
||||
;; Build the lower layer string
|
||||
(setq row-lower (concat row-lower
|
||||
(format "[%s = %-12s] " key low-name)))
|
||||
;; Build the upper layer string
|
||||
(setq row-upper (concat row-upper
|
||||
(format "[%s = %-12s] " up-key up-name)))))
|
||||
;; Append both layers, then a newline for a gap between physical rows
|
||||
(setq output (concat output row-lower "\n" row-upper "\n\n"))))
|
||||
output))
|
||||
|
||||
(defun my-meow-cheatsheet ()
|
||||
"Custom cheatsheet that uses a grid instead of fragile ASCII art."
|
||||
(interactive)
|
||||
(let ((buf (get-buffer-create "*Meow Cheatsheet*")))
|
||||
(with-current-buffer buf
|
||||
(text-mode)
|
||||
(setq buffer-read-only nil)
|
||||
(erase-buffer)
|
||||
(insert "Meow Custom Layout Cheatsheet\n")
|
||||
(insert "====================================================================================================\n\n")
|
||||
(insert (my-meow-render-grid))
|
||||
(insert "\n====================================================================================================\n")
|
||||
(insert meow--cheatsheet-note)
|
||||
(insert (meow--render-cheatsheet-thing-table))
|
||||
(add-face-text-property (point-min) (point-max) 'meow-cheatsheet-command)
|
||||
(setq buffer-read-only t))
|
||||
(switch-to-buffer buf)))
|
||||
|
||||
(defun meow-setup ()
|
||||
;; We no longer need the physical-layout strings because we use my-meow-board-grid
|
||||
(meow-motion-overwrite-define-key
|
||||
'("j" . meow-next)
|
||||
'("k" . meow-prev)
|
||||
'("<escape>" . mode-line-other-buffer))
|
||||
|
||||
(meow-leader-define-key
|
||||
'("/" . meow-keypad-describe-key)
|
||||
'("?" . my-meow-cheatsheet)) ;; Use our new custom renderer here
|
||||
|
||||
(meow-normal-define-key
|
||||
'("0" . meow-expand-0)
|
||||
'("9" . meow-expand-9)
|
||||
'("8" . meow-expand-8)
|
||||
'("7" . meow-expand-7)
|
||||
'("6" . meow-expand-6)
|
||||
'("5" . meow-expand-5)
|
||||
'("4" . meow-expand-4)
|
||||
'("3" . meow-expand-3)
|
||||
'("2" . meow-expand-2)
|
||||
'("1" . meow-expand-1)
|
||||
'("-" . negative-argument)
|
||||
'(";" . meow-reverse)
|
||||
'("," . meow-inner-of-thing)
|
||||
'("." . meow-bounds-of-thing)
|
||||
'("[" . meow-beginning-of-thing)
|
||||
'("]" . meow-end-of-thing)
|
||||
'("a" . meow-append)
|
||||
'("A" . meow-open-below)
|
||||
'("b" . meow-back-word)
|
||||
'("B" . meow-back-symbol)
|
||||
'("c" . meow-change)
|
||||
'("d" . meow-delete)
|
||||
'("D" . meow-backward-delete)
|
||||
'("e" . meow-next-word)
|
||||
'("E" . meow-next-symbol)
|
||||
'("f" . meow-find)
|
||||
'("g" . meow-cancel-selection)
|
||||
'("G" . meow-grab)
|
||||
'("h" . meow-left)
|
||||
'("H" . meow-left-expand)
|
||||
'("i" . meow-insert)
|
||||
'("I" . meow-open-above)
|
||||
'("j" . meow-next)
|
||||
'("J" . meow-next-expand)
|
||||
'("k" . meow-prev)
|
||||
'("K" . meow-prev-expand)
|
||||
'("l" . meow-right)
|
||||
'("L" . meow-right-expand)
|
||||
'("m" . meow-join)
|
||||
'("n" . meow-search)
|
||||
'("o" . meow-block)
|
||||
'("O" . meow-to-block)
|
||||
'("p" . meow-yank)
|
||||
'("q" . meow-quit)
|
||||
'("Q" . meow-goto-line)
|
||||
'("r" . meow-replace)
|
||||
'("R" . meow-swap-grab)
|
||||
'("s" . meow-kill)
|
||||
'("t" . meow-till)
|
||||
'("u" . meow-undo)
|
||||
'("U" . meow-undo-in-selection)
|
||||
'("v" . meow-visit)
|
||||
'("w" . meow-mark-word)
|
||||
'("W" . meow-mark-symbol)
|
||||
'("x" . meow-line)
|
||||
'("X" . meow-goto-line)
|
||||
'("y" . meow-save)
|
||||
'("Y" . meow-sync-grab)
|
||||
'("z" . meow-pop-selection)
|
||||
'("'" . repeat)))
|
||||
@@ -0,0 +1,13 @@
|
||||
;;; ../../lyfi/configs/apps/doom/custom/ui.el -*- lexical-binding: t; -*-
|
||||
|
||||
|
||||
(defun my/apply-theme (frame)
|
||||
"Apply a specific theme based on whether the FRAME is graphic or TUI."
|
||||
(select-frame frame)
|
||||
(if (display-graphic-p frame)
|
||||
(progn
|
||||
(mapc #'disable-theme custom-enabled-themes)
|
||||
(load-theme 'cutarv32 t)) ;; Your GUI theme
|
||||
(progn
|
||||
(mapc #'disable-theme custom-enabled-themes)
|
||||
(load-theme 'cutarv32_dark t)))) ;; Your TUI theme
|
||||
@@ -0,0 +1,28 @@
|
||||
;;; ../../lyfi/configs/apps/doom/custom/unifiedlist.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defun my/get-unified-list ()
|
||||
"Combine buffers and recentf into a list for tabulated-list-mode."
|
||||
(let ((items '()))
|
||||
;; Add Live Buffers
|
||||
(dolist (buf (buffer-list))
|
||||
(with-current-buffer buf
|
||||
(push (list buf (vector (buffer-name) "Live" (format-mode-line mode-name) (or (buffer-file-name) ""))) items)))
|
||||
;; Add Recent Files (if not already open)
|
||||
(dolist (file recentf-list)
|
||||
(unless (get-file-buffer file)
|
||||
(push (list file (vector (file-name-nondirectory file) "Recent" "File" file)) items)))
|
||||
(nreverse items)))
|
||||
|
||||
(define-derived-mode my-unified-list-mode tabulated-list-mode "Unified-List"
|
||||
(setq tabulated-list-format [("Name" 30 t)
|
||||
("Status" 10 t)
|
||||
("Mode" 15 t)
|
||||
("Path" 0 t)])
|
||||
(setq tabulated-list-entries #'my/get-unified-list)
|
||||
(tabulated-list-init-header))
|
||||
|
||||
(defun my/open-unified-list ()
|
||||
(interactive)
|
||||
(pop-to-buffer "*Unified Switcher*")
|
||||
(my-unified-list-mode)
|
||||
(tabulated-list-print))
|
||||
@@ -0,0 +1,20 @@
|
||||
;;; early-init.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; Prevent package.el from loading at startup (elpaca handles it)
|
||||
(setq package-enable-at-startup nil)
|
||||
|
||||
;; Disable UI elements early for faster frame rendering
|
||||
(setq inhibit-startup-screen t
|
||||
inhibit-startup-echo-area-message user-login-name
|
||||
initial-scratch-message nil
|
||||
initial-major-mode 'fundamental-mode
|
||||
frame-inhibit-implied-resize t
|
||||
garbage-collection-messages t)
|
||||
|
||||
;; Temporarily raise GC threshold during startup
|
||||
(setq gc-cons-threshold most-positive-fixnum
|
||||
gc-cons-percentage 0.6)
|
||||
|
||||
;; Disable UI chrome
|
||||
(dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
|
||||
(when (fboundp mode) (funcall mode -1)))
|
||||
@@ -0,0 +1,148 @@
|
||||
;;; init.el -*- lexical-binding: t; -*-
|
||||
;;elpaca
|
||||
(defvar elpaca-installer-version 0.12)
|
||||
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
|
||||
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
|
||||
(defvar elpaca-sources-directory (expand-file-name "sources/" elpaca-directory))
|
||||
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
|
||||
:ref nil :depth 1 :inherit ignore
|
||||
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
|
||||
:build (:not elpaca-activate)))
|
||||
(let* ((repo (expand-file-name "elpaca/" elpaca-sources-directory))
|
||||
(build (expand-file-name "elpaca/" elpaca-builds-directory))
|
||||
(order (cdr elpaca-order))
|
||||
(default-directory repo))
|
||||
(add-to-list 'load-path (if (file-exists-p build) build repo))
|
||||
(unless (file-exists-p repo)
|
||||
(make-directory repo t)
|
||||
(when (<= emacs-major-version 28) (require 'subr-x))
|
||||
(condition-case-unless-debug err
|
||||
(if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
|
||||
((zerop (apply #'call-process `("git" nil ,buffer t "clone"
|
||||
,@(when-let* ((depth (plist-get order :depth)))
|
||||
(list (format "--depth=%d" depth) "--no-single-branch"))
|
||||
,(plist-get order :repo) ,repo))))
|
||||
((zerop (call-process "git" nil buffer t "checkout"
|
||||
(or (plist-get order :ref) "--"))))
|
||||
(emacs (concat invocation-directory invocation-name))
|
||||
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
|
||||
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
|
||||
((require 'elpaca))
|
||||
((elpaca-generate-autoloads "elpaca" repo)))
|
||||
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
|
||||
(error "%s" (with-current-buffer buffer (buffer-string))))
|
||||
((error) (warn "%s" err) (delete-directory repo 'recursive))))
|
||||
(unless (require 'elpaca-autoloads nil t)
|
||||
(require 'elpaca)
|
||||
(elpaca-generate-autoloads "elpaca" repo)
|
||||
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
|
||||
(add-hook 'after-init-hook #'elpaca-process-queues)
|
||||
(elpaca `(,@elpaca-order))
|
||||
(elpaca-wait)
|
||||
|
||||
;; emacs 30 fix
|
||||
;;(add-to-list 'elpaca-ignored-dependencies 'compat)
|
||||
|
||||
;; ==============================================================================
|
||||
;; CORE UI & INTERFACE
|
||||
;; ==============================================================================
|
||||
(elpaca compat)
|
||||
(elpaca general) ;; Keybindings
|
||||
(elpaca vertico) ;; Vertical completion
|
||||
(elpaca orderless) ;; Filtering for Consult/Vertico
|
||||
(elpaca marginalia) ;; Annotations in the minibuffer
|
||||
(elpaca corfu) ;; In-buffer completion
|
||||
(elpaca nerd-icons)
|
||||
(elpaca nerd-icons-completion)
|
||||
(elpaca nerd-icons-dired)
|
||||
(elpaca nerd-icons-corfu)
|
||||
(elpaca-wait) ;; Ensure UI is ready before loading tools
|
||||
|
||||
;; ==============================================================================
|
||||
;; EDITING & NAVIGATION
|
||||
;; ==============================================================================
|
||||
(elpaca meow) ;; Modal editing
|
||||
(elpaca avy) ;; Fast jumping
|
||||
(elpaca smartparens)
|
||||
(elpaca expand-region)
|
||||
(elpaca undo-fu)
|
||||
(elpaca vundo) ;; Visual undo tree
|
||||
(elpaca xclip)
|
||||
(elpaca clipetty)
|
||||
(elpaca embark) ;; Contextual actions
|
||||
(elpaca kirigami) ;; Selection/Editing
|
||||
(elpaca jinx) ;; Fast duplicate lines
|
||||
|
||||
;; ==============================================================================
|
||||
;; CODE ANALYSIS & VISUALS
|
||||
;; ==============================================================================
|
||||
(elpaca treesit-auto)
|
||||
(elpaca treesit-fold)
|
||||
(elpaca highlight-quoted)
|
||||
(elpaca highlight-defined)
|
||||
(elpaca color-identifiers-mode)
|
||||
(elpaca rainbow-delimiters)
|
||||
(elpaca indent-bars)
|
||||
(elpaca outline-indent)
|
||||
|
||||
;; ==============================================================================
|
||||
;; LSP & DEVELOPMENT
|
||||
;; ==============================================================================
|
||||
(elpaca mason) ;; LSP server manager
|
||||
(elpaca lsp-mode)
|
||||
(elpaca lsp-ui)
|
||||
(elpaca consult-lsp)
|
||||
|
||||
;; ==============================================================================
|
||||
;; LANGUAGE MODES
|
||||
;; ==============================================================================
|
||||
(elpaca kdl-mode)
|
||||
(elpaca csv-mode)
|
||||
|
||||
;; ==============================================================================
|
||||
;; UTILITIES
|
||||
;; ==============================================================================
|
||||
(elpaca consult) ;; Enhanced search/navigation
|
||||
(elpaca vterm)
|
||||
(elpaca vterm-toggle)
|
||||
(elpaca colorful-mode)
|
||||
;;(elpaca dirvish) ;;broken on emacs 30
|
||||
(elpaca transient)
|
||||
(elpaca magit)
|
||||
(elpaca casual)
|
||||
;; ==============================================================================
|
||||
;; KNOWLEDGE MANAGEMENT (ZK/DENOTE)
|
||||
;; ==============================================================================
|
||||
(elpaca denote)
|
||||
(elpaca consult-denote)
|
||||
(elpaca denote-menu)
|
||||
(elpaca zk)
|
||||
(elpaca zk-index)
|
||||
(elpaca-wait)
|
||||
|
||||
;; ==============================================================================
|
||||
;; ELPACA CONFIGURATION
|
||||
;; ==============================================================================
|
||||
(elpaca elpaca-use-package
|
||||
;; Automatically adds :ensure t and :defer t to use-package declarations
|
||||
(elpaca-use-package-mode)
|
||||
(setq elpaca-use-package-by-default t))
|
||||
|
||||
(elpaca-wait)
|
||||
|
||||
|
||||
(load (expand-file-name "config.el" user-emacs-directory))
|
||||
(custom-set-variables
|
||||
;; custom-set-variables was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
'(custom-safe-themes
|
||||
'("faaccacbb368285948d610df3814315fa5f7727358ddb77ad8dd16d15cd58d9f"
|
||||
default)))
|
||||
(custom-set-faces
|
||||
;; custom-set-faces was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
)
|
||||
@@ -0,0 +1,142 @@
|
||||
;;; themes/MTF4-extended-theme.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; MTF4-extended-theme.el
|
||||
;; A brighter, high-contrast light theme based on MTF4 with extended color palette
|
||||
|
||||
(deftheme MTF4-extended
|
||||
"A brighter, high-contrast light theme with extended color palette based on MTF4.")
|
||||
|
||||
(let (
|
||||
;; Core colors - Bright high-contrast palette
|
||||
(bg-primary "#FFFFFF")
|
||||
(bg-secondary "#F8F9FA")
|
||||
(bg-tertiary "#F0F0F0")
|
||||
(bg-highlight "#E0E0FF")
|
||||
(bg-region "#C0C0FF")
|
||||
|
||||
(fg-primary "#202020")
|
||||
(fg-secondary "#444444")
|
||||
(fg-tertiary "#666666")
|
||||
(fg-comment "#8D8D84")
|
||||
|
||||
;; Syntax colors - Bright and distinct
|
||||
(syntax-magenta "#EF89DF")
|
||||
(syntax-blue "#508AE0")
|
||||
(syntax-purple "#6434A3")
|
||||
(syntax-green "#88D26E")
|
||||
(syntax-teal "#008080")
|
||||
(syntax-red "#FF6B6B")
|
||||
(syntax-orange "#FFB347")
|
||||
(syntax-cyan "#89DAFF")
|
||||
|
||||
;; UI colors
|
||||
(ui-cursor "#6434A3") ; Purple cursor for visibility
|
||||
(ui-fringe "#F8F9FA") ; Subtle fringe
|
||||
(ui-mode-line "#508AE0") ; Bright blue mode line
|
||||
(ui-mode-line-inactive "#C0C0C0")
|
||||
(ui-search "#C0FFC0") ; Bright green search
|
||||
(ui-search-fail "#FFC0C0") ; Bright red for failed search
|
||||
)
|
||||
|
||||
(custom-theme-set-faces
|
||||
'MTF4-extended
|
||||
|
||||
;; Basic faces - High contrast foundation
|
||||
`(default ((t (:background ,bg-primary :foreground ,fg-primary))))
|
||||
`(cursor ((t (:background ,ui-cursor))))
|
||||
`(fringe ((t (:background ,ui-fringe))))
|
||||
`(hl-line ((t (:background ,bg-highlight))))
|
||||
`(highlight ((t (:background ,bg-highlight))))
|
||||
`(region ((t (:background ,bg-region :foreground ,fg-primary))))
|
||||
`(secondary-selection ((t (:background ,syntax-cyan :foreground ,fg-primary))))
|
||||
`(lazy-highlight ((t (:background ,ui-search :foreground ,fg-primary))))
|
||||
|
||||
;; Mode line - Bright and clear
|
||||
`(mode-line ((t (:foreground "white" :background ,ui-mode-line :box nil))))
|
||||
`(mode-line-inactive ((t (:foreground ,fg-primary :background ,ui-mode-line-inactive :box nil))))
|
||||
`(mode-line-buffer-id ((t (:foreground "white" :weight bold))))
|
||||
`(mode-line-emphasis ((t (:foreground "white" :weight bold))))
|
||||
`(mode-line-highlight ((t (:foreground "white"))))
|
||||
|
||||
;; Syntax highlighting - Bright, distinct colors
|
||||
`(font-lock-builtin-face ((t (:foreground ,syntax-purple))))
|
||||
`(font-lock-comment-face ((t (:foreground ,fg-comment :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((t (:foreground ,fg-comment))))
|
||||
`(font-lock-constant-face ((t (:foreground ,syntax-magenta))))
|
||||
`(font-lock-doc-face ((t (:foreground ,syntax-green))))
|
||||
`(font-lock-function-name-face ((t (:foreground ,syntax-blue))))
|
||||
`(font-lock-keyword-face ((t (:foreground ,syntax-purple :weight bold))))
|
||||
`(font-lock-string-face ((t (:foreground ,syntax-teal))))
|
||||
`(font-lock-type-face ((t (:foreground ,syntax-green))))
|
||||
`(font-lock-variable-name-face ((t (:foreground ,syntax-orange))))
|
||||
`(font-lock-preprocessor-face ((t (:foreground ,syntax-purple))))
|
||||
`(font-lock-warning-face ((t (:foreground ,syntax-red :weight bold))))
|
||||
`(font-lock-error-face ((t (:foreground ,syntax-red :weight bold))))
|
||||
|
||||
;; Search and matching
|
||||
`(isearch ((t (:background ,ui-search :foreground ,fg-primary))))
|
||||
`(isearch-fail ((t (:background ,ui-search-fail :foreground ,fg-primary))))
|
||||
`(match ((t (:background ,syntax-green :foreground ,bg-primary))))
|
||||
|
||||
;; Minibuffer
|
||||
`(minibuffer-prompt ((t (:foreground ,syntax-blue :weight bold))))
|
||||
|
||||
;; Line numbers
|
||||
`(line-number ((t (:foreground ,fg-comment :background ,bg-secondary))))
|
||||
`(line-number-current-line ((t (:foreground ,syntax-blue :background ,bg-tertiary :weight bold))))
|
||||
|
||||
;; Diff
|
||||
`(diff-added ((t (:background "#E0FFE0" :foreground ,syntax-green))))
|
||||
`(diff-removed ((t (:background "#FFE0E0" :foreground ,syntax-red))))
|
||||
`(diff-changed ((t (:background "#FFFFE0" :foreground ,syntax-orange))))
|
||||
|
||||
;; Whitespace
|
||||
`(whitespace-line ((t (:foreground ,syntax-red :background "#FFFF88"))))
|
||||
`(whitespace-tab ((t (:foreground "#E0E0E0" :background "white"))))
|
||||
`(whitespace-hspace ((t (:foreground "#E0E0E0"))))
|
||||
|
||||
;; Links
|
||||
`(link ((t (:foreground ,syntax-blue :underline t))))
|
||||
`(link-visited ((t (:foreground ,syntax-purple :underline t))))
|
||||
|
||||
;; Org-mode
|
||||
`(org-level-1 ((t (:foreground ,syntax-purple :weight bold :height 1.2))))
|
||||
`(org-level-2 ((t (:foreground ,syntax-blue :weight bold))))
|
||||
`(org-level-3 ((t (:foreground ,syntax-magenta :weight bold))))
|
||||
`(org-done ((t (:foreground ,syntax-green :weight bold))))
|
||||
`(org-todo ((t (:foreground ,syntax-red :weight bold))))
|
||||
`(org-date ((t (:foreground ,syntax-teal))))
|
||||
`(org-block ((t (:background ,bg-secondary :foreground ,fg-primary))))
|
||||
`(org-code ((t (:foreground ,syntax-orange))))
|
||||
|
||||
;; Terminal compatibility
|
||||
`(term-color-black ((t (:foreground ,fg-primary :background ,fg-primary))))
|
||||
`(term-color-red ((t (:foreground ,syntax-red :background ,syntax-red))))
|
||||
`(term-color-green ((t (:foreground ,syntax-green :background ,syntax-green))))
|
||||
`(term-color-yellow ((t (:foreground ,syntax-orange :background ,syntax-orange))))
|
||||
`(term-color-blue ((t (:foreground ,syntax-blue :background ,syntax-blue))))
|
||||
`(term-color-magenta ((t (:foreground ,syntax-magenta :background ,syntax-magenta))))
|
||||
`(term-color-cyan ((t (:foreground ,syntax-teal :background ,syntax-teal))))
|
||||
`(term-color-white ((t (:foreground ,bg-primary :background ,bg-primary))))
|
||||
|
||||
;; Company (autocompletion)
|
||||
`(company-tooltip ((t (:background ,bg-secondary :foreground ,fg-primary))))
|
||||
`(company-tooltip-selection ((t (:background ,syntax-blue :foreground "white"))))
|
||||
`(company-tooltip-common ((t (:foreground ,syntax-purple))))
|
||||
`(company-scrollbar-bg ((t (:background ,bg-tertiary))))
|
||||
`(company-scrollbar-fg ((t (:background ,fg-comment))))
|
||||
|
||||
;; Ivy/Helm
|
||||
`(ivy-current-match ((t (:background ,syntax-blue :foreground "white"))))
|
||||
`(ivy-minibuffer-match-face-1 ((t (:foreground ,fg-tertiary))))
|
||||
`(ivy-minibuffer-match-face-2 ((t (:foreground ,syntax-purple :weight bold))))
|
||||
`(ivy-minibuffer-match-face-3 ((t (:foreground ,syntax-magenta))))
|
||||
`(ivy-minibuffer-match-face-4 ((t (:foreground ,syntax-green))))
|
||||
|
||||
;; Dired
|
||||
`(dired-directory ((t (:foreground ,syntax-blue :weight bold))))
|
||||
`(dired-flagged ((t (:foreground ,syntax-red))))
|
||||
`(dired-symlink ((t (:foreground ,syntax-magenta))))
|
||||
))
|
||||
|
||||
(provide-theme 'MTF4-extended)
|
||||
@@ -0,0 +1,142 @@
|
||||
;;; themes/MTF4-extended-theme.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; MTF4-extended-theme.el
|
||||
;; A brighter, high-contrast light theme based on MTF4 with extended color palette
|
||||
|
||||
(deftheme MTF4-extended
|
||||
"A brighter, high-contrast light theme with extended color palette based on MTF4.")
|
||||
|
||||
(let (
|
||||
;; Core colors - Bright high-contrast palette
|
||||
(bg-primary "#FFFFFF")
|
||||
(bg-secondary "#F8F9FA")
|
||||
(bg-tertiary "#F0F0F0")
|
||||
(bg-highlight "#E0E0FF")
|
||||
(bg-region "#C0C0FF")
|
||||
|
||||
(fg-primary "#202020")
|
||||
(fg-secondary "#444444")
|
||||
(fg-tertiary "#666666")
|
||||
(fg-comment "#8D8D84")
|
||||
|
||||
;; Syntax colors - Bright and distinct
|
||||
(syntax-magenta "#EF89DF")
|
||||
(syntax-blue "#508AE0")
|
||||
(syntax-purple "#6434A3")
|
||||
(syntax-green "#88D26E")
|
||||
(syntax-teal "#008080")
|
||||
(syntax-red "#FF6B6B")
|
||||
(syntax-orange "#FFB347")
|
||||
(syntax-cyan "#89DAFF")
|
||||
|
||||
;; UI colors
|
||||
(ui-cursor "#6434A3") ; Purple cursor for visibility
|
||||
(ui-fringe "#F8F9FA") ; Subtle fringe
|
||||
(ui-mode-line "#508AE0") ; Bright blue mode line
|
||||
(ui-mode-line-inactive "#C0C0C0")
|
||||
(ui-search "#C0FFC0") ; Bright green search
|
||||
(ui-search-fail "#FFC0C0") ; Bright red for failed search
|
||||
)
|
||||
|
||||
(custom-theme-set-faces
|
||||
'MTF4-extended
|
||||
|
||||
;; Basic faces - High contrast foundation
|
||||
`(default ((t (:background ,bg-primary :foreground ,fg-primary))))
|
||||
`(cursor ((t (:background ,ui-cursor))))
|
||||
`(fringe ((t (:background ,ui-fringe))))
|
||||
`(hl-line ((t (:background ,bg-highlight))))
|
||||
`(highlight ((t (:background ,bg-highlight))))
|
||||
`(region ((t (:background ,bg-region :foreground ,fg-primary))))
|
||||
`(secondary-selection ((t (:background ,syntax-cyan :foreground ,fg-primary))))
|
||||
`(lazy-highlight ((t (:background ,ui-search :foreground ,fg-primary))))
|
||||
|
||||
;; Mode line - Bright and clear
|
||||
`(mode-line ((t (:foreground "white" :background ,ui-mode-line :box nil))))
|
||||
`(mode-line-inactive ((t (:foreground ,fg-primary :background ,ui-mode-line-inactive :box nil))))
|
||||
`(mode-line-buffer-id ((t (:foreground "white" :weight bold))))
|
||||
`(mode-line-emphasis ((t (:foreground "white" :weight bold))))
|
||||
`(mode-line-highlight ((t (:foreground "white"))))
|
||||
|
||||
;; Syntax highlighting - Bright, distinct colors
|
||||
`(font-lock-builtin-face ((t (:foreground ,syntax-purple))))
|
||||
`(font-lock-comment-face ((t (:foreground ,fg-comment :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((t (:foreground ,fg-comment))))
|
||||
`(font-lock-constant-face ((t (:foreground ,syntax-magenta))))
|
||||
`(font-lock-doc-face ((t (:foreground ,syntax-green))))
|
||||
`(font-lock-function-name-face ((t (:foreground ,syntax-blue))))
|
||||
`(font-lock-keyword-face ((t (:foreground ,syntax-purple :weight bold))))
|
||||
`(font-lock-string-face ((t (:foreground ,syntax-teal))))
|
||||
`(font-lock-type-face ((t (:foreground ,syntax-green))))
|
||||
`(font-lock-variable-name-face ((t (:foreground ,syntax-orange))))
|
||||
`(font-lock-preprocessor-face ((t (:foreground ,syntax-purple))))
|
||||
`(font-lock-warning-face ((t (:foreground ,syntax-red :weight bold))))
|
||||
`(font-lock-error-face ((t (:foreground ,syntax-red :weight bold))))
|
||||
|
||||
;; Search and matching
|
||||
`(isearch ((t (:background ,ui-search :foreground ,fg-primary))))
|
||||
`(isearch-fail ((t (:background ,ui-search-fail :foreground ,fg-primary))))
|
||||
`(match ((t (:background ,syntax-green :foreground ,bg-primary))))
|
||||
|
||||
;; Minibuffer
|
||||
`(minibuffer-prompt ((t (:foreground ,syntax-blue :weight bold))))
|
||||
|
||||
;; Line numbers
|
||||
`(line-number ((t (:foreground ,fg-comment :background ,bg-secondary))))
|
||||
`(line-number-current-line ((t (:foreground ,syntax-blue :background ,bg-tertiary :weight bold))))
|
||||
|
||||
;; Diff
|
||||
`(diff-added ((t (:background "#E0FFE0" :foreground ,syntax-green))))
|
||||
`(diff-removed ((t (:background "#FFE0E0" :foreground ,syntax-red))))
|
||||
`(diff-changed ((t (:background "#FFFFE0" :foreground ,syntax-orange))))
|
||||
|
||||
;; Whitespace
|
||||
`(whitespace-line ((t (:foreground ,syntax-red :background "#FFFF88"))))
|
||||
`(whitespace-tab ((t (:foreground "#E0E0E0" :background "white"))))
|
||||
`(whitespace-hspace ((t (:foreground "#E0E0E0"))))
|
||||
|
||||
;; Links
|
||||
`(link ((t (:foreground ,syntax-blue :underline t))))
|
||||
`(link-visited ((t (:foreground ,syntax-purple :underline t))))
|
||||
|
||||
;; Org-mode
|
||||
`(org-level-1 ((t (:foreground ,syntax-purple :weight bold :height 1.2))))
|
||||
`(org-level-2 ((t (:foreground ,syntax-blue :weight bold))))
|
||||
`(org-level-3 ((t (:foreground ,syntax-magenta :weight bold))))
|
||||
`(org-done ((t (:foreground ,syntax-green :weight bold))))
|
||||
`(org-todo ((t (:foreground ,syntax-red :weight bold))))
|
||||
`(org-date ((t (:foreground ,syntax-teal))))
|
||||
`(org-block ((t (:background ,bg-secondary :foreground ,fg-primary))))
|
||||
`(org-code ((t (:foreground ,syntax-orange))))
|
||||
|
||||
;; Terminal compatibility
|
||||
`(term-color-black ((t (:foreground ,fg-primary :background ,fg-primary))))
|
||||
`(term-color-red ((t (:foreground ,syntax-red :background ,syntax-red))))
|
||||
`(term-color-green ((t (:foreground ,syntax-green :background ,syntax-green))))
|
||||
`(term-color-yellow ((t (:foreground ,syntax-orange :background ,syntax-orange))))
|
||||
`(term-color-blue ((t (:foreground ,syntax-blue :background ,syntax-blue))))
|
||||
`(term-color-magenta ((t (:foreground ,syntax-magenta :background ,syntax-magenta))))
|
||||
`(term-color-cyan ((t (:foreground ,syntax-teal :background ,syntax-teal))))
|
||||
`(term-color-white ((t (:foreground ,bg-primary :background ,bg-primary))))
|
||||
|
||||
;; Company (autocompletion)
|
||||
`(company-tooltip ((t (:background ,bg-secondary :foreground ,fg-primary))))
|
||||
`(company-tooltip-selection ((t (:background ,syntax-blue :foreground "white"))))
|
||||
`(company-tooltip-common ((t (:foreground ,syntax-purple))))
|
||||
`(company-scrollbar-bg ((t (:background ,bg-tertiary))))
|
||||
`(company-scrollbar-fg ((t (:background ,fg-comment))))
|
||||
|
||||
;; Ivy/Helm
|
||||
`(ivy-current-match ((t (:background ,syntax-blue :foreground "white"))))
|
||||
`(ivy-minibuffer-match-face-1 ((t (:foreground ,fg-tertiary))))
|
||||
`(ivy-minibuffer-match-face-2 ((t (:foreground ,syntax-purple :weight bold))))
|
||||
`(ivy-minibuffer-match-face-3 ((t (:foreground ,syntax-magenta))))
|
||||
`(ivy-minibuffer-match-face-4 ((t (:foreground ,syntax-green))))
|
||||
|
||||
;; Dired
|
||||
`(dired-directory ((t (:foreground ,syntax-blue :weight bold))))
|
||||
`(dired-flagged ((t (:foreground ,syntax-red))))
|
||||
`(dired-symlink ((t (:foreground ,syntax-magenta))))
|
||||
))
|
||||
|
||||
(provide-theme 'MTF4-extended)
|
||||
@@ -0,0 +1,129 @@
|
||||
;;; themes/MTX16.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; my-extended-theme.el
|
||||
;; A high-contrast Emacs theme based on the extended color palette
|
||||
|
||||
(deftheme MTX16 "A high-contrast theme with extended color palette")
|
||||
|
||||
(let (
|
||||
;; Base colors - High contrast neutrals
|
||||
(base00 "#eef0f0") ; Background
|
||||
(base01 "#F8F9FA") ; Lighter background (status bars, line numbers)
|
||||
(base02 "#F0F0F0") ; Selection background, current line
|
||||
(base03 "#BBBBBB") ; Comments, invisible
|
||||
(base04 "#8D8D84") ; Dark foreground (disabled)
|
||||
(base05 "#666666") ; Default foreground (less important)
|
||||
(base06 "#444444") ; Default foreground
|
||||
(base07 "#333333") ; Strong foreground (important text)
|
||||
(base08 "#FF6B6B") ; Red: errors, deleted
|
||||
(base09 "#FFB347") ; Orange: warnings
|
||||
(base0A "#88D26E") ; Green: success, strings
|
||||
(base0B "#9EBD6E") ; Light green: strings alt
|
||||
(base0C "#508AE0") ; Blue: functions, info
|
||||
(base0D "#6434A3") ; Purple: keywords, variables
|
||||
(base0E "#EF89DF") ; Magenta: constants, special
|
||||
(base0F "#A080CA") ; Light purple: operators
|
||||
|
||||
;; Additional GUI-specific enhancements
|
||||
(highlight "#CEF")
|
||||
(region "#7DF")
|
||||
(accent-strong "#508AE0")
|
||||
(accent-subtle "#BEEFFF")
|
||||
)
|
||||
|
||||
(custom-theme-set-faces
|
||||
'MTX16
|
||||
|
||||
;; Basic faces
|
||||
`(default ((t (:background ,base00 :foreground ,base07))))
|
||||
`(cursor ((t (:background ,base07))))
|
||||
`(fringe ((t (:background ,base01))))
|
||||
`(highlight ((t (:background ,highlight))))
|
||||
`(region ((t (:background ,region :foreground ,base07))))
|
||||
`(secondary-selection ((t (:background ,accent-subtle))))
|
||||
|
||||
;; Mode line
|
||||
`(mode-line ((t (:background ,base02 :foreground ,base07 :box nil))))
|
||||
`(mode-line-inactive ((t (:background ,base01 :foreground ,base04 :box nil))))
|
||||
`(mode-line-buffer-id ((t (:foreground ,base0D :weight bold))))
|
||||
|
||||
;; Font lock - syntax highlighting
|
||||
`(font-lock-comment-face ((t (:foreground ,base03 :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((t (:foreground ,base03))))
|
||||
`(font-lock-doc-face ((t (:foreground ,base04))))
|
||||
`(font-lock-string-face ((t (:foreground ,base0A))))
|
||||
`(font-lock-constant-face ((t (:foreground ,base0E))))
|
||||
`(font-lock-builtin-face ((t (:foreground ,base0F))))
|
||||
`(font-lock-type-face ((t (:foreground ,base0D))))
|
||||
`(font-lock-function-name-face ((t (:foreground ,base0C))))
|
||||
`(font-lock-variable-name-face ((t (:foreground ,base06))))
|
||||
`(font-lock-keyword-face ((t (:foreground ,base0D :weight bold))))
|
||||
`(font-lock-preprocessor-face ((t (:foreground ,base0F))))
|
||||
`(font-lock-warning-face ((t (:foreground ,base09 :weight bold))))
|
||||
|
||||
;; UI elements
|
||||
`(minibuffer-prompt ((t (:foreground ,base0C :weight bold))))
|
||||
`(link ((t (:foreground ,base0C :underline t))))
|
||||
`(link-visited ((t (:foreground ,base0E :underline t))))
|
||||
`(button ((t (:foreground ,base0C :underline t))))
|
||||
`(header-line ((t (:background ,base01 :foreground ,base07))))
|
||||
`(vertical-border ((t (:foreground ,base02))))
|
||||
|
||||
;; Search and matching
|
||||
`(isearch ((t (:background ,base0E :foreground ,base00 :weight bold))))
|
||||
`(isearch-fail ((t (:background ,base08))))
|
||||
`(lazy-highlight ((t (:background ,accent-subtle :foreground ,base07))))
|
||||
`(match ((t (:background ,base0A :foreground ,base00))))
|
||||
|
||||
;; Line numbers
|
||||
`(line-number ((t (:foreground ,base03 :background ,base01))))
|
||||
`(line-number-current-line ((t (:foreground ,base07 :background ,base02 :weight bold))))
|
||||
|
||||
;; Company (autocompletion)
|
||||
`(company-tooltip ((t (:background ,base01 :foreground ,base07))))
|
||||
`(company-tooltip-selection ((t (:background ,base0C :foreground ,base00))))
|
||||
`(company-tooltip-common ((t (:foreground ,base0D))))
|
||||
`(company-scrollbar-bg ((t (:background ,base02))))
|
||||
`(company-scrollbar-fg ((t (:background ,base04))))
|
||||
|
||||
;; Org-mode
|
||||
`(org-level-1 ((t (:foreground ,base0D :weight bold :height 1.2))))
|
||||
`(org-level-2 ((t (:foreground ,base0C :weight bold))))
|
||||
`(org-level-3 ((t (:foreground ,base0F :weight bold))))
|
||||
`(org-done ((t (:foreground ,base0A :weight bold))))
|
||||
`(org-todo ((t (:foreground ,base08 :weight bold))))
|
||||
`(org-date ((t (:foreground ,base0E))))
|
||||
`(org-special-keyword ((t (:foreground ,base03))))
|
||||
`(org-block ((t (:background ,base01 :foreground ,base06))))
|
||||
`(org-code ((t (:foreground ,base0B))))
|
||||
|
||||
;; Terminal specific adjustments
|
||||
`(term-color-black ((t (:foreground ,base00 :background ,base00))))
|
||||
`(term-color-red ((t (:foreground ,base08 :background ,base08))))
|
||||
`(term-color-green ((t (:foreground ,base0A :background ,base0A))))
|
||||
`(term-color-yellow ((t (:foreground ,base09 :background ,base09))))
|
||||
`(term-color-blue ((t (:foreground ,base0C :background ,base0C))))
|
||||
`(term-color-magenta ((t (:foreground ,base0E :background ,base0E))))
|
||||
`(term-color-cyan ((t (:foreground ,base0B :background ,base0B))))
|
||||
`(term-color-white ((t (:foreground ,base07 :background ,base07))))
|
||||
|
||||
;; Error and warning faces
|
||||
`(error ((t (:foreground ,base08 :weight bold))))
|
||||
`(warning ((t (:foreground ,base09 :weight bold))))
|
||||
`(success ((t (:foreground ,base0A :weight bold))))
|
||||
|
||||
;; Dired
|
||||
`(dired-directory ((t (:foreground ,base0C :weight bold))))
|
||||
`(dired-flagged ((t (:foreground ,base08))))
|
||||
`(dired-symlink ((t (:foreground ,base0E))))
|
||||
|
||||
;; Ivy/Helm (completion frameworks)
|
||||
`(ivy-current-match ((t (:background ,base0C :foreground ,base00))))
|
||||
`(ivy-minibuffer-match-face-1 ((t (:foreground ,base05))))
|
||||
`(ivy-minibuffer-match-face-2 ((t (:foreground ,base0D :weight bold))))
|
||||
`(ivy-minibuffer-match-face-3 ((t (:foreground ,base0E))))
|
||||
`(ivy-minibuffer-match-face-4 ((t (:foreground ,base0A))))
|
||||
))
|
||||
|
||||
;; Provide the theme
|
||||
(provide-theme 'MTX16)
|
||||
@@ -0,0 +1,222 @@
|
||||
;;; camm1-theme.el --- Theme
|
||||
|
||||
;; Copyright (C) 2026 , Lvy
|
||||
|
||||
;; Author: Lvy
|
||||
;; Version: 0.1
|
||||
;; Package-Requires: ((emacs "24.1"))
|
||||
;; Created with ThemeCreator, https://github.com/mswift42/themecreator.
|
||||
|
||||
;; This program is free software: you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;; This file is not part of Emacs.
|
||||
|
||||
;;; Commentary:
|
||||
;;; camm1 theme created by Lvy in 2026
|
||||
|
||||
;;; Code:
|
||||
|
||||
(deftheme camm1)
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
(fg1 "#111")
|
||||
(fg2 "#242424")
|
||||
(fg3 "#373737")
|
||||
(fg4 "#4a4a4a")
|
||||
(fg6 "#0d0d0d")
|
||||
(bg1 "#f9fbfb")
|
||||
(bg2 "#e5e7e7")
|
||||
(bg3 "#d1d3d3")
|
||||
(bg4 "#bdbfbf")
|
||||
(builtin "#eb4747")
|
||||
(keyword "#55b0f6")
|
||||
(const "#ffa200")
|
||||
(comment "#b2b6b8")
|
||||
(func "#40b7bf")
|
||||
(str "#abce1c")
|
||||
(type "#ae58e4")
|
||||
(var "#f04ceb")
|
||||
(selection "#005fdb")
|
||||
(warning "#C82829")
|
||||
(warning2 "#f48925")
|
||||
(unspec (when (>= emacs-major-version 29) 'unspecified)))
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(default ((,class (:background ,bg1 :foreground ,fg1))))
|
||||
;; syntax
|
||||
`(font-lock-builtin-face ((,class (:foreground ,builtin))))
|
||||
`(font-lock-comment-face ((,class (:foreground ,comment))))
|
||||
`(font-lock-negation-char-face ((,class (:foreground ,const))))
|
||||
`(font-lock-reference-face ((,class (:foreground ,const))))
|
||||
`(font-lock-constant-face ((,class (:foreground ,const))))
|
||||
`(font-lock-doc-face ((,class (:foreground ,comment))))
|
||||
`(font-lock-function-name-face ((,class (:foreground ,func ))))
|
||||
`(font-lock-keyword-face ((,class (:bold ,class :foreground ,keyword))))
|
||||
`(font-lock-string-face ((,class (:foreground ,str))))
|
||||
`(font-lock-type-face ((,class (:foreground ,type ))))
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,var))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,warning :background ,bg2))))
|
||||
`(term-color-black ((,class (:foreground ,fg2 :background ,unspec))))
|
||||
;; `(region ((,class (:background ,fg1 :foreground ,bg1))))
|
||||
`(region ((,class (:background ,selection))))
|
||||
`(highlight ((,class (:foreground ,fg3 :background ,bg3))))
|
||||
`(hl-line ((,class (:background ,bg2))))
|
||||
`(fringe ((,class (:background ,bg2 :foreground ,fg4))))
|
||||
`(cursor ((,class (:background ,fg4))))
|
||||
`(isearch ((,class (:bold t :foreground ,warning :background ,bg3))))
|
||||
;;mode
|
||||
`(mode-line ((,class (:box (:line-width 1 :color nil) :bold t :foreground ,fg4 :background ,bg2))))
|
||||
`(mode-line-inactive ((,class (:box (:line-width 1 :color nil :style pressed-button) :foreground ,var :background ,bg1 :weight normal))))
|
||||
`(mode-line-buffer-id ((,class (:bold t :foreground ,func :background ,unspec))))
|
||||
`(mode-line-highlight ((,class (:foreground ,keyword :box nil :weight bold))))
|
||||
`(mode-line-emphasis ((,class (:foreground ,fg1))))
|
||||
`(vertical-border ((,class (:foreground ,fg3))))
|
||||
|
||||
`(minibuffer-prompt ((,class (:bold t :foreground ,keyword))))
|
||||
`(default-italic ((,class (:italic t))))
|
||||
`(link ((,class (:foreground ,const :underline t))))
|
||||
`(font-latex-bold-face ((,class (:foreground ,type))))
|
||||
`(font-latex-italic-face ((,class (:foreground ,var :italic t))))
|
||||
`(font-latex-string-face ((,class (:foreground ,str))))
|
||||
`(font-latex-match-reference-keywords ((,class (:foreground ,const))))
|
||||
`(font-latex-match-variable-keywords ((,class (:foreground ,var))))
|
||||
`(ido-only-match ((,class (:foreground ,warning))))
|
||||
`(org-sexp-date ((,class (:foreground ,fg4))))
|
||||
`(ido-first-match ((,class (:foreground ,keyword :bold t))))
|
||||
`(ivy-current-match ((,class (:foreground ,fg3 :inherit highlight :underline t))))
|
||||
`(gnus-header-content ((,class (:foreground ,keyword))))
|
||||
`(gnus-header-from ((,class (:foreground ,var))))
|
||||
`(gnus-header-name ((,class (:foreground ,type))))
|
||||
`(gnus-header-subject ((,class (:foreground ,func :bold t))))
|
||||
`(mu4e-view-url-number-face ((,class (:foreground ,type))))
|
||||
`(mu4e-cited-1-face ((,class (:foreground ,fg2))))
|
||||
`(mu4e-cited-7-face ((,class (:foreground ,fg3))))
|
||||
`(mu4e-header-marks-face ((,class (:foreground ,type))))
|
||||
`(ffap ((,class (:foreground ,fg4))))
|
||||
`(js2-private-function-call ((,class (:foreground ,const))))
|
||||
`(js2-jsdoc-html-tag-delimiter ((,class (:foreground ,str))))
|
||||
`(js2-jsdoc-html-tag-name ((,class (:foreground ,var))))
|
||||
`(js2-external-variable ((,class (:foreground ,type ))))
|
||||
`(js2-function-param ((,class (:foreground ,const))))
|
||||
`(js2-jsdoc-value ((,class (:foreground ,str))))
|
||||
`(js2-private-member ((,class (:foreground ,fg3))))
|
||||
`(js3-warning-face ((,class (:underline ,keyword))))
|
||||
`(js3-error-face ((,class (:underline ,warning))))
|
||||
`(js3-external-variable-face ((,class (:foreground ,var))))
|
||||
`(js3-function-param-face ((,class (:foreground ,fg2))))
|
||||
`(js3-jsdoc-tag-face ((,class (:foreground ,keyword))))
|
||||
`(js3-instance-member-face ((,class (:foreground ,const))))
|
||||
`(warning ((,class (:foreground ,warning))))
|
||||
`(ac-completion-face ((,class (:underline t :foreground ,keyword))))
|
||||
`(info-quoted-name ((,class (:foreground ,builtin))))
|
||||
`(info-string ((,class (:foreground ,str))))
|
||||
`(icompletep-determined ((,class :foreground ,builtin)))
|
||||
`(undo-tree-visualizer-current-face ((,class :foreground ,builtin)))
|
||||
`(undo-tree-visualizer-default-face ((,class :foreground ,fg2)))
|
||||
`(undo-tree-visualizer-unmodified-face ((,class :foreground ,var)))
|
||||
`(undo-tree-visualizer-register-face ((,class :foreground ,type)))
|
||||
`(slime-repl-inputed-output-face ((,class (:foreground ,type))))
|
||||
`(trailing-whitespace ((,class :foreground ,unspec :background ,warning)))
|
||||
`(rainbow-delimiters-depth-1-face ((,class :foreground ,fg1)))
|
||||
`(rainbow-delimiters-depth-2-face ((,class :foreground ,type)))
|
||||
`(rainbow-delimiters-depth-3-face ((,class :foreground ,var)))
|
||||
`(rainbow-delimiters-depth-4-face ((,class :foreground ,const)))
|
||||
`(rainbow-delimiters-depth-5-face ((,class :foreground ,keyword)))
|
||||
`(rainbow-delimiters-depth-6-face ((,class :foreground ,fg1)))
|
||||
`(rainbow-delimiters-depth-7-face ((,class :foreground ,type)))
|
||||
`(rainbow-delimiters-depth-8-face ((,class :foreground ,var)))
|
||||
`(magit-item-highlight ((,class :background ,bg3)))
|
||||
`(magit-section-heading ((,class (:foreground ,keyword :weight bold))))
|
||||
`(magit-hunk-heading ((,class (:background ,bg3))))
|
||||
`(magit-section-highlight ((,class (:background ,bg2))))
|
||||
`(magit-hunk-heading-highlight ((,class (:background ,bg3))))
|
||||
`(magit-diff-context-highlight ((,class (:background ,bg3 :foreground ,fg3))))
|
||||
`(magit-diffstat-added ((,class (:foreground ,type))))
|
||||
`(magit-diffstat-removed ((,class (:foreground ,var))))
|
||||
`(magit-process-ok ((,class (:foreground ,func :weight bold))))
|
||||
`(magit-process-ng ((,class (:foreground ,warning :weight bold))))
|
||||
`(magit-branch ((,class (:foreground ,const :weight bold))))
|
||||
`(magit-log-author ((,class (:foreground ,fg3))))
|
||||
`(magit-hash ((,class (:foreground ,fg2))))
|
||||
`(magit-diff-file-header ((,class (:foreground ,fg2 :background ,bg3))))
|
||||
`(lazy-highlight ((,class (:foreground ,fg2 :background ,bg3))))
|
||||
`(term ((,class (:foreground ,fg1 :background ,bg1))))
|
||||
`(term-color-black ((,class (:foreground ,bg3 :background ,bg3))))
|
||||
`(term-color-blue ((,class (:foreground ,func :background ,func))))
|
||||
`(term-color-red ((,class (:foreground ,keyword :background ,bg3))))
|
||||
`(term-color-green ((,class (:foreground ,type :background ,bg3))))
|
||||
`(term-color-yellow ((,class (:foreground ,var :background ,var))))
|
||||
`(term-color-magenta ((,class (:foreground ,builtin :background ,builtin))))
|
||||
`(term-color-cyan ((,class (:foreground ,str :background ,str))))
|
||||
`(term-color-white ((,class (:foreground ,fg2 :background ,fg2))))
|
||||
`(rainbow-delimiters-unmatched-face ((,class :foreground ,warning))))
|
||||
;; Legacy
|
||||
(if (< emacs-major-version 22)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(show-paren-match-face ((,class (:background ,warning))))) ;; obsoleted in 22.1, removed 2016
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(show-paren-match ((,class (:foreground ,bg1 :background ,str))))
|
||||
`(show-paren-mismatch ((,class (:foreground ,bg1 :background ,warning))))))
|
||||
;; emacs >= 26.1
|
||||
(when (>= emacs-major-version 26)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(line-number ((t (:inherit fringe))))
|
||||
`(line-number-current-line ((t (:inherit fringe :foreground ,fg6 :weight bold))))))
|
||||
|
||||
;; emacs >= 27.1
|
||||
(when (>= emacs-major-version 27)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(tab-line ((,class (:background ,bg2 :foreground ,fg4))))
|
||||
`(tab-line-tab ((,class (:inherit tab-line))))
|
||||
`(tab-line-tab-inactive ((,class (:background ,bg2 :foreground ,fg4))))
|
||||
`(tab-line-tab-current ((,class (:background ,bg1 :foreground ,fg1))))
|
||||
`(tab-line-highlight ((,class (:background ,bg1 :foreground ,fg2))))))
|
||||
(when (>= emacs-major-version 28)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(line-number ((t (:inherit fringe))))
|
||||
`(line-number-current-line ((t (:inherit fringe :foreground ,fg6 :weight bold))))))
|
||||
;; emacs >= 27.1
|
||||
(when (>= emacs-major-version 27)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(tab-line ((,class (:background ,bg2 :foreground ,fg4))))
|
||||
`(tab-line-tab ((,class (:inherit tab-line))))
|
||||
`(tab-line-tab-inactive ((,class (:background ,bg2 :foreground ,fg4))))
|
||||
`(tab-line-tab-current ((,class (:background ,bg1 :foreground ,fg1))))
|
||||
`(tab-line-highlight ((,class (:background ,bg1 :foreground ,fg2))))))
|
||||
(when (>= emacs-major-version 28)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(tab-line-tab-modified ((,class (:foreground ,warning2 :weight bold))))))
|
||||
(when (boundp 'font-lock-regexp-face)
|
||||
(custom-theme-set-faces
|
||||
'camm1
|
||||
`(font-lock-regexp-face ((,class (:inherit font-lock-string-face :underline 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 'camm1)
|
||||
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
||||
|
||||
;;; camm1-theme.el ends here
|
||||
@@ -0,0 +1,118 @@
|
||||
;;; camm2-theme.el --- A custom light theme based on provided colors -*- lexical-binding: t; -*-
|
||||
|
||||
(deftheme camm2
|
||||
"Custom light theme created from user-supplied colors.")
|
||||
|
||||
;; Helper to reference colors by name (makes the theme cleaner)
|
||||
(defun my-color (name)
|
||||
(cl-case name
|
||||
(fg1 "#111")
|
||||
(fg2 "#242424")
|
||||
(fg3 "#373737")
|
||||
(fg4 "#4a4a4a")
|
||||
(fg6 "#0d0d0d")
|
||||
(bg1 "#f9fbfb")
|
||||
(bg2 "#e5e7e7")
|
||||
(bg3 "#d1d3d3")
|
||||
(bg4 "#bdbfbf")
|
||||
(builtin "#40b7bf")
|
||||
(keyword "#55b0f6")
|
||||
(const "#ffa200")
|
||||
(comment "#b2b6b8")
|
||||
(func "#eb4747")
|
||||
(str "#a8dc19")
|
||||
(type "#ae58e4")
|
||||
(var "#f04ceb")
|
||||
(selection "#005fdb")
|
||||
(warning "#C82829")
|
||||
(warning2 "#f48925")))
|
||||
|
||||
(custom-theme-set-faces
|
||||
'camm2
|
||||
|
||||
;; Basic faces
|
||||
`(default ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg1)))))
|
||||
`(cursor ((t (:background ,(my-color 'fg4)))))
|
||||
`(fringe ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg3)))))
|
||||
`(vertical-border ((t (:foreground ,(my-color 'bg3)))))
|
||||
`(linum ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg3))))) ; legacy
|
||||
`(line-number ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg3)))))
|
||||
`(line-number-current-line ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg1) :weight bold))))
|
||||
|
||||
;; Font lock faces (syntax highlighting)
|
||||
`(font-lock-builtin-face ((t (:foreground ,(my-color 'builtin)))))
|
||||
`(font-lock-keyword-face ((t (:foreground ,(my-color 'keyword)))))
|
||||
`(font-lock-constant-face ((t (:foreground ,(my-color 'const)))))
|
||||
`(font-lock-comment-face ((t (:foreground ,(my-color 'comment) :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((t (:foreground ,(my-color 'comment) :slant italic))))
|
||||
`(font-lock-function-name-face ((t (:foreground ,(my-color 'func)))))
|
||||
`(font-lock-string-face ((t (:foreground ,(my-color 'str)))))
|
||||
`(font-lock-type-face ((t (:foreground ,(my-color 'type)))))
|
||||
`(font-lock-variable-name-face ((t (:foreground ,(my-color 'var)))))
|
||||
`(font-lock-doc-face ((t (:foreground ,(my-color 'comment) :slant italic))))
|
||||
`(font-lock-preprocessor-face ((t (:foreground ,(my-color 'builtin)))))
|
||||
`(font-lock-warning-face ((t (:foreground ,(my-color 'warning) :weight bold))))
|
||||
|
||||
;; Region and selection
|
||||
`(region ((t (:background ,(my-color 'selection) :foreground ,(my-color 'bg1)))))
|
||||
`(secondary-selection ((t (:background ,(my-color 'bg3)))))
|
||||
|
||||
;; Mode line
|
||||
`(mode-line ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg1) :box (:line-width 1 :color ,(my-color 'bg4))))))
|
||||
`(mode-line-inactive ((t (:background ,(my-color 'bg1) :foreground ,(my-color 'fg3) :box (:line-width 1 :color ,(my-color 'bg3))))))
|
||||
|
||||
;; Minibuffer and prompts
|
||||
`(minibuffer-prompt ((t (:foreground ,(my-color 'keyword) :weight bold))))
|
||||
|
||||
;; Highlighting
|
||||
`(highlight ((t (:background ,(my-color 'bg3)))))
|
||||
`(hl-line ((t (:background ,(my-color 'bg2)))))
|
||||
`(isearch ((t (:background ,(my-color 'warning2) :foreground ,(my-color 'bg1)))))
|
||||
`(lazy-highlight ((t (:background ,(my-color 'bg4)))))
|
||||
|
||||
;; Matching parentheses
|
||||
`(show-paren-match ((t (:background ,(my-color 'bg3) :foreground ,(my-color 'fg1) :weight bold))))
|
||||
`(show-paren-mismatch ((t (:background ,(my-color 'warning) :foreground ,(my-color 'bg1)))))
|
||||
|
||||
;; Error / warning / success
|
||||
`(error ((t (:foreground ,(my-color 'warning) :weight bold))))
|
||||
`(warning ((t (:foreground ,(my-color 'warning2) :weight bold))))
|
||||
`(success ((t (:foreground ,(my-color 'str)))))
|
||||
|
||||
;; Button and link
|
||||
`(link ((t (:foreground ,(my-color 'keyword) :underline t))))
|
||||
`(link-visited ((t (:foreground ,(my-color 'type) :underline t))))
|
||||
|
||||
;; Tooltip
|
||||
`(tooltip ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg1) :box (:line-width 1 :color ,(my-color 'bg4))))))
|
||||
|
||||
;; Dired
|
||||
`(dired-directory ((t (:foreground ,(my-color 'keyword) :weight bold))))
|
||||
`(dired-symlink ((t (:foreground ,(my-color 'func)))))
|
||||
`(dired-ignored ((t (:foreground ,(my-color 'comment)))))
|
||||
|
||||
;; Custom faces used by Doom modules (modeline, dashboard, etc.)
|
||||
`(doom-modeline-bar ((t (:background ,(my-color 'keyword)))))
|
||||
`(doom-modeline-buffer-file ((t (:foreground ,(my-color 'func)))))
|
||||
`(doom-modeline-buffer-modified ((t (:foreground ,(my-color 'warning2)))))
|
||||
`(doom-modeline-project-dir ((t (:foreground ,(my-color 'type)))))
|
||||
|
||||
;; Company / autocomplete
|
||||
`(company-tooltip ((t (:background ,(my-color 'bg2) :foreground ,(my-color 'fg1)))))
|
||||
`(company-tooltip-selection ((t (:background ,(my-color 'selection) :foreground ,(my-color 'bg1)))))
|
||||
`(company-tooltip-common ((t (:foreground ,(my-color 'func)))))
|
||||
`(company-scrollbar-fg ((t (:background ,(my-color 'fg4)))))
|
||||
`(company-scrollbar-bg ((t (:background ,(my-color 'bg3)))))
|
||||
|
||||
;; Outline / Org headings (simple, can be extended)
|
||||
`(outline-1 ((t (:foreground ,(my-color 'type) :weight bold))))
|
||||
`(outline-2 ((t (:foreground ,(my-color 'func) :weight bold))))
|
||||
`(outline-3 ((t (:foreground ,(my-color 'keyword) :weight bold))))
|
||||
`(org-level-1 ((t (:inherit outline-1 :height 1.1))))
|
||||
`(org-level-2 ((t (:inherit outline-2 :height 1.05))))
|
||||
`(org-level-3 ((t (:inherit outline-3))))
|
||||
)
|
||||
|
||||
;; Provide the theme
|
||||
(provide-theme 'camm2)
|
||||
;;; camm2-theme.el ends here
|
||||
@@ -0,0 +1,223 @@
|
||||
;;; camm3-theme.el --- Custom theme based on user palette -*- lexical-binding: t; -*-
|
||||
|
||||
(deftheme camm3 "Custom theme with neutrals, syntax highlighting, and UI feedback.")
|
||||
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
;; Neutrals & surfaces
|
||||
(bg-base "#f9fbfb")
|
||||
(bg-panel "#f2f4f4")
|
||||
(bg-surface-2 "#e5e7e7")
|
||||
(bg-surface-3 "#d1d3d3")
|
||||
(border "#bdbfbf")
|
||||
(border-focus "#005fdb")
|
||||
|
||||
;; Text scale
|
||||
(text-primary "#0d0d0d")
|
||||
(text-secondary "#111111")
|
||||
(text-tertiary "#242424")
|
||||
(text-muted "#373737")
|
||||
(text-faint "#4a4a4a")
|
||||
(text-faint-2 "#5d5d5d")
|
||||
(text-inverse "#ffffff")
|
||||
|
||||
;; Syntax highlighting
|
||||
(code-comment "#b2b6b8")
|
||||
(code-builtin "#40b7bf")
|
||||
(code-keyword "#55b0f6")
|
||||
(code-constant "#ffa200")
|
||||
(code-function "#c42020")
|
||||
(code-string "#a8dc19")
|
||||
(code-type "#8a35b8")
|
||||
(code-variable "#f04ceb")
|
||||
(code-number "#f48925")
|
||||
(code-operator "#4a4a4a")
|
||||
|
||||
;; UI & feedback
|
||||
(ui-selection "#005fdb")
|
||||
(ui-selection-bg "#e6eeff")
|
||||
(ui-cursor "#005fdb")
|
||||
(ui-active-line "#f0f4ff")
|
||||
(status-error "#c82829")
|
||||
(status-warning "#f48925")
|
||||
(status-success "#22a653")
|
||||
(status-info "#3b82f6"))
|
||||
|
||||
(custom-theme-set-faces
|
||||
'camm3
|
||||
;; Basic faces
|
||||
`(default ((,class (:background ,bg-base :foreground ,text-primary))))
|
||||
`(cursor ((,class (:background ,ui-cursor))))
|
||||
`(region ((,class (:background ,ui-selection-bg :foreground ,ui-selection))))
|
||||
`(fringe ((,class (:background ,bg-panel :foreground ,text-faint))))
|
||||
`(highlight ((,class (:background ,ui-active-line))))
|
||||
`(hl-line ((,class (:background ,ui-active-line))))
|
||||
`(vertical-border ((,class (:foreground ,border))))
|
||||
`(window-divider ((,class (:foreground ,border))))
|
||||
`(window-divider-first-pixel ((,class (:foreground ,border))))
|
||||
`(window-divider-last-pixel ((,class (:foreground ,border))))
|
||||
`(minibuffer-prompt ((,class (:foreground ,status-info :weight bold))))
|
||||
`(link ((,class (:foreground ,status-info :underline t))))
|
||||
`(link-visited ((,class (:foreground ,code-type :underline t))))
|
||||
`(shadow ((,class (:foreground ,text-faint))))
|
||||
`(success ((,class (:foreground ,status-success :weight bold))))
|
||||
`(warning ((,class (:foreground ,status-warning :weight bold))))
|
||||
`(error ((,class (:foreground ,status-error :weight bold))))
|
||||
|
||||
;; Mode line
|
||||
`(mode-line ((,class (:background ,bg-surface-2 :foreground ,text-primary
|
||||
:box (:line-width 1 :color ,border)))))
|
||||
`(mode-line-inactive ((,class (:background ,bg-panel :foreground ,text-faint
|
||||
:box (:line-width 1 :color ,border)))))
|
||||
`(mode-line-buffer-id ((,class (:weight bold :foreground ,ui-selection))))
|
||||
|
||||
;; Line numbers
|
||||
`(line-number ((,class (:background ,bg-base :foreground ,text-faint-2))))
|
||||
`(line-number-current-line ((,class (:background ,ui-active-line :foreground ,text-primary :weight bold))))
|
||||
|
||||
;; Font lock (syntax highlighting)
|
||||
`(font-lock-builtin-face ((,class (:foreground ,code-builtin))))
|
||||
`(font-lock-comment-face ((,class (:foreground ,code-comment :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((,class (:foreground ,code-comment :slant italic))))
|
||||
`(font-lock-constant-face ((,class (:foreground ,code-constant))))
|
||||
`(font-lock-doc-face ((,class (:foreground ,code-comment :slant italic))))
|
||||
`(font-lock-function-name-face ((,class (:foreground ,code-function))))
|
||||
`(font-lock-keyword-face ((,class (:foreground ,code-keyword))))
|
||||
`(font-lock-number-face ((,class (:foreground ,code-number))))
|
||||
`(font-lock-operator-face ((,class (:foreground ,code-operator))))
|
||||
`(font-lock-string-face ((,class (:foreground ,code-string))))
|
||||
`(font-lock-type-face ((,class (:foreground ,code-type))))
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,code-variable))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,status-warning :weight bold))))
|
||||
|
||||
;; Search & match
|
||||
`(isearch ((,class (:background ,ui-selection :foreground ,text-inverse))))
|
||||
`(isearch-fail ((,class (:background ,status-error :foreground ,text-inverse))))
|
||||
`(lazy-highlight ((,class (:background ,ui-selection-bg :foreground ,ui-selection :underline t))))
|
||||
`(match ((,class (:background ,ui-selection-bg :foreground ,ui-selection))))
|
||||
|
||||
;; Secondary selection (e.g., multiple-cursors)
|
||||
`(secondary-selection ((,class (:background ,bg-surface-3))))
|
||||
|
||||
;; Trailing whitespace
|
||||
`(trailing-whitespace ((,class (:background ,status-error :foreground ,text-inverse))))
|
||||
|
||||
;; Diff (vc-gutter, magit)
|
||||
`(diff-added ((,class (:foreground ,status-success))))
|
||||
`(diff-removed ((,class (:foreground ,status-error))))
|
||||
`(diff-refine-added ((,class (:background ,status-success :foreground ,text-inverse))))
|
||||
`(diff-refine-removed ((,class (:background ,status-error :foreground ,text-inverse))))
|
||||
`(diff-header ((,class (:background ,bg-panel :foreground ,text-tertiary))))
|
||||
`(diff-file-header ((,class (:background ,bg-surface-2 :foreground ,text-primary :weight bold))))
|
||||
|
||||
;; Org mode
|
||||
`(org-level-1 ((,class (:foreground ,ui-selection :weight bold :height 1.2))))
|
||||
`(org-level-2 ((,class (:foreground ,code-function :weight bold :height 1.1))))
|
||||
`(org-level-3 ((,class (:foreground ,code-type :weight bold))))
|
||||
`(org-level-4 ((,class (:foreground ,code-variable :weight bold))))
|
||||
`(org-level-5 ((,class (:foreground ,code-builtin :weight bold))))
|
||||
`(org-level-6 ((,class (:foreground ,code-constant :weight bold))))
|
||||
`(org-level-7 ((,class (:foreground ,code-keyword :weight bold))))
|
||||
`(org-level-8 ((,class (:foreground ,code-string :weight bold))))
|
||||
`(org-todo ((,class (:foreground ,status-error :weight bold))))
|
||||
`(org-done ((,class (:foreground ,status-success :weight bold))))
|
||||
`(org-date ((,class (:foreground ,code-number :underline t))))
|
||||
`(org-link ((,class (:foreground ,status-info :underline t))))
|
||||
`(org-block ((,class (:background ,bg-surface-2 :extend t))))
|
||||
`(org-block-begin-line ((,class (:background ,bg-panel :foreground ,text-faint))))
|
||||
`(org-block-end-line ((,class (:background ,bg-panel :foreground ,text-faint))))
|
||||
|
||||
;; Doom modeline specific (if using doom-modeline)
|
||||
`(doom-modeline-bar ((,class (:background ,ui-selection))))
|
||||
`(doom-modeline-buffer-modified ((,class (:foreground ,status-warning))))
|
||||
`(doom-modeline-buffer-major-mode ((,class (:foreground ,code-type :weight bold))))
|
||||
`(doom-modeline-project-root-dir ((,class (:foreground ,code-builtin))))
|
||||
`(doom-modeline-evil-normal-state ((,class (:background ,ui-selection :foreground ,text-inverse))))
|
||||
`(doom-modeline-evil-insert-state ((,class (:background ,status-success :foreground ,text-inverse))))
|
||||
`(doom-modeline-evil-visual-state ((,class (:background ,code-variable :foreground ,text-inverse))))
|
||||
|
||||
;; Tree-sitter (if you use tree-sitter modes)
|
||||
`(tree-sitter-hl-face:function.call ((,class (:foreground ,code-function))))
|
||||
`(tree-sitter-hl-face:function.builtin ((,class (:foreground ,code-builtin))))
|
||||
`(tree-sitter-hl-face:function ((,class (:foreground ,code-function))))
|
||||
`(tree-sitter-hl-face:type ((,class (:foreground ,code-type))))
|
||||
`(tree-sitter-hl-face:constant ((,class (:foreground ,code-constant))))
|
||||
`(tree-sitter-hl-face:keyword ((,class (:foreground ,code-keyword))))
|
||||
`(tree-sitter-hl-face:string ((,class (:foreground ,code-string))))
|
||||
`(tree-sitter-hl-face:comment ((,class (:foreground ,code-comment :slant italic))))
|
||||
`(tree-sitter-hl-face:variable ((,class (:foreground ,code-variable))))
|
||||
`(tree-sitter-hl-face:number ((,class (:foreground ,code-number))))
|
||||
`(tree-sitter-hl-face:operator ((,class (:foreground ,code-operator))))
|
||||
`(tree-sitter-hl-face:property ((,class (:foreground ,text-secondary))))
|
||||
|
||||
;; Company / Corfu completion
|
||||
`(company-tooltip ((,class (:background ,bg-panel :foreground ,text-primary))))
|
||||
`(company-tooltip-selection ((,class (:background ,ui-selection-bg :foreground ,ui-selection))))
|
||||
`(company-tooltip-common ((,class (:foreground ,code-keyword))))
|
||||
`(company-tooltip-annotation ((,class (:foreground ,text-faint))))
|
||||
`(company-scrollbar-bg ((,class (:background ,bg-surface-3))))
|
||||
`(company-scrollbar-fg ((,class (:background ,border))))
|
||||
`(corfu-current ((,class (:background ,ui-selection-bg :foreground ,ui-selection))))
|
||||
|
||||
;; LSP / Flycheck
|
||||
`(flycheck-error ((,class (:underline (:style wave :color ,status-error)))))
|
||||
`(flycheck-warning ((,class (:underline (:style wave :color ,status-warning)))))
|
||||
`(flycheck-info ((,class (:underline (:style wave :color ,status-info)))))
|
||||
`(lsp-face-highlight-textual ((,class (:background ,ui-active-line :underline t))))
|
||||
`(lsp-face-highlight-read ((,class (:background ,ui-selection-bg :underline t))))
|
||||
`(lsp-face-highlight-write ((,class (:background ,ui-selection-bg :underline t))))
|
||||
|
||||
;; Whitespace mode
|
||||
`(whitespace-space ((,class (:foreground ,bg-surface-3))))
|
||||
`(whitespace-tab ((,class (:foreground ,bg-surface-3))))
|
||||
`(whitespace-newline ((,class (:foreground ,bg-surface-3))))
|
||||
`(whitespace-indentation ((,class (:foreground ,bg-surface-3))))
|
||||
`(whitespace-line ((,class (:background ,ui-active-line :foreground ,text-primary))))
|
||||
`(whitespace-empty ((,class (:background ,status-error :foreground ,text-inverse))))
|
||||
|
||||
;; Highlight indentation guides (indent-guides)
|
||||
`(highlight-indent-guides-character-face ((,class (:foreground ,border))))
|
||||
`(highlight-indent-guides-stack-character-face ((,class (:foreground ,bg-surface-3))))
|
||||
`(highlight-indent-guides-odd-face ((,class (:background ,bg-panel))))
|
||||
`(highlight-indent-guides-even-face ((,class (:background ,bg-base))))
|
||||
|
||||
;; IMenu / Outline
|
||||
`(imenu-list-entry-face-0 ((,class (:foreground ,code-keyword))))
|
||||
`(imenu-list-entry-face-1 ((,class (:foreground ,code-function))))
|
||||
`(imenu-list-entry-face-2 ((,class (:foreground ,code-type))))
|
||||
`(imenu-list-entry-face-3 ((,class (:foreground ,code-constant))))
|
||||
|
||||
;; Avy (jump hints)
|
||||
`(avy-lead-face ((,class (:background ,ui-selection :foreground ,text-inverse :weight bold))))
|
||||
`(avy-lead-face-0 ((,class (:background ,status-success :foreground ,text-inverse :weight bold))))
|
||||
`(avy-lead-face-1 ((,class (:background ,status-warning :foreground ,text-inverse :weight bold))))
|
||||
`(avy-lead-face-2 ((,class (:background ,code-variable :foreground ,text-inverse :weight bold))))
|
||||
`(avy-background-face ((,class (:background ,bg-panel :foreground ,text-faint))))
|
||||
|
||||
;; Denote (notes)
|
||||
`(denote-faces-link ((,class (:foreground ,status-info :underline t))))
|
||||
`(denote-faces-date ((,class (:foreground ,code-number))))
|
||||
`(denote-faces-keyword ((,class (:foreground ,code-keyword :weight bold))))
|
||||
`(denote-faces-title ((,class (:foreground ,text-primary :weight bold :height 1.2))))
|
||||
|
||||
;; Extra: markdown, json, etc.
|
||||
`(markdown-header-face-1 ((,class (:inherit org-level-1))))
|
||||
`(markdown-header-face-2 ((,class (:inherit org-level-2))))
|
||||
`(markdown-header-face-3 ((,class (:inherit org-level-3))))
|
||||
`(markdown-header-face-4 ((,class (:inherit org-level-4))))
|
||||
`(markdown-header-face-5 ((,class (:inherit org-level-5))))
|
||||
`(markdown-header-face-6 ((,class (:inherit org-level-6))))
|
||||
`(markdown-link-face ((,class (:inherit link))))
|
||||
`(markdown-url-face ((,class (:foreground ,code-number))))
|
||||
`(json-key-face ((,class (:foreground ,code-keyword))))
|
||||
`(json-number-face ((,class (:foreground ,code-number))))
|
||||
`(json-string-face ((,class (:foreground ,code-string))))
|
||||
`(json-boolean-face ((,class (:foreground ,code-constant))))
|
||||
`(json-null-face ((,class (:foreground ,code-constant))))
|
||||
|
||||
;; Custom faces used in user config (e.g., my-set-buffer-font buffer-face)
|
||||
`(buffer-face ((,class (:family "Noto Sans" :height 140))))))
|
||||
|
||||
;; Provide the theme
|
||||
(provide-theme 'camm3)
|
||||
|
||||
;;; camm3-theme.el ends here
|
||||
@@ -0,0 +1,152 @@
|
||||
;;; camm4-theme.el --- A light theme based on the camm4 palette -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||
|
||||
(deftheme camm4
|
||||
"Light theme with a calm, readable palette.
|
||||
Core colours: blues (005FDB, 3B82F6, 007A8A, 40B7BF) and magenta (8A35B8, D33682).")
|
||||
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
;; Basic palette
|
||||
(camm4-bg "#fefcff")
|
||||
(camm4-fg "#101010")
|
||||
(camm4-cursor "#f04ceb")
|
||||
;; ANSI colours (index 01-16)
|
||||
(camm4-black "#E6EEFF") ; 01 – very light blueish grey
|
||||
(camm4-red "#C82829") ; 02
|
||||
(camm4-green "#419722") ; 03
|
||||
(camm4-yellow "#F48925") ; 04
|
||||
(camm4-blue "#005FDB") ; 05 – core blue
|
||||
(camm4-magenta "#EF89DF") ; 06 – core purple
|
||||
(camm4-cyan "#007A8A") ; 07 – core teal/blue
|
||||
(camm4-white "#4D4D4C") ; 08 – dark grey
|
||||
(camm4-brblack "#e2ecff") ; 09
|
||||
(camm4-brred "#E53935") ; 10
|
||||
(camm4-brgreen "#22A653") ; 11
|
||||
(camm4-bryellow "#FFA200") ; 12
|
||||
(camm4-brblue "#3B82F6") ; 13 – core bright blue
|
||||
(camm4-brmagenta "#D33682") ; 14 – core bright magenta
|
||||
(camm4-brcyan "#40B7BF") ; 15 – core bright teal
|
||||
(camm4-brwhite "#1D1F21")) ; 16 – near black
|
||||
|
||||
(custom-theme-set-faces
|
||||
'camm4
|
||||
;; Basic faces
|
||||
`(default ((,class (:background ,camm4-bg :foreground ,camm4-fg))))
|
||||
`(cursor ((,class (:background ,camm4-cursor))))
|
||||
`(fringe ((,class (:background ,camm4-bg :foreground ,camm4-white))))
|
||||
`(region ((,class (:background ,camm4-brblack :foreground ,camm4-fg))))
|
||||
`(highlight ((,class (:background ,camm4-brblack))))
|
||||
`(hl-line ((,class (:background ,camm4-brblack))))
|
||||
`(success ((,class (:foreground ,camm4-brgreen))))
|
||||
`(warning ((,class (:foreground ,camm4-bryellow))))
|
||||
`(error ((,class (:foreground ,camm4-brred :weight bold))))
|
||||
`(link ((,class (:foreground ,camm4-blue :underline t))))
|
||||
`(link-visited ((,class (:foreground ,camm4-magenta :underline t))))
|
||||
|
||||
;; Font lock (syntax highlighting)
|
||||
`(font-lock-builtin-face ((,class (:foreground ,camm4-cyan))))
|
||||
`(font-lock-comment-face ((,class (:foreground ,camm4-white :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((,class (:inherit font-lock-comment-face))))
|
||||
`(font-lock-constant-face ((,class (:foreground ,camm4-brblue))))
|
||||
`(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,camm4-green))))
|
||||
`(font-lock-function-name-face ((,class (:foreground ,camm4-brmagenta :weight bold))))
|
||||
`(font-lock-keyword-face ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(font-lock-negation-char-face ((,class (:foreground ,camm4-red))))
|
||||
`(font-lock-preprocessor-face ((,class (:foreground ,camm4-cyan))))
|
||||
`(font-lock-regexp-grouping-backslash ((,class (:foreground ,camm4-yellow))))
|
||||
`(font-lock-regexp-grouping-construct ((,class (:foreground ,camm4-red))))
|
||||
`(font-lock-string-face ((,class (:foreground ,camm4-red :weight semi-light))))
|
||||
`(font-lock-type-face ((,class (:foreground ,camm4-brcyan :weight normal))))
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,camm4-magenta))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,camm4-brred :weight bold))))
|
||||
|
||||
;; Mode line
|
||||
`(mode-line ((,class (:background ,camm4-black :foreground ,camm4-fg :box (:line-width 1 :color ,camm4-white)))))
|
||||
`(mode-line-inactive ((,class (:background ,camm4-brblack :foreground ,camm4-white :box (:line-width 1 :color ,camm4-brblack)))))
|
||||
`(mode-line-buffer-id ((,class (:weight bold :foreground ,camm4-brblue))))
|
||||
`(mode-line-emphasis ((,class (:weight bold))))
|
||||
`(mode-line-highlight ((,class (:box (:line-width 1 :color ,camm4-brblue)))))
|
||||
|
||||
;; Minibuffer, completion, etc.
|
||||
`(minibuffer-prompt ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(completions-common-part ((,class (:foreground ,camm4-fg))))
|
||||
`(completions-first-difference ((,class (:foreground ,camm4-brred :weight bold))))
|
||||
|
||||
;; Search
|
||||
`(isearch ((,class (:background ,camm4-bryellow :foreground ,camm4-fg))))
|
||||
`(isearch-fail ((,class (:background ,camm4-red :foreground ,camm4-bg))))
|
||||
`(lazy-highlight ((,class (:background ,camm4-yellow :foreground ,camm4-fg :underline t))))
|
||||
|
||||
;; Line numbers
|
||||
`(line-number ((,class (:foreground ,camm4-white :background ,camm4-bg))))
|
||||
`(line-number-current-line ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack))))
|
||||
|
||||
;; Dired
|
||||
`(dired-header ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(dired-directory ((,class (:foreground ,camm4-brblue :weight bold))))
|
||||
`(dired-symlink ((,class (:foreground ,camm4-cyan :slant italic))))
|
||||
|
||||
;; Org mode
|
||||
`(org-level-1 ((,class (:foreground ,camm4-brblue :weight bold :height 1.2))))
|
||||
`(org-level-2 ((,class (:foreground ,camm4-blue :weight bold :height 1.1))))
|
||||
`(org-level-3 ((,class (:foreground ,camm4-cyan :weight bold))))
|
||||
`(org-level-4 ((,class (:foreground ,camm4-magenta :weight bold))))
|
||||
`(org-level-5 ((,class (:foreground ,camm4-brcyan :weight bold))))
|
||||
`(org-level-6 ((,class (:foreground ,camm4-brmagenta :weight bold))))
|
||||
`(org-todo ((,class (:foreground ,camm4-brred :weight bold :box t))))
|
||||
`(org-done ((,class (:foreground ,camm4-brgreen :weight bold :box t))))
|
||||
`(org-date ((,class (:foreground ,camm4-brblue :underline t))))
|
||||
`(org-link ((,class (:foreground ,camm4-blue :underline t))))
|
||||
`(org-tag ((,class (:foreground ,camm4-white :weight normal))))
|
||||
|
||||
;; Markdown
|
||||
`(markdown-header-face-1 ((,class (:inherit org-level-1))))
|
||||
`(markdown-header-face-2 ((,class (:inherit org-level-2))))
|
||||
`(markdown-header-face-3 ((,class (:inherit org-level-3))))
|
||||
`(markdown-link-face ((,class (:inherit link))))
|
||||
`(markdown-url-face ((,class (:inherit link))))
|
||||
|
||||
;; Magit
|
||||
`(magit-branch-local ((,class (:foreground ,camm4-brblue :weight bold))))
|
||||
`(magit-branch-remote ((,class (:foreground ,camm4-cyan :weight bold))))
|
||||
`(magit-tag ((,class (:foreground ,camm4-bryellow :weight bold))))
|
||||
`(magit-hash ((,class (:foreground ,camm4-white))))
|
||||
`(magit-diff-added ((,class (:foreground ,camm4-brgreen))))
|
||||
`(magit-diff-removed ((,class (:foreground ,camm4-brred))))
|
||||
`(magit-diff-context ((,class (:foreground ,camm4-white))))
|
||||
`(magit-section-heading ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack))))
|
||||
`(magit-section-highlight ((,class (:background ,camm4-brblack))))
|
||||
|
||||
;; Tree‑sitter (if you use it)
|
||||
`(tree-sitter-hl-face:function.call ((,class (:foreground ,camm4-brmagenta))))
|
||||
`(tree-sitter-hl-face:function.builtin ((,class (:foreground ,camm4-cyan))))
|
||||
`(tree-sitter-hl-face:variable.builtin ((,class (:foreground ,camm4-magenta))))
|
||||
`(tree-sitter-hl-face:type ((,class (:foreground ,camm4-brcyan))))
|
||||
`(tree-sitter-hl-face:constant.builtin ((,class (:foreground ,camm4-brblue))))
|
||||
|
||||
;; LSP / Flycheck
|
||||
`(flycheck-error ((,class (:underline (:style wave :color ,camm4-brred)))))
|
||||
`(flycheck-warning ((,class (:underline (:style wave :color ,camm4-bryellow)))))
|
||||
`(flycheck-info ((,class (:underline (:style wave :color ,camm4-brblue)))))
|
||||
`(lsp-face-highlight-textual ((,class (:background ,camm4-brblack :underline t))))
|
||||
|
||||
;; Extra
|
||||
`(show-paren-match ((,class (:background ,camm4-brcyan :foreground ,camm4-bg :weight bold))))
|
||||
`(show-paren-mismatch ((,class (:background ,camm4-brred :foreground ,camm4-bg :weight bold))))
|
||||
`(match ((,class (:background ,camm4-yellow :foreground ,camm4-fg))))
|
||||
`(shadow ((,class (:foreground ,camm4-white))))
|
||||
`(secondary-selection ((,class (:background ,camm4-brblack))))
|
||||
`(trailing-whitespace ((,class (:background ,camm4-brred))))
|
||||
`(vertical-border ((,class (:foreground ,camm4-white))))
|
||||
`(widget-button ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(widget-field ((,class (:background ,camm4-brblack))))
|
||||
))
|
||||
|
||||
;;;###autoload
|
||||
(and load-file-name
|
||||
(boundp 'custom-theme-load-path)
|
||||
(add-to-list 'custom-theme-load-path
|
||||
(file-name-as-directory (file-name-directory load-file-name))))
|
||||
|
||||
(provide-theme 'camm4)
|
||||
|
||||
;;; camm4-theme.el ends here
|
||||
@@ -0,0 +1,152 @@
|
||||
;;; camm4-theme.el --- A light theme based on the camm4 palette -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||
|
||||
(deftheme camm4
|
||||
"Light theme with a calm, readable palette.
|
||||
Core colours: blues (005FDB, 3B82F6, 007A8A, 40B7BF) and magenta (8A35B8, D33682).")
|
||||
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
;; Basic palette
|
||||
(camm4-bg "#fefcff")
|
||||
(camm4-fg "#101010")
|
||||
(camm4-cursor "#f04ceb")
|
||||
;; ANSI colours (index 01-16)
|
||||
(camm4-black "#E6EEFF") ; 01 – very light blueish grey
|
||||
(camm4-red "#C82829") ; 02
|
||||
(camm4-green "#419722") ; 03
|
||||
(camm4-yellow "#F48925") ; 04
|
||||
(camm4-blue "#005FDB") ; 05 – core blue
|
||||
(camm4-magenta "#EF89DF") ; 06 – core purple
|
||||
(camm4-cyan "#007A8A") ; 07 – core teal/blue
|
||||
(camm4-white "#4D4D4C") ; 08 – dark grey
|
||||
(camm4-brblack "#e2ecff") ; 09
|
||||
(camm4-brred "#E53935") ; 10
|
||||
(camm4-brgreen "#22A653") ; 11
|
||||
(camm4-bryellow "#FFA200") ; 12
|
||||
(camm4-brblue "#3B82F6") ; 13 – core bright blue
|
||||
(camm4-brmagenta "#D33682") ; 14 – core bright magenta
|
||||
(camm4-brcyan "#40B7BF") ; 15 – core bright teal
|
||||
(camm4-brwhite "#1D1F21")) ; 16 – near black
|
||||
|
||||
(custom-theme-set-faces
|
||||
'camm4
|
||||
;; Basic faces
|
||||
`(default ((,class (:background ,camm4-bg :foreground ,camm4-fg))))
|
||||
`(cursor ((,class (:background ,camm4-cursor))))
|
||||
`(fringe ((,class (:background ,camm4-bg :foreground ,camm4-white))))
|
||||
`(region ((,class (:background ,camm4-brblack :foreground ,camm4-fg))))
|
||||
`(highlight ((,class (:background ,camm4-brblack))))
|
||||
`(hl-line ((,class (:background ,camm4-brblack))))
|
||||
`(success ((,class (:foreground ,camm4-brgreen))))
|
||||
`(warning ((,class (:foreground ,camm4-bryellow))))
|
||||
`(error ((,class (:foreground ,camm4-brred :weight bold))))
|
||||
`(link ((,class (:foreground ,camm4-blue :underline t))))
|
||||
`(link-visited ((,class (:foreground ,camm4-magenta :underline t))))
|
||||
|
||||
;; Font lock (syntax highlighting)
|
||||
`(font-lock-builtin-face ((,class (:foreground ,camm4-cyan))))
|
||||
`(font-lock-comment-face ((,class (:foreground ,camm4-white :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((,class (:inherit font-lock-comment-face))))
|
||||
`(font-lock-constant-face ((,class (:foreground ,camm4-brblue))))
|
||||
`(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,camm4-green))))
|
||||
`(font-lock-function-name-face ((,class (:foreground ,camm4-brmagenta :weight bold))))
|
||||
`(font-lock-keyword-face ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(font-lock-negation-char-face ((,class (:foreground ,camm4-red))))
|
||||
`(font-lock-preprocessor-face ((,class (:foreground ,camm4-cyan))))
|
||||
`(font-lock-regexp-grouping-backslash ((,class (:foreground ,camm4-yellow))))
|
||||
`(font-lock-regexp-grouping-construct ((,class (:foreground ,camm4-red))))
|
||||
`(font-lock-string-face ((,class (:foreground ,camm4-red :weight semi-light))))
|
||||
`(font-lock-type-face ((,class (:foreground ,camm4-brcyan :weight normal))))
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,camm4-magenta))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,camm4-brred :weight bold))))
|
||||
|
||||
;; Mode line
|
||||
`(mode-line ((,class (:background ,camm4-black :foreground ,camm4-fg :box (:line-width 1 :color ,camm4-white)))))
|
||||
`(mode-line-inactive ((,class (:background ,camm4-brblack :foreground ,camm4-white :box (:line-width 1 :color ,camm4-brblack)))))
|
||||
`(mode-line-buffer-id ((,class (:weight bold :foreground ,camm4-brblue))))
|
||||
`(mode-line-emphasis ((,class (:weight bold))))
|
||||
`(mode-line-highlight ((,class (:box (:line-width 1 :color ,camm4-brblue)))))
|
||||
|
||||
;; Minibuffer, completion, etc.
|
||||
`(minibuffer-prompt ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(completions-common-part ((,class (:foreground ,camm4-fg))))
|
||||
`(completions-first-difference ((,class (:foreground ,camm4-brred :weight bold))))
|
||||
|
||||
;; Search
|
||||
`(isearch ((,class (:background ,camm4-bryellow :foreground ,camm4-fg))))
|
||||
`(isearch-fail ((,class (:background ,camm4-red :foreground ,camm4-bg))))
|
||||
`(lazy-highlight ((,class (:background ,camm4-yellow :foreground ,camm4-fg :underline t))))
|
||||
|
||||
;; Line numbers
|
||||
`(line-number ((,class (:foreground ,camm4-white :background ,camm4-bg))))
|
||||
`(line-number-current-line ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack))))
|
||||
|
||||
;; Dired
|
||||
`(dired-header ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(dired-directory ((,class (:foreground ,camm4-brblue :weight bold))))
|
||||
`(dired-symlink ((,class (:foreground ,camm4-cyan :slant italic))))
|
||||
|
||||
;; Org mode
|
||||
`(org-level-1 ((,class (:foreground ,camm4-brblue :weight bold :height 1.2))))
|
||||
`(org-level-2 ((,class (:foreground ,camm4-blue :weight bold :height 1.1))))
|
||||
`(org-level-3 ((,class (:foreground ,camm4-cyan :weight bold))))
|
||||
`(org-level-4 ((,class (:foreground ,camm4-magenta :weight bold))))
|
||||
`(org-level-5 ((,class (:foreground ,camm4-brcyan :weight bold))))
|
||||
`(org-level-6 ((,class (:foreground ,camm4-brmagenta :weight bold))))
|
||||
`(org-todo ((,class (:foreground ,camm4-brred :weight bold :box t))))
|
||||
`(org-done ((,class (:foreground ,camm4-brgreen :weight bold :box t))))
|
||||
`(org-date ((,class (:foreground ,camm4-brblue :underline t))))
|
||||
`(org-link ((,class (:foreground ,camm4-blue :underline t))))
|
||||
`(org-tag ((,class (:foreground ,camm4-white :weight normal))))
|
||||
|
||||
;; Markdown
|
||||
`(markdown-header-face-1 ((,class (:inherit org-level-1))))
|
||||
`(markdown-header-face-2 ((,class (:inherit org-level-2))))
|
||||
`(markdown-header-face-3 ((,class (:inherit org-level-3))))
|
||||
`(markdown-link-face ((,class (:inherit link))))
|
||||
`(markdown-url-face ((,class (:inherit link))))
|
||||
|
||||
;; Magit
|
||||
`(magit-branch-local ((,class (:foreground ,camm4-brblue :weight bold))))
|
||||
`(magit-branch-remote ((,class (:foreground ,camm4-cyan :weight bold))))
|
||||
`(magit-tag ((,class (:foreground ,camm4-bryellow :weight bold))))
|
||||
`(magit-hash ((,class (:foreground ,camm4-white))))
|
||||
`(magit-diff-added ((,class (:foreground ,camm4-brgreen))))
|
||||
`(magit-diff-removed ((,class (:foreground ,camm4-brred))))
|
||||
`(magit-diff-context ((,class (:foreground ,camm4-white))))
|
||||
`(magit-section-heading ((,class (:foreground ,camm4-blue :weight bold :background ,camm4-brblack))))
|
||||
`(magit-section-highlight ((,class (:background ,camm4-brblack))))
|
||||
|
||||
;; Tree‑sitter (if you use it)
|
||||
`(tree-sitter-hl-face:function.call ((,class (:foreground ,camm4-brmagenta))))
|
||||
`(tree-sitter-hl-face:function.builtin ((,class (:foreground ,camm4-cyan))))
|
||||
`(tree-sitter-hl-face:variable.builtin ((,class (:foreground ,camm4-magenta))))
|
||||
`(tree-sitter-hl-face:type ((,class (:foreground ,camm4-brcyan))))
|
||||
`(tree-sitter-hl-face:constant.builtin ((,class (:foreground ,camm4-brblue))))
|
||||
|
||||
;; LSP / Flycheck
|
||||
`(flycheck-error ((,class (:underline (:style wave :color ,camm4-brred)))))
|
||||
`(flycheck-warning ((,class (:underline (:style wave :color ,camm4-bryellow)))))
|
||||
`(flycheck-info ((,class (:underline (:style wave :color ,camm4-brblue)))))
|
||||
`(lsp-face-highlight-textual ((,class (:background ,camm4-brblack :underline t))))
|
||||
|
||||
;; Extra
|
||||
`(show-paren-match ((,class (:background ,camm4-brcyan :foreground ,camm4-bg :weight bold))))
|
||||
`(show-paren-mismatch ((,class (:background ,camm4-brred :foreground ,camm4-bg :weight bold))))
|
||||
`(match ((,class (:background ,camm4-yellow :foreground ,camm4-fg))))
|
||||
`(shadow ((,class (:foreground ,camm4-white))))
|
||||
`(secondary-selection ((,class (:background ,camm4-brblack))))
|
||||
`(trailing-whitespace ((,class (:background ,camm4-brred))))
|
||||
`(vertical-border ((,class (:foreground ,camm4-white))))
|
||||
`(widget-button ((,class (:foreground ,camm4-blue :weight bold))))
|
||||
`(widget-field ((,class (:background ,camm4-brblack))))
|
||||
))
|
||||
|
||||
;;;###autoload
|
||||
(and load-file-name
|
||||
(boundp 'custom-theme-load-path)
|
||||
(add-to-list 'custom-theme-load-path
|
||||
(file-name-as-directory (file-name-directory load-file-name))))
|
||||
|
||||
(provide-theme 'camm4)
|
||||
|
||||
;;; camm4-theme.el ends here
|
||||
@@ -0,0 +1,167 @@
|
||||
;;; cutar-theme.el --- A high-contrast dark theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||
(deftheme cutar
|
||||
"High-contrast dark theme with blue/pink accents.
|
||||
Optimized for syntax highlighting and UI clarity based on the Custom Terminal palette.")
|
||||
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
|
||||
;; --- BASE UI ---
|
||||
(bg "#fefcff") ;; Default background
|
||||
(fg "#101010") ;; Default foreground
|
||||
(cursor "#fefcff") ;; Cursor bg (matches `bg`; visibility depends on `cursor-type`)
|
||||
(selection "#6ECFD5") ;; Region/selected text background
|
||||
(selection-fg "#101010") ;; Region/selected text foreground
|
||||
|
||||
;; --- ANSI NORMAL ---
|
||||
(dark_blue "#0094E7") ;; Fringe, minibuffer prompts, function names, line numbers, inactive tab borders
|
||||
(red "#C82829") ;; Errors, negation chars, failed search (`isearch-fail`)
|
||||
(medium_blue "#005FDB") ;; Keywords, active hyperlinks
|
||||
(orange "#DD7050") ;; Constants, lazy search highlights, debug indicators
|
||||
(magenta "#D536AD") ;; Strings, variables, UI dividers (`vertical-border`)
|
||||
(green "#419722") ;; Docstrings, comment delimiters, info/status indicators
|
||||
(cyan "#409FAF") ;; Types/Classes
|
||||
(purple "#8a35b8") ;; Built-ins, visited links
|
||||
|
||||
;; --- ANSI BRIGHT ---
|
||||
(light_blue "#82D3FF") ;; Inactive mode-line/tabs background (shares hex with `selection`)
|
||||
(light_red "#FC7070") ;; Warnings, builtin, regex constructs
|
||||
(accent_blue "#71A1F3") ;; (Currently unused in faces)
|
||||
(yellow "#FFB633") ;; Active search (`isearch`), regex backslashes, modified buffer status, warnings
|
||||
(accent_pink "#EF89DF") ;; Active mode-line/tabs, modeline accent bar
|
||||
(bright_green "#19BD56") ;; (Currently unused in faces)
|
||||
(bright_cyan "#9EDEEE") ;; hl-line hl-tab
|
||||
(light_purple "#B197FC")) ;; (Currently unused in faces)
|
||||
|
||||
(custom-theme-set-faces
|
||||
'cutar
|
||||
|
||||
;; --- CORE UI ---
|
||||
`(default ((,class (:background ,bg :foreground ,fg))))
|
||||
`(cursor ((,class (:background ,bg :foreground ,bg))))
|
||||
`(fringe ((,class (:background ,bg :foreground ,dark_blue))))
|
||||
`(region ((,class (:background ,selection :foreground ,selection-fg))))
|
||||
`(highlight ((,class (:background ,light_blue :foreground ,bg))))
|
||||
`(hl-line ((,class (:background ,bright_cyan :extend t)))) ;; Using dark_blue for line highlight dimness
|
||||
`(link ((,class (:foreground ,medium_blue :underline t))))
|
||||
`(link-visited ((,class (:foreground ,purple :underline t))))
|
||||
`(minibuffer-prompt ((,class (:foreground ,dark_blue :weight bold))))
|
||||
`(vertical-border ((,class (:foreground ,magenta)))) ;; "UI dividers"
|
||||
|
||||
;; --- SYNTAX HIGHLIGHTING (Font Lock) ---
|
||||
;; Comments: ansi_0 (Dark Blue)
|
||||
`(font-lock-comment-face ((,class (:foreground ,green :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((,class (:foreground ,bright_green :slant italic))))
|
||||
|
||||
;; Keywords: ansi_7 (Purple)
|
||||
`(font-lock-keyword-face ((,class (:foreground ,medium_blue :weight bold))))
|
||||
|
||||
;; Strings: ansi_4 (Magenta)
|
||||
`(font-lock-string-face ((,class (:foreground ,magenta))))
|
||||
`(font-lock-regexp-grouping-backslash ((,class (:foreground ,yellow))))
|
||||
`(font-lock-regexp-grouping-construct ((,class (:foreground ,light_red))))
|
||||
|
||||
;; Functions: Using Accent Pink (ansi_12) for better visibility as "Primary Accent"
|
||||
`(font-lock-function-name-face ((,class (:foreground ,dark_blue :weight bold))))
|
||||
|
||||
;; Variables: Default foreground or slightly dimmed
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,medium_blue))))
|
||||
|
||||
;; Types: ansi_6 (Cyan)
|
||||
`(font-lock-type-face ((,class (:foreground ,cyan))))
|
||||
|
||||
;; Constants: ansi_3 (Orange)
|
||||
`(font-lock-constant-face ((,class (:foreground ,orange))))
|
||||
`(font-lock-builtin-face ((,class (:foreground ,light_red)))) ;; Same as keywords usually
|
||||
|
||||
;; Doc & Warnings
|
||||
`(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,green))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,light_red :weight bold))))
|
||||
`(font-lock-negation-char-face ((,class (:foreground ,red))))
|
||||
|
||||
;; --- MODELINE (Tabs UI Mapping) ---
|
||||
;; Active Tab: Accent Pink
|
||||
`(mode-line ((,class (:background ,accent_pink :foreground ,bg))))
|
||||
;; Inactive Tab: Light Blue
|
||||
`(mode-line-inactive ((,class (:background ,light_blue :foreground ,fg :box (:line-width 1 :color ,accent_blue)))))
|
||||
`(mode-line-buffer-id ((,class (:weight bold))))
|
||||
`(mode-line-highlight ((,class (:box (:line-width 2 :color ,fg)))))
|
||||
|
||||
;; --- SEARCH & ISEARCH ---
|
||||
;; Search Matches: Yellow (ansi_11)
|
||||
`(isearch ((,class (:background ,yellow :foreground ,bg :weight bold))))
|
||||
`(isearch-fail ((,class (:background ,red :foreground ,fg))))
|
||||
`(lazy-highlight ((,class (:background ,orange :foreground ,bg))))
|
||||
|
||||
;; --- LINE NUMBERS ---
|
||||
`(line-number ((,class (:foreground ,light_blue :background ,fg))))
|
||||
`(line-number-current-line ((,class (:foreground ,bg :background ,accent_pink :weight bold))))
|
||||
|
||||
;; --- DIY (Doom Emacs Specifics) ---
|
||||
`(doom-modeline-bar ((,class (:background ,accent_pink :foreground ,fg))))
|
||||
`(doom-modeline-buffer-file ((,class (:foreground ,fg :weight bold))))
|
||||
`(doom-modeline-buffer-path ((,class (:foreground ,fg :weight bold))))
|
||||
`(doom-modeline-buffer-modified ((,class (:foreground ,yellow :weight bold))))
|
||||
`(doom-modeline-debug ((,class (:foreground ,orange))))
|
||||
`(doom-modeline-info ((,class (:foreground ,green))))
|
||||
`(doom-modeline-warning ((,class (:foreground ,yellow))))
|
||||
`(doom-modeline-error ((,class (:foreground ,red))))
|
||||
|
||||
;; --- ORG MODE ---
|
||||
`(org-level-1 ((,class (:foreground ,accent_pink :weight bold :height 1.2))))
|
||||
`(org-level-2 ((,class (:foreground ,accent_blue :weight bold :height 1.1))))
|
||||
`(org-level-3 ((,class (:foreground ,bright_green :weight bold))))
|
||||
`(org-level-4 ((,class (:foreground ,bright_cyan :weight bold))))
|
||||
`(org-level-5 ((,class (:foreground ,light_purple :weight bold))))
|
||||
`(org-todo ((,class (:foreground ,light_red :weight bold :box t))))
|
||||
`(org-done ((,class (:foreground ,bright_green :weight bold :box t))))
|
||||
`(org-date ((,class (:foreground ,medium_blue))))
|
||||
`(org-link ((,class (:foreground ,light_purple :underline t)))) ;; "markdown links" -> light_purple
|
||||
`(org-code ((,class (:foreground ,orange :background ,bg))))
|
||||
`(org-block ((,class (:background ,bg :foreground ,fg :extend t))))
|
||||
`(org-block-begin-line ((,class (:foreground ,dark_blue :background ,bg :extend t))))
|
||||
|
||||
;; --- MAGIT / GIT ---
|
||||
`(magit-branch-local ((,class (:foreground ,cyan :weight bold))))
|
||||
`(magit-branch-remote ((,class (:foreground ,green :weight bold))))
|
||||
`(magit-hash ((,class (:foreground ,dark_blue))))
|
||||
`(magit-item-highlight ((,class (:background ,selection :foreground ,selection-fg))))
|
||||
`(magit-diff-added ((,class (:foreground ,bright_green :background unspecified))))
|
||||
`(magit-diff-removed ((,class (:foreground ,light_red :background unspecified))))
|
||||
`(magit-diff-context-highlight ((,class (:background ,dark_blue :foreground ,fg))))
|
||||
`(magit-section-heading ((,class (:foreground ,bright_cyan :weight bold :underline t))))
|
||||
|
||||
;; --- TREE-SITTER ---
|
||||
`(tree-sitter-hl-face:function.call ((,class (:foreground ,accent_pink))))
|
||||
`(tree-sitter-hl-face:method.call ((,class (:foreground ,accent_pink))))
|
||||
`(tree-sitter-hl-face:type ((,class (:foreground ,cyan))))
|
||||
`(tree-sitter-hl-face:property ((,class (:foreground ,light_blue))))
|
||||
`(tree-sitter-hl-face:parameter ((,class (:foreground ,orange))))
|
||||
`(tree-sitter-hl-face:escape ((,class (:foreground ,light_red))))
|
||||
|
||||
;; --- FLYCHECK / LSP ---
|
||||
`(flycheck-error ((,class (:underline (:style wave :color ,red)))))
|
||||
`(flycheck-warning ((,class (:underline (:style wave :color ,orange)))))
|
||||
`(flycheck-info ((,class (:underline (:style wave :color ,medium_blue)))))
|
||||
`(lsp-face-highlight-textual ((,class (:background ,selection :foreground ,selection-fg))))
|
||||
|
||||
;; --- DASHBOARD ---
|
||||
`(doom-dashboard-menu-desc ((,class (:foreground ,accent_blue))))
|
||||
`(doom-dashboard-banner ((,class (:foreground ,accent_pink))))
|
||||
|
||||
;; --- MISC ---
|
||||
`(show-paren-match ((,class (:background ,accent_blue :foreground ,bg :weight bold))))
|
||||
`(show-paren-mismatch ((,class (:background ,red :foreground ,fg :weight bold))))
|
||||
`(success ((,class (:foreground ,green))))
|
||||
`(error ((,class (:foreground ,red :weight bold))))
|
||||
`(warning ((,class (:foreground ,orange))))
|
||||
`(header-line ((,class (:background ,dark_blue :foreground ,fg))))))
|
||||
|
||||
;;;###autoload
|
||||
(and load-file-name
|
||||
(boundp 'custom-theme-load-path)
|
||||
(add-to-list 'custom-theme-load-path
|
||||
(file-name-as-directory (file-name-directory load-file-name))))
|
||||
|
||||
(provide-theme 'cutar)
|
||||
|
||||
;;; cutar-theme.el ends here
|
||||
@@ -0,0 +1,167 @@
|
||||
;;; cutar-theme.el --- A high-contrast dark theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||
(deftheme cutarv32
|
||||
"High-contrast dark theme with blue/pink accents.
|
||||
Optimized for syntax highlighting and UI clarity based on the Custom Terminal palette.")
|
||||
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
|
||||
;; --- BASE UI ---
|
||||
(bg "#f8f8ff") ;; Default background
|
||||
(fg "#000000") ;; Default foreground
|
||||
(cursor "#f8f8ff") ;; Cursor bg (matches `bg`; visibility depends on `cursor-type`)
|
||||
(selection "#f0b94a") ;; Region/selected text background
|
||||
;;(selection-fg "#000000") ;; Region/selected text foreground
|
||||
|
||||
;; --- ANSI NORMAL ---
|
||||
(dark_blue "#007cbf" ) ;; Fringe, minibuffer prompts, function names, line numbers, inactive tab borders
|
||||
(red "#cf3f29" ) ;; Errors, negation chars, failed search (`isearch-fail`)
|
||||
(medium_blue "#2374de" ) ;; Keywords, active hyperlinks
|
||||
(orange "#c76e2a" ) ;; Constants, lazy search highlights, debug indicators
|
||||
(magenta "#b05197" ) ;; Strings, variables, UI dividers (`vertical-border`)
|
||||
(green "#429e66" ) ;; Docstrings, comment delimiters, info/status indicators
|
||||
(cyan "#129cc9" ) ;; Types/Classes
|
||||
(purple "#a64dd6" ) ;; Built-ins, visited links
|
||||
|
||||
;; --- ANSI BRIGHT ---
|
||||
(light_blue "#7cc9f2") ;; Inactive mode-line/tabs background (shares hex with `selection`)
|
||||
(light_red "#f07b69") ;; Warnings, builtin, regex constructs
|
||||
(accent_blue "#6f9ff2") ;; (Currently unused in faces)
|
||||
(yellow "#f0b94a") ;; Active search (`isearch`), regex backslashes, modified buffer status, warnings
|
||||
(accent_pink "#EF89DF") ;; Active mode-line/tabs, modeline accent bar
|
||||
(bright_green "#2cd45c") ;; (Currently unused in faces)
|
||||
(bright_cyan "#17dbe6") ;; hl-line hl-tab
|
||||
(light_purple "#c8a0f2")) ;; (Currently unused in faces)
|
||||
|
||||
(custom-theme-set-faces
|
||||
'cutarv32
|
||||
|
||||
;; --- CORE UI ---
|
||||
`(default ((,class (:background ,bg :foreground ,fg))))
|
||||
`(cursor ((,class (:background ,bg :foreground ,bg))))
|
||||
`(fringe ((,class (:background ,bg :foreground ,dark_blue))))
|
||||
`(region ((,class (:background ,selection))))
|
||||
`(highlight ((,class (:background ,light_blue :foreground ,bg))))
|
||||
`(hl-line ((,class (:background ,light_purple :extend t)))) ;; Using dark_blue for line highlight dimness
|
||||
`(link ((,class (:foreground ,medium_blue :underline t))))
|
||||
`(link-visited ((,class (:foreground ,purple :underline t))))
|
||||
`(minibuffer-prompt ((,class (:foreground ,dark_blue :weight bold))))
|
||||
`(vertical-border ((,class (:foreground ,magenta)))) ;; "UI dividers"
|
||||
|
||||
;; --- SYNTAX HIGHLIGHTING (Font Lock) ---
|
||||
;; Comments: ansi_0 (Dark Blue)
|
||||
`(font-lock-comment-face ((,class (:foreground ,green :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((,class (:foreground ,bright_green :slant italic))))
|
||||
|
||||
;; Keywords: ansi_7 (Purple)
|
||||
`(font-lock-keyword-face ((,class (:foreground ,medium_blue :weight bold))))
|
||||
|
||||
;; Strings: ansi_4 (Magenta)
|
||||
`(font-lock-string-face ((,class (:foreground ,magenta))))
|
||||
`(font-lock-regexp-grouping-backslash ((,class (:foreground ,yellow))))
|
||||
`(font-lock-regexp-grouping-construct ((,class (:foreground ,light_red))))
|
||||
|
||||
;; Functions: Using Accent Pink (ansi_12) for better visibility as "Primary Accent"
|
||||
`(font-lock-function-name-face ((,class (:foreground ,dark_blue :weight bold))))
|
||||
|
||||
;; Variables: Default foreground or slightly dimmed
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,medium_blue))))
|
||||
|
||||
;; Types: ansi_6 (Cyan)
|
||||
`(font-lock-type-face ((,class (:foreground ,purple))))
|
||||
|
||||
;; Constants: ansi_3 (Orange)
|
||||
`(font-lock-constant-face ((,class (:foreground ,orange))))
|
||||
`(font-lock-builtin-face ((,class (:foreground ,light_red)))) ;; Same as keywords usually
|
||||
|
||||
;; Doc & Warnings
|
||||
`(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,green))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,light_red :weight bold))))
|
||||
`(font-lock-negation-char-face ((,class (:foreground ,red))))
|
||||
|
||||
;; --- MODELINE (Tabs UI Mapping) ---
|
||||
;; Active Tab: Accent Pink
|
||||
`(mode-line ((,class (:background ,accent_pink :foreground ,bg))))
|
||||
;; Inactive Tab: Light Blue
|
||||
`(mode-line-inactive ((,class (:background ,light_blue :foreground ,fg :box (:line-width 1 :color ,accent_blue)))))
|
||||
`(mode-line-buffer-id ((,class (:weight bold))))
|
||||
`(mode-line-highlight ((,class (:box (:line-width 2 :color ,fg)))))
|
||||
|
||||
;; --- SEARCH & ISEARCH ---
|
||||
;; Search Matches: Yellow (ansi_11)
|
||||
`(isearch ((,class (:background ,yellow :foreground ,bg :weight bold))))
|
||||
`(isearch-fail ((,class (:background ,red :foreground ,fg))))
|
||||
`(lazy-highlight ((,class (:background ,orange :foreground ,bg))))
|
||||
|
||||
;; --- LINE NUMBERS ---
|
||||
`(line-number ((,class (:foreground ,light_blue :background ,fg))))
|
||||
`(line-number-current-line ((,class (:foreground ,bg :background ,accent_pink :weight bold))))
|
||||
|
||||
;; --- DIY (Doom Emacs Specifics) ---
|
||||
`(doom-modeline-bar ((,class (:background ,accent_pink :foreground ,fg))))
|
||||
`(doom-modeline-buffer-file ((,class (:foreground ,fg :weight bold))))
|
||||
`(doom-modeline-buffer-path ((,class (:foreground ,fg :weight bold))))
|
||||
`(doom-modeline-buffer-modified ((,class (:foreground ,yellow :weight bold))))
|
||||
`(doom-modeline-debug ((,class (:foreground ,orange))))
|
||||
`(doom-modeline-info ((,class (:foreground ,green))))
|
||||
`(doom-modeline-warning ((,class (:foreground ,yellow))))
|
||||
`(doom-modeline-error ((,class (:foreground ,red))))
|
||||
|
||||
;; --- ORG MODE ---
|
||||
`(org-level-1 ((,class (:foreground ,accent_pink :weight bold :height 1.2))))
|
||||
`(org-level-2 ((,class (:foreground ,accent_blue :weight bold :height 1.1))))
|
||||
`(org-level-3 ((,class (:foreground ,bright_green :weight bold))))
|
||||
`(org-level-4 ((,class (:foreground ,bright_cyan :weight bold))))
|
||||
`(org-level-5 ((,class (:foreground ,light_purple :weight bold))))
|
||||
`(org-todo ((,class (:foreground ,light_red :weight bold :box t))))
|
||||
`(org-done ((,class (:foreground ,bright_green :weight bold :box t))))
|
||||
`(org-date ((,class (:foreground ,medium_blue))))
|
||||
`(org-link ((,class (:foreground ,light_purple :underline t)))) ;; "markdown links" -> light_purple
|
||||
`(org-code ((,class (:foreground ,orange :background ,bg))))
|
||||
`(org-block ((,class (:background ,bg :foreground ,fg :extend t))))
|
||||
`(org-block-begin-line ((,class (:foreground ,dark_blue :background ,bg :extend t))))
|
||||
|
||||
;; --- MAGIT / GIT ---
|
||||
`(magit-branch-local ((,class (:foreground ,cyan :weight bold))))
|
||||
`(magit-branch-remote ((,class (:foreground ,green :weight bold))))
|
||||
`(magit-hash ((,class (:foreground ,dark_blue))))
|
||||
`(magit-item-highlight ((,class (:background ,selection))))
|
||||
`(magit-diff-added ((,class (:foreground ,bright_green :background unspecified))))
|
||||
`(magit-diff-removed ((,class (:foreground ,light_red :background unspecified))))
|
||||
`(magit-diff-context-highlight ((,class (:background ,dark_blue :foreground ,fg))))
|
||||
`(magit-section-heading ((,class (:foreground ,bright_cyan :weight bold :underline t))))
|
||||
|
||||
;; --- TREE-SITTER ---
|
||||
`(tree-sitter-hl-face:function.call ((,class (:foreground ,accent_pink))))
|
||||
`(tree-sitter-hl-face:method.call ((,class (:foreground ,accent_pink))))
|
||||
`(tree-sitter-hl-face:type ((,class (:foreground ,cyan))))
|
||||
`(tree-sitter-hl-face:property ((,class (:foreground ,light_blue))))
|
||||
`(tree-sitter-hl-face:parameter ((,class (:foreground ,orange))))
|
||||
`(tree-sitter-hl-face:escape ((,class (:foreground ,light_red))))
|
||||
|
||||
;; --- FLYCHECK / LSP ---
|
||||
`(flycheck-error ((,class (:underline (:style wave :color ,red)))))
|
||||
`(flycheck-warning ((,class (:underline (:style wave :color ,orange)))))
|
||||
`(flycheck-info ((,class (:underline (:style wave :color ,medium_blue)))))
|
||||
`(lsp-face-highlight-textual ((,class (:background ,selection))))
|
||||
|
||||
;; --- DASHBOARD ---
|
||||
`(doom-dashboard-menu-desc ((,class (:foreground ,accent_blue))))
|
||||
`(doom-dashboard-banner ((,class (:foreground ,accent_pink))))
|
||||
|
||||
;; --- MISC ---
|
||||
`(show-paren-match ((,class (:background ,accent_blue :foreground ,bg :weight bold))))
|
||||
`(show-paren-mismatch ((,class (:background ,red :foreground ,fg :weight bold))))
|
||||
`(success ((,class (:foreground ,green))))
|
||||
`(error ((,class (:foreground ,red :weight bold))))
|
||||
`(warning ((,class (:foreground ,orange))))
|
||||
`(header-line ((,class (:background ,dark_blue :foreground ,fg))))))
|
||||
|
||||
;;;###autoload
|
||||
(and load-file-name
|
||||
(boundp 'custom-theme-load-path)
|
||||
(add-to-list 'custom-theme-load-path
|
||||
(file-name-as-directory (file-name-directory load-file-name))))
|
||||
|
||||
(provide-theme 'cutarv32)
|
||||
|
||||
;;; cutarv32-theme.el ends here
|
||||
@@ -0,0 +1,167 @@
|
||||
;;; cutarv32_dark-theme.el --- A high-contrast dark theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||
(deftheme cutarv32_dark
|
||||
"High-contrast dark theme with blue/pink accents.
|
||||
Optimized for syntax highlighting and UI clarity based on the Custom Terminal palette.")
|
||||
|
||||
(let ((class '((class color) (min-colors 89)))
|
||||
|
||||
;; --- BASE UI ---
|
||||
(bg "#0d0d0d") ;; Default background
|
||||
(fg "#f8f8ff") ;; Default foreground
|
||||
(cursor "#f8f8ff") ;; Cursor bg (matches `bg`; visibility depends on `cursor-type`)
|
||||
(selection "#f0b94a") ;; Region/selected text background
|
||||
;;(selection-fg "#000000") ;; Region/selected text foreground
|
||||
|
||||
;; --- ANSI NORMAL ---
|
||||
(dark_blue "#007cbf" ) ;; Fringe, minibuffer prompts, function names, line numbers, inactive tab borders
|
||||
(red "#cf3f29" ) ;; Errors, negation chars, failed search (`isearch-fail`)
|
||||
(medium_blue "#2374de" ) ;; Keywords, active hyperlinks
|
||||
(orange "#c76e2a" ) ;; Constants, lazy search highlights, debug indicators
|
||||
(magenta "#b05197" ) ;; Strings, variables, UI dividers (`vertical-border`)
|
||||
(green "#429e66" ) ;; Docstrings, comment delimiters, info/status indicators
|
||||
(cyan "#129cc9" ) ;; Types/Classes
|
||||
(purple "#a64dd6" ) ;; Built-ins, visited links
|
||||
|
||||
;; --- ANSI BRIGHT ---
|
||||
(light_blue "#7cc9f2") ;; Inactive mode-line/tabs background (shares hex with `selection`)
|
||||
(light_red "#f07b69") ;; Warnings, builtin, regex constructs
|
||||
(accent_blue "#6f9ff2") ;; (Currently unused in faces)
|
||||
(yellow "#f0b94a") ;; Active search (`isearch`), regex backslashes, modified buffer status, warnings
|
||||
(accent_pink "#EF89DF") ;; Active mode-line/tabs, modeline accent bar
|
||||
(bright_green "#2cd45c") ;; (Currently unused in faces)
|
||||
(bright_cyan "#17dbe6") ;; hl-line hl-tab
|
||||
(light_purple "#c8a0f2")) ;; (Currently unused in faces)
|
||||
|
||||
(custom-theme-set-faces
|
||||
'cutarv32_dark
|
||||
|
||||
;; --- CORE UI ---
|
||||
`(default ((,class (:background ,bg :foreground ,fg))))
|
||||
`(cursor ((,class (:background ,bg :foreground ,bg))))
|
||||
`(fringe ((,class (:background ,bg :foreground ,dark_blue))))
|
||||
`(region ((,class (:background ,selection))))
|
||||
`(highlight ((,class (:background ,light_blue :foreground ,bg))))
|
||||
`(hl-line ((,class (:background ,light_purple :extend t)))) ;; Using dark_blue for line highlight dimness
|
||||
`(link ((,class (:foreground ,medium_blue :underline t))))
|
||||
`(link-visited ((,class (:foreground ,purple :underline t))))
|
||||
`(minibuffer-prompt ((,class (:foreground ,dark_blue :weight bold))))
|
||||
`(vertical-border ((,class (:foreground ,magenta)))) ;; "UI dividers"
|
||||
|
||||
;; --- SYNTAX HIGHLIGHTING (Font Lock) ---
|
||||
;; Comments: ansi_0 (Dark Blue)
|
||||
`(font-lock-comment-face ((,class (:foreground ,green :slant italic))))
|
||||
`(font-lock-comment-delimiter-face ((,class (:foreground ,bright_green :slant italic))))
|
||||
|
||||
;; Keywords: ansi_7 (Purple)
|
||||
`(font-lock-keyword-face ((,class (:foreground ,medium_blue :weight bold))))
|
||||
|
||||
;; Strings: ansi_4 (Magenta)
|
||||
`(font-lock-string-face ((,class (:foreground ,magenta))))
|
||||
`(font-lock-regexp-grouping-backslash ((,class (:foreground ,yellow))))
|
||||
`(font-lock-regexp-grouping-construct ((,class (:foreground ,light_red))))
|
||||
|
||||
;; Functions: Using Accent Pink (ansi_12) for better visibility as "Primary Accent"
|
||||
`(font-lock-function-name-face ((,class (:foreground ,dark_blue :weight bold))))
|
||||
|
||||
;; Variables: Default foreground or slightly dimmed
|
||||
`(font-lock-variable-name-face ((,class (:foreground ,medium_blue))))
|
||||
|
||||
;; Types: ansi_6 (Cyan)
|
||||
`(font-lock-type-face ((,class (:foreground ,purple))))
|
||||
|
||||
;; Constants: ansi_3 (Orange)
|
||||
`(font-lock-constant-face ((,class (:foreground ,orange))))
|
||||
`(font-lock-builtin-face ((,class (:foreground ,light_red)))) ;; Same as keywords usually
|
||||
|
||||
;; Doc & Warnings
|
||||
`(font-lock-doc-face ((,class (:inherit font-lock-comment-face :foreground ,green))))
|
||||
`(font-lock-warning-face ((,class (:foreground ,light_red :weight bold))))
|
||||
`(font-lock-negation-char-face ((,class (:foreground ,red))))
|
||||
|
||||
;; --- MODELINE (Tabs UI Mapping) ---
|
||||
;; Active Tab: Accent Pink
|
||||
`(mode-line ((,class (:background ,accent_pink :foreground ,bg))))
|
||||
;; Inactive Tab: Light Blue
|
||||
`(mode-line-inactive ((,class (:background ,light_blue :foreground ,fg :box (:line-width 1 :color ,accent_blue)))))
|
||||
`(mode-line-buffer-id ((,class (:weight bold))))
|
||||
`(mode-line-highlight ((,class (:box (:line-width 2 :color ,fg)))))
|
||||
|
||||
;; --- SEARCH & ISEARCH ---
|
||||
;; Search Matches: Yellow (ansi_11)
|
||||
`(isearch ((,class (:background ,yellow :foreground ,bg :weight bold))))
|
||||
`(isearch-fail ((,class (:background ,red :foreground ,fg))))
|
||||
`(lazy-highlight ((,class (:background ,orange :foreground ,bg))))
|
||||
|
||||
;; --- LINE NUMBERS ---
|
||||
`(line-number ((,class (:foreground ,light_blue :background ,fg))))
|
||||
`(line-number-current-line ((,class (:foreground ,bg :background ,accent_pink :weight bold))))
|
||||
|
||||
;; --- DIY (Doom Emacs Specifics) ---
|
||||
`(doom-modeline-bar ((,class (:background ,accent_pink :foreground ,fg))))
|
||||
`(doom-modeline-buffer-file ((,class (:foreground ,fg :weight bold))))
|
||||
`(doom-modeline-buffer-path ((,class (:foreground ,fg :weight bold))))
|
||||
`(doom-modeline-buffer-modified ((,class (:foreground ,yellow :weight bold))))
|
||||
`(doom-modeline-debug ((,class (:foreground ,orange))))
|
||||
`(doom-modeline-info ((,class (:foreground ,green))))
|
||||
`(doom-modeline-warning ((,class (:foreground ,yellow))))
|
||||
`(doom-modeline-error ((,class (:foreground ,red))))
|
||||
|
||||
;; --- ORG MODE ---
|
||||
`(org-level-1 ((,class (:foreground ,accent_pink :weight bold :height 1.2))))
|
||||
`(org-level-2 ((,class (:foreground ,accent_blue :weight bold :height 1.1))))
|
||||
`(org-level-3 ((,class (:foreground ,bright_green :weight bold))))
|
||||
`(org-level-4 ((,class (:foreground ,bright_cyan :weight bold))))
|
||||
`(org-level-5 ((,class (:foreground ,light_purple :weight bold))))
|
||||
`(org-todo ((,class (:foreground ,light_red :weight bold :box t))))
|
||||
`(org-done ((,class (:foreground ,bright_green :weight bold :box t))))
|
||||
`(org-date ((,class (:foreground ,medium_blue))))
|
||||
`(org-link ((,class (:foreground ,light_purple :underline t)))) ;; "markdown links" -> light_purple
|
||||
`(org-code ((,class (:foreground ,orange :background ,bg))))
|
||||
`(org-block ((,class (:background ,bg :foreground ,fg :extend t))))
|
||||
`(org-block-begin-line ((,class (:foreground ,dark_blue :background ,bg :extend t))))
|
||||
|
||||
;; --- MAGIT / GIT ---
|
||||
`(magit-branch-local ((,class (:foreground ,cyan :weight bold))))
|
||||
`(magit-branch-remote ((,class (:foreground ,green :weight bold))))
|
||||
`(magit-hash ((,class (:foreground ,dark_blue))))
|
||||
`(magit-item-highlight ((,class (:background ,selection))))
|
||||
`(magit-diff-added ((,class (:foreground ,bright_green :background unspecified))))
|
||||
`(magit-diff-removed ((,class (:foreground ,light_red :background unspecified))))
|
||||
`(magit-diff-context-highlight ((,class (:background ,dark_blue :foreground ,fg))))
|
||||
`(magit-section-heading ((,class (:foreground ,bright_cyan :weight bold :underline t))))
|
||||
|
||||
;; --- TREE-SITTER ---
|
||||
`(tree-sitter-hl-face:function.call ((,class (:foreground ,accent_pink))))
|
||||
`(tree-sitter-hl-face:method.call ((,class (:foreground ,accent_pink))))
|
||||
`(tree-sitter-hl-face:type ((,class (:foreground ,cyan))))
|
||||
`(tree-sitter-hl-face:property ((,class (:foreground ,light_blue))))
|
||||
`(tree-sitter-hl-face:parameter ((,class (:foreground ,orange))))
|
||||
`(tree-sitter-hl-face:escape ((,class (:foreground ,light_red))))
|
||||
|
||||
;; --- FLYCHECK / LSP ---
|
||||
`(flycheck-error ((,class (:underline (:style wave :color ,red)))))
|
||||
`(flycheck-warning ((,class (:underline (:style wave :color ,orange)))))
|
||||
`(flycheck-info ((,class (:underline (:style wave :color ,medium_blue)))))
|
||||
`(lsp-face-highlight-textual ((,class (:background ,selection))))
|
||||
|
||||
;; --- DASHBOARD ---
|
||||
`(doom-dashboard-menu-desc ((,class (:foreground ,accent_blue))))
|
||||
`(doom-dashboard-banner ((,class (:foreground ,accent_pink))))
|
||||
|
||||
;; --- MISC ---
|
||||
`(show-paren-match ((,class (:background ,accent_blue :foreground ,bg :weight bold))))
|
||||
`(show-paren-mismatch ((,class (:background ,red :foreground ,fg :weight bold))))
|
||||
`(success ((,class (:foreground ,green))))
|
||||
`(error ((,class (:foreground ,red :weight bold))))
|
||||
`(warning ((,class (:foreground ,orange))))
|
||||
`(header-line ((,class (:background ,dark_blue :foreground ,fg))))))
|
||||
|
||||
;;;###autoload
|
||||
(and load-file-name
|
||||
(boundp 'custom-theme-load-path)
|
||||
(add-to-list 'custom-theme-load-path
|
||||
(file-name-as-directory (file-name-directory load-file-name))))
|
||||
|
||||
(provide-theme 'cutarv32_dark)
|
||||
|
||||
;;; cutarv32_dark-theme.el ends here
|
||||
Reference in New Issue
Block a user