gave up on meow / god mode, just using ';' now
This commit is contained in:
@@ -1,165 +1,259 @@
|
|||||||
;;; config.el -*- lexical-binding: t; -*-
|
;; config.el -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
;; ============================================================
|
;; ============================================================
|
||||||
;; Custom & Packages Loading
|
;; Custom & Packages Loading
|
||||||
;; ============================================================
|
;; ============================================================
|
||||||
(let ((custom-dir (expand-file-name "custom/" user-emacs-directory)))
|
(let ((custom-dir (expand-file-name "custom/" user-emacs-directory)))
|
||||||
(when (file-directory-p custom-dir)
|
(when (file-directory-p custom-dir)
|
||||||
(mapc #'load (directory-files custom-dir t "\\.el$"))))
|
(dolist (file (directory-files custom-dir nil "\\.el$"))
|
||||||
|
(load (expand-file-name (file-name-sans-extension file) custom-dir)))))
|
||||||
;; (let ((pkg-dir (expand-file-name "packages/" user-emacs-directory)))
|
|
||||||
;; (when (file-directory-p pkg-dir)
|
|
||||||
;; (mapc #'load (directory-files pkg-dir t "\\.el$"))))
|
|
||||||
|
|
||||||
(add-to-list 'load-path (expand-file-name "packages/" user-emacs-directory))
|
(add-to-list 'load-path (expand-file-name "packages/" user-emacs-directory))
|
||||||
;;(add-to-list 'load-path (expand-file-name "custom/" user-emacs-directory))
|
|
||||||
(add-to-list 'custom-theme-load-path (expand-file-name "themes/" user-emacs-directory))
|
(add-to-list 'custom-theme-load-path (expand-file-name "themes/" user-emacs-directory))
|
||||||
|
|
||||||
(require 'visuals-packages) ;;ui, eye candy
|
(add-hook
|
||||||
(require 'editing-packages) ;;text editing
|
'after-init-hook
|
||||||
(require 'system-packages) ;; emacs itself
|
(lambda ()
|
||||||
(require 'tutilities-packages) ;; tertiary utilities
|
(require 'visuals-packages) ; ui, eye candy
|
||||||
(require 'completion-packages) ;; ui, functional
|
(require 'editing-packages) ; text editing
|
||||||
|
(require 'system-packages) ; emacs itself
|
||||||
|
(require 'tutilities-packages) ; tertiary utilities
|
||||||
|
(require 'completion-packages) ; ui, functional
|
||||||
|
(require 'dev-packages) ; lsp, treesitter
|
||||||
|
)
|
||||||
|
)
|
||||||
|
;; ============================================================
|
||||||
|
;; Keybindings
|
||||||
|
;; ============================================================
|
||||||
|
|
||||||
(use-package general
|
(use-package general
|
||||||
:config
|
: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
|
|
||||||
"C-k" #'avy-kill-whole-line
|
|
||||||
"C-r" #'recenter-top-bottom
|
|
||||||
"C-b" #'scroll-down-command
|
|
||||||
"C-<backspace>" #'my/delete-word-backward
|
|
||||||
|
|
||||||
"M-w" #'clipetty-kill-ring-save
|
|
||||||
)
|
|
||||||
(general-def
|
|
||||||
:keymaps 'override
|
|
||||||
"M-g g" #'avy-goto-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 w" #'my/vterm-sync-here
|
|
||||||
"C-x C-b" #'buffer-table
|
|
||||||
"C-s C-l" #'consult-line
|
|
||||||
"C-s C-e" #'expreg-expand
|
|
||||||
)
|
|
||||||
|
|
||||||
(general-define-key
|
(general-define-key
|
||||||
:keymaps 'global
|
:keymaps 'global
|
||||||
"C-w" #'delete-window))
|
"C-l" nil ; recenter
|
||||||
|
"C-n" nil ; next line
|
||||||
|
"C-p" nil ; previous line
|
||||||
|
"C-f" nil ; forward chard
|
||||||
|
"C-o" nil ; idk
|
||||||
|
"C-t" nil ; transpose
|
||||||
|
;"C-m" nil can't be rebound because is same as ret
|
||||||
|
"C->" nil ;end of buffer
|
||||||
|
"C-<" nil ;start of buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
(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-M-z" #'undo-redo
|
||||||
|
"C-k" #'avy-kill-whole-line
|
||||||
|
"C-r" #'recenter-top-bottom
|
||||||
|
"C-b" #'scroll-down-command
|
||||||
|
"C-<backspace>" #'my/delete-word-backward
|
||||||
|
"M-<backspace>" #'my/delete-word-backward
|
||||||
|
"M-s M-s" #'scroll-lock-mode
|
||||||
|
"C-w" #'delete-window
|
||||||
|
|
||||||
|
"C-x m" #'switch-to-minibuffer
|
||||||
|
|
||||||
|
"M-w" #'clipetty-kill-ring-save
|
||||||
|
; "C-x S-v" #'shrink-window
|
||||||
|
; "C-x v" #'enlarge-window
|
||||||
|
)
|
||||||
|
(general-def
|
||||||
|
:keymaps 'override
|
||||||
|
"C-s C-s C-f" #'my/avy-char-region ; search select find
|
||||||
|
"C-s C-s C-l" #'my/avy-line-region ; search select line
|
||||||
|
"C-s C-e" #'expreg-expand ; selection expand
|
||||||
|
"C-s C-c" #'expreg-contract ; selection contract
|
||||||
|
|
||||||
|
"C-s f" #'kirigami-toggle-fold ; fold
|
||||||
|
)
|
||||||
|
|
||||||
|
(general-def
|
||||||
|
:keymaps 'override
|
||||||
|
|
||||||
|
"C-f C-r" #'buffer-table ; recent buffer
|
||||||
|
"C-f C-f" #'avy-goto-char-timer ; find
|
||||||
|
"C-f C-l" #'consult-line ; line
|
||||||
|
"C-f g" #'avy-goto-line ; goto
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
(general-def
|
||||||
|
:keymaps 'override
|
||||||
|
"C-s s" #'shell-pop ; shell
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; 1. Make single ';' trigger Control for the very next keypress
|
||||||
|
(define-key key-translation-map (kbd ";") 'event-apply-control-modifier)
|
||||||
|
|
||||||
|
;; 2. Bind C-; to insert a literal semicolon directly
|
||||||
|
(global-set-key (kbd "C-;") (lambda () (interactive) (insert ";")))
|
||||||
|
|
||||||
|
|
||||||
;; ============================================================
|
;; ============================================================
|
||||||
;; Core Settings & UI
|
;; 2. Native Emacs & System Configuration
|
||||||
;; ============================================================
|
;; ============================================================
|
||||||
(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
|
|
||||||
|
|
||||||
tab-width 4
|
|
||||||
truncate-lines nil
|
|
||||||
display-line-numbers-type t
|
|
||||||
cursor-type 'bar
|
|
||||||
savehist-additional-variables '(kill-ring search-ring)
|
|
||||||
recentf-max-saved-items 75
|
|
||||||
|
|
||||||
global-auto-revert-non-file-buffers t
|
|
||||||
|
|
||||||
undo-limit 60000000
|
|
||||||
undo-strong-limit 90000000
|
|
||||||
undo-outer-limit 120000000
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
(setq-default
|
|
||||||
tab-width 4
|
|
||||||
js-indent-level 4
|
|
||||||
typescript-indent-level 4
|
|
||||||
typescript-ts-mode-indent-offset 4
|
|
||||||
typescript-ts-mode-indent-offset 4)
|
|
||||||
|
|
||||||
;; Modes
|
|
||||||
(global-hl-line-mode t )
|
|
||||||
(global-display-line-numbers-mode 1)
|
|
||||||
(hl-line-mode 1)
|
|
||||||
(savehist-mode 1)
|
|
||||||
(global-clipetty-mode)
|
|
||||||
(global-auto-revert-mode)
|
|
||||||
(yas-global-mode t)
|
|
||||||
|
|
||||||
;; Fonts
|
|
||||||
(set-face-attribute 'default nil :family "Noto Sans Mono" :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 'auto-mode-alist '("\\.ino$" . c++-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 '(".*/$")))
|
|
||||||
|
|
||||||
;; ============================================================
|
|
||||||
;; Native Emacs Configuration
|
|
||||||
;; ============================================================
|
|
||||||
(use-package emacs
|
(use-package emacs
|
||||||
:ensure nil
|
:ensure nil
|
||||||
:custom
|
:custom
|
||||||
(mason-setup)
|
;; --- Completion & Search ---
|
||||||
(tab-always-indent 'complete)
|
|
||||||
(completion-ignore-case t)
|
(completion-ignore-case t)
|
||||||
(read-file-name-completion-ignore-case t)
|
(read-file-name-completion-ignore-case t)
|
||||||
(read-buffer-completion-ignore-case t)
|
(read-buffer-completion-ignore-case t)
|
||||||
(text-mode-ispell-word-completion nil)
|
(text-mode-ispell-word-completion nil)
|
||||||
|
|
||||||
|
;; --- Backup & Auto-save ---
|
||||||
|
;; Centralize all backup files to a single directory to avoid cluttering projects
|
||||||
(backup-directory-alist '(("." . "~/MyEmacsBackups")))
|
(backup-directory-alist '(("." . "~/MyEmacsBackups")))
|
||||||
|
(auto-save-list-file-prefix "~/MyEmacsBackups")
|
||||||
(backup-by-copying t)
|
(backup-by-copying t)
|
||||||
|
(create-lockfiles nil)
|
||||||
|
(make-backup-files nil)
|
||||||
|
|
||||||
|
;; --- Miscellaneous ---
|
||||||
|
(tab-always-indent 'complete)
|
||||||
|
|
||||||
|
:hook
|
||||||
|
(prog-mode . hs-minor-mode)
|
||||||
)
|
)
|
||||||
|
|
||||||
;; Tree-sitter & LSP tweaks (Core transformative changes)
|
;; ============================================================
|
||||||
(with-eval-after-load 'treesit
|
;; 3. Core Settings & UI
|
||||||
(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))
|
|
||||||
|
|
||||||
(use-package mason
|
(setq
|
||||||
:config
|
;; --- Clipboard & Interprogram ---
|
||||||
(mason-setup))
|
;; Disable automatic clipboard integration to maintain a manual 'copy-paste' workflow
|
||||||
|
kill-ring-max 1
|
||||||
|
select-enable-clipboard nil
|
||||||
|
select-enable-primary nil
|
||||||
|
save-interprogram-paste-before-kill nil
|
||||||
|
mouse-drag-copy-region nil
|
||||||
|
selection-coding-system 'utf-8
|
||||||
|
|
||||||
(use-package lsp-mode
|
;; --- Visuals & UI ---
|
||||||
:hook ((prog-mode . lsp-deferred) ;try to automatically start lsp-mode when prog-mode
|
cursor-type 'bar
|
||||||
(typescript-ts-mode . lsp-deferred)
|
display-line-numbers-type t
|
||||||
(js-ts-mode . lsp-deferred)
|
truncate-lines nil ; Enable line wrapping
|
||||||
(tsx-ts-mode . lsp-deferred)
|
fast-but-imprecise-scrolling t
|
||||||
(arduino-mode . lsp-deferred)
|
ring-bell-function 'ignore ; Silence the system bell
|
||||||
(lsp-mode . lsp-enable-which-key-integration))
|
|
||||||
:commands lsp
|
|
||||||
:config
|
;; --- File & Buffer Handling ---
|
||||||
(add-to-list 'lsp-language-id-configuration '(arduino-mode . "cpp"))
|
find-file-visit-truename t
|
||||||
(lsp-register-client
|
vc-follow-symlinks t
|
||||||
(make-lsp-client
|
recentf-max-saved-items 100
|
||||||
:new-connection (lsp-stdio-connection '("clangd" "--header-insertion=never"))
|
history-length 300
|
||||||
:activation-fn (lsp-activate-on "arduino")
|
savehist-additional-variables '(kill-ring search-ring)
|
||||||
:server-id 'lsp-arduino-clangd
|
|
||||||
)))
|
;; --- Undo System ---
|
||||||
|
;; Expand undo limits for large files/sessions
|
||||||
|
undo-limit 60000000
|
||||||
|
undo-strong-limit 90000000
|
||||||
|
undo-outer-limit 120000000
|
||||||
|
|
||||||
|
;; --- Dired Settings ---
|
||||||
|
dired-listing-switches "-lha" ; Show hidden files and detailed info
|
||||||
|
dired-dwim-target t
|
||||||
|
dired-create-destination-dirs 'ask
|
||||||
|
dired-clean-up-buffers-too nil
|
||||||
|
dired-auto-revert-buffer t
|
||||||
|
|
||||||
|
;; --- Other ---
|
||||||
|
delete-by-moving-to-trash (not noninteractive)
|
||||||
|
remote-file-name-inhibit-delete-by-moving-to-trash t
|
||||||
|
package-quickstart t
|
||||||
|
diff-font-lock-prettify t
|
||||||
|
)
|
||||||
|
|
||||||
|
(setq-default
|
||||||
|
;; Standardize indentation across major modes
|
||||||
|
tab-width 4
|
||||||
|
js-indent-level 4
|
||||||
|
typescript-indent-level 4
|
||||||
|
typescript-ts-mode-indent-offset 4
|
||||||
|
selection-coding-system 'utf-8
|
||||||
|
cursor-type 'bar
|
||||||
|
)
|
||||||
|
|
||||||
;; ============================================================
|
;; ============================================================
|
||||||
;; Theming
|
;; 5. Hooks, Modes & Theming
|
||||||
;; ============================================================
|
;; ============================================================
|
||||||
(my/apply-theme (selected-frame))
|
|
||||||
;;(add-hook 'window-setup-hook (lambda () (my/apply-theme (selected-frame))))
|
(add-hook
|
||||||
(add-hook 'after-make-frame-functions 'my/apply-theme)
|
'after-init-hook
|
||||||
|
(lambda ()
|
||||||
|
;; --- Modes ---
|
||||||
|
(recentf-mode t) ; save/load recent files
|
||||||
|
(global-display-line-numbers-mode 1) ; always display line numbers
|
||||||
|
(global-hl-line-mode 0) (hl-line-mode 0) ; handled by god mode toggle
|
||||||
|
(savehist-mode 1)
|
||||||
|
(global-clipetty-mode t) ; copy-paste in terminal
|
||||||
|
(global-auto-revert-mode t) ; automatically refresh buffer
|
||||||
|
(yas-global-mode t) ; yasnippets
|
||||||
|
(repeat-mode 1) ; repeat key without modifier
|
||||||
|
(electric-pair-mode t) ; automatically handle pairs
|
||||||
|
(jit-spell-mode t) ; spellcheck
|
||||||
|
(fringe-mode '(0 . 8)) ; fringe only on right edge
|
||||||
|
(delete-selection-mode 1)
|
||||||
|
(auto-revert-mode t)
|
||||||
|
|
||||||
|
;; --- Special UI Settings ---
|
||||||
|
(setq ispell-program-name "hunspell"
|
||||||
|
ispell-dictionary "en_US,nl_NL")
|
||||||
|
|
||||||
|
;; Ensure help opens in a side window rather than replacing current buffer
|
||||||
|
(setq display-buffer-alist
|
||||||
|
(cons '("Help" . (display-buffer-in-side-window
|
||||||
|
:side 'bottom
|
||||||
|
:style 'overriding
|
||||||
|
:window-height 0.3))
|
||||||
|
display-buffer-alist))
|
||||||
|
|
||||||
|
(setq minibuffer-prompt-properties
|
||||||
|
'(read-only t intangible t cursor-intangible t face minibuffer-prompt))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; Dired Customization
|
||||||
|
(with-eval-after-load 'dired
|
||||||
|
(add-hook 'dired-mode-hook
|
||||||
|
(lambda ()
|
||||||
|
(define-key dired-mode-map (kbd "a") 'dired-up-directory)
|
||||||
|
(define-key dired-mode-map (kbd "v") 'dirvish-move))))
|
||||||
|
|
||||||
|
;; Recentf Maintenance
|
||||||
|
(with-eval-after-load 'recentf
|
||||||
|
(run-at-time nil 600 #'recentf-cleanup)
|
||||||
|
(setq recentf-exclude '(".*/$")))
|
||||||
|
|
||||||
|
;; General Hooks
|
||||||
|
(add-hook 'find-file-hook #'recentf-save-list)
|
||||||
|
(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
|
||||||
|
|
||||||
|
;; Mode-specific fonts
|
||||||
|
(dolist (hook '(markdown-mode-hook org-mode-hook json-mode-hook))
|
||||||
|
(add-hook hook (lambda () (buffer-face-set '(:family "Noto Sans" :height 140)))))
|
||||||
|
|
||||||
|
;; File Associations
|
||||||
|
(add-to-list 'auto-mode-alist '("\\.qd$" . markdown-mode))
|
||||||
|
(add-to-list 'auto-mode-alist '("\\.ino$" . c++-mode))
|
||||||
|
(add-to-list 'auto-mode-alist '("\\.ts$" . typescript-ts-mode))
|
||||||
|
(add-to-list 'term-file-aliases '("xterm-256" . "xterm"))
|
||||||
|
|
||||||
|
;; Visual Finalization
|
||||||
|
(add-hook
|
||||||
|
'window-setup-hook
|
||||||
|
(lambda ()
|
||||||
|
(set-face-attribute 'default nil :family "Noto Sans Mono" :height 120)
|
||||||
|
(set-face-attribute 'variable-pitch nil :family "Noto Sans" :height 140)
|
||||||
|
(my/apply-theme (selected-frame))))
|
||||||
|
|
||||||
(setq nerd-icons-font-family "Symbols Nerd Font Mono")
|
(setq nerd-icons-font-family "Symbols Nerd Font Mono")
|
||||||
|
|||||||
@@ -27,3 +27,13 @@ When INCLUSIVE is non-nil, include the character at the end point."
|
|||||||
(interactive)
|
(interactive)
|
||||||
(my/avy-region 'avy-goto-line)
|
(my/avy-region 'avy-goto-line)
|
||||||
(forward-line 1))
|
(forward-line 1))
|
||||||
|
|
||||||
|
(defun my/another-select-exact-string (str)
|
||||||
|
"Prompt for a string and select its exact match using avy."
|
||||||
|
(interactive "sSelect target: ")
|
||||||
|
(avy-with my/select-exact-string
|
||||||
|
(avy-jump (regexp-quote str)
|
||||||
|
:action (lambda (pt)
|
||||||
|
(goto-char pt)
|
||||||
|
(set-mark pt)
|
||||||
|
(forward-char (length str))))))
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
;; Faces for distinction
|
;; Faces for distinction
|
||||||
(defface buffer-table-open '((t :inherit font-lock-keyword-face :bold t)) "Face for open files.")
|
(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-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-special '((t :inherit font-lock-string-face)) "Face for internal buffers.")
|
||||||
(defface buffer-table-modified '((t :inherit error :bold t)) "Face for modified flag.")
|
(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.")
|
(defface buffer-table-marked '((t :inherit warning :bold t)) "Face for marked entries.")
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
-130
@@ -1,130 +0,0 @@
|
|||||||
;;; ../../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)
|
|
||||||
'("k" . 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,69 @@
|
|||||||
|
;"Generate an aligned, fontified buffer of all Denote files using fd."
|
||||||
|
|
||||||
|
(defvar denote-browser-map
|
||||||
|
(let ((map (make-sparse-keymap)))
|
||||||
|
(define-key map (kbd "RET") 'denote-browser-open-file)
|
||||||
|
map)
|
||||||
|
"Keymap for the custom Denote browser.")
|
||||||
|
|
||||||
|
(defface denote-browser-dir '((t :inherit font-lock-comment-face)) "Face for subdirs.")
|
||||||
|
(defface denote-browser-id '((t :inherit font-lock-constant-face)) "Face for IDs.")
|
||||||
|
(defface denote-browser-title '((t :inherit font-lock-keyword-face :weight bold)) "Face for titles.")
|
||||||
|
(defface denote-browser-tags '((t :inherit font-lock-type-face)) "Face for tags.")
|
||||||
|
|
||||||
|
(defun denote-browser-open-file ()
|
||||||
|
"Open the file on the current line."
|
||||||
|
(interactive)
|
||||||
|
(if (get-text-property (point) 'denote-path)
|
||||||
|
(find-file (get-text-property (point) 'denote-path))
|
||||||
|
(message "No file on this line.")))
|
||||||
|
|
||||||
|
(defun list-denote-files ()
|
||||||
|
"Generate an aligned, fontified buffer of all Denote files using fd."
|
||||||
|
(interactive)
|
||||||
|
(let* ((default-directory (expand-file-name "~/lyrinv/SOR/Notes/"))
|
||||||
|
(raw-output (shell-command-to-string "fd -t f"))
|
||||||
|
(lines (split-string raw-output "\n" t))
|
||||||
|
(buf (get-buffer-create "*Denote Browser*")))
|
||||||
|
(with-current-buffer buf
|
||||||
|
(let ((inhibit-read-only t))
|
||||||
|
(erase-buffer)
|
||||||
|
(use-local-map denote-browser-map)
|
||||||
|
(setq-local buffer-read-only t)
|
||||||
|
|
||||||
|
(dolist (line lines)
|
||||||
|
;; Regex to break down: Subdir/ + ID + Title + Keywords
|
||||||
|
(if (string-match "^\\(.*\\/\\)?\\([0-9A-Za-z]+\\)--\\([^\n__]+\\)\\(__.*\\)?\\.\\([a-z]+\\)$" line)
|
||||||
|
(let* ((dir (or (match-string 1 line) ""))
|
||||||
|
(id (or (match-string 2 line) ""))
|
||||||
|
(title (or (match-string 3 line) ""))
|
||||||
|
(tags (or (match-string 4 line) ""))
|
||||||
|
(full-path (expand-file-name line default-directory))
|
||||||
|
(start (point)))
|
||||||
|
|
||||||
|
;; Clean up trailing slash and tag underscores for legibility
|
||||||
|
(setq dir (if (string-empty-p dir) "." (directory-file-name dir)))
|
||||||
|
(setq tags (if (string-empty-p tags) "" (replace-regexp-in-string "__" " " tags)))
|
||||||
|
|
||||||
|
;; Insert padded, aligned string components
|
||||||
|
(insert (propertize (format "%-20s " dir) 'face 'denote-browser-dir))
|
||||||
|
(insert (propertize (format "%-16s " id) 'face 'denote-browser-id))
|
||||||
|
(insert (propertize (format "%-45s " title) 'face 'denote-browser-title))
|
||||||
|
(insert (propertize tags 'face 'denote-browser-tags))
|
||||||
|
(insert "\n")
|
||||||
|
|
||||||
|
;; Attach the raw file path to the entire line for RET to use
|
||||||
|
(add-text-properties start (point) (list 'denote-path full-path)))
|
||||||
|
|
||||||
|
;; Fallback layout for non-standard files (e.g., gereedschap.ods)
|
||||||
|
(let* ((dir (or (file-name-directory line) "."))
|
||||||
|
(file (file-name-nondirectory line))
|
||||||
|
(full-path (expand-file-name line default-directory))
|
||||||
|
(start (point)))
|
||||||
|
(insert (propertize (format "%-20s " (directory-file-name dir)) 'face 'denote-browser-dir))
|
||||||
|
(insert (propertize (format "%-16s " "No-ID") 'face 'denote-browser-id))
|
||||||
|
(insert (propertize file 'face 'denote-browser-title))
|
||||||
|
(insert "\n")
|
||||||
|
(add-text-properties start (point) (list 'denote-path full-path)))))))
|
||||||
|
|
||||||
|
(pop-to-buffer buf)))
|
||||||
+100
-12
@@ -28,11 +28,9 @@ Absolutely zero interaction with the Emacs kill ring."
|
|||||||
Never falls back to or checks the Emacs kill ring."
|
Never falls back to or checks the Emacs kill ring."
|
||||||
(interactive)
|
(interactive)
|
||||||
(if (display-graphic-p)
|
(if (display-graphic-p)
|
||||||
(let ((text (or (gui-backend-get-selection 'CLIPBOARD 'STRING)
|
(let ((text (or (gui-get-selection 'CLIPBOARD)
|
||||||
(gui-backend-get-selection 'CLIPBOARD 'UTF8_STRING)
|
(gui-get-selection 'PRIMARY)
|
||||||
(gui-backend-get-selection 'PRIMARY 'STRING)
|
(when (executable-find "wl-paste")
|
||||||
;; Wayland/Dolphin fallback from previous fix
|
|
||||||
(when (executable-find "wl-paste")
|
|
||||||
(let ((val (shell-command-to-string "wl-paste -n -t text/plain")))
|
(let ((val (shell-command-to-string "wl-paste -n -t text/plain")))
|
||||||
(unless (string-empty-p val) val))))))
|
(unless (string-empty-p val) val))))))
|
||||||
(if text
|
(if text
|
||||||
@@ -41,13 +39,103 @@ Never falls back to or checks the Emacs kill ring."
|
|||||||
;; TUI Fallback
|
;; TUI Fallback
|
||||||
(message "In a terminal, use your terminal emulator's native paste shortcut (e.g., Ctrl-Shift-V).")))
|
(message "In a terminal, use your terminal emulator's native paste shortcut (e.g., Ctrl-Shift-V).")))
|
||||||
|
|
||||||
(defun my/vterm-sync-here ()
|
(defun my/system-paste-via-yank ()
|
||||||
"Switch to vterm and instantly 'cd' to the current buffer's directory."
|
"Pure paste: Overwrites the kill ring with clipboard data and triggers local yank."
|
||||||
(interactive)
|
(interactive)
|
||||||
(let ((cwd default-directory))
|
(let ((text (or (gui-get-selection 'CLIPBOARD)
|
||||||
(vterm-toggle)
|
(gui-get-selection 'PRIMARY)
|
||||||
(vterm-send-string (format "cd %s" (shell-quote-argument cwd)))
|
(when (executable-find "wl-paste")
|
||||||
(vterm-send-return)))
|
(when (executable-find "wl-paste")
|
||||||
|
(let ((val (shell-command-to-string "wl-paste -n -t text/plain")))
|
||||||
|
(unless (string-empty-p val) val))))
|
||||||
|
nil)))
|
||||||
|
(if text
|
||||||
|
(progn
|
||||||
|
;; Forcibly stage to the kill ring. With kill-ring-max=1, this replaces everything.
|
||||||
|
(kill-new text)
|
||||||
|
;; Resolve the context-aware yank command (handles terminal wrappers automatically)
|
||||||
|
(let ((local-yank (key-binding (kbd "C-y"))))
|
||||||
|
(if (commandp local-yank)
|
||||||
|
(call-interactively local-yank)
|
||||||
|
(call-interactively 'yank))))
|
||||||
|
(user-error "System clipboard is empty"))))
|
||||||
|
|
||||||
|
(defun my/sync-clipboard-to-kill-ring ()
|
||||||
|
"Explicitly pull the system clipboard into the Emacs kill ring without pasting."
|
||||||
|
(interactive)
|
||||||
|
(let ((text (or (gui-get-selection 'CLIPBOARD)
|
||||||
|
(gui-get-selection 'PRIMARY)
|
||||||
|
(when (executable-find "wl-paste")
|
||||||
|
(when (executable-find "wl-paste")
|
||||||
|
(let ((val (shell-command-to-string "wl-paste -n -t text/plain")))
|
||||||
|
(unless (string-empty-p val) val))))
|
||||||
|
nil)))
|
||||||
|
(if text
|
||||||
|
(progn
|
||||||
|
(kill-new text)
|
||||||
|
(message "System clipboard staged to kill ring."))
|
||||||
|
(user-error "System clipboard is empty"))))
|
||||||
|
|
||||||
|
(defun dired-wayland-copy-marked-files ()
|
||||||
|
"Copy marked files in Dired to the Wayland clipboard as text/uri-list."
|
||||||
|
(interactive)
|
||||||
|
(let* ((files (dired-get-marked-files))
|
||||||
|
;; Convert paths to file:// URIs and join with newlines
|
||||||
|
(uri-list (mapconcat (lambda (file) (concat "file://" file)) files "\n")))
|
||||||
|
(when files
|
||||||
|
(let ((process-connection-type nil))
|
||||||
|
(let ((proc (start-process "wl-copy-uri" nil "wl-copy" "-t" "text/uri-list")))
|
||||||
|
(process-send-string proc uri-list)
|
||||||
|
(process-send-eof proc)))
|
||||||
|
(message "Copied %d file(s) to Wayland clipboard." (length files)))))
|
||||||
|
|
||||||
|
(defun dired-wayland-paste-files ()
|
||||||
|
"Paste files from the Wayland clipboard (text/uri-list) into the current Dired directory."
|
||||||
|
(interactive)
|
||||||
|
(let ((default-directory (dired-current-directory)))
|
||||||
|
(with-temp-buffer
|
||||||
|
;; Call wl-paste to get the uri-list
|
||||||
|
(call-process "wl-paste" nil t nil "-t" "text/uri-list")
|
||||||
|
(goto-char (point-min))
|
||||||
|
(let ((files '()))
|
||||||
|
;; Parse file:// URIs line by line
|
||||||
|
(while (re-search-forward "^file://\\(.*\\)$" nil t)
|
||||||
|
(push (match-string 1) files))
|
||||||
|
(if files
|
||||||
|
(progn
|
||||||
|
;; Copy files to the current directory using dired's native copying
|
||||||
|
(dolist (file files)
|
||||||
|
(when (file-exists-p file)
|
||||||
|
(dired-copy-file file default-directory t)))
|
||||||
|
(revert-buffer) ; Refresh dired buffer
|
||||||
|
(message "Pasted %d file(s)." (length files)))
|
||||||
|
(message "No files found in Wayland clipboard."))))))
|
||||||
|
|
||||||
|
;; Bind keys in dired-mode
|
||||||
|
(with-eval-after-load 'dired
|
||||||
|
(define-key dired-mode-map (kbd "Y") #'dired-wayland-copy-marked-files)
|
||||||
|
(define-key dired-mode-map (kbd "P") #'dired-wayland-paste-files))
|
||||||
|
|
||||||
|
(defun my/mc-copy-regions-as-block ()
|
||||||
|
"Copy all active multiple-cursors regions joined by newlines into the kill ring."
|
||||||
|
(interactive)
|
||||||
|
(if (and (bound-and-true-p multiple-cursors-mode)
|
||||||
|
(use-region-p))
|
||||||
|
(let ((strings (mapcar (lambda (cursor)
|
||||||
|
(let ((beg (mc/cursor-beg cursor))
|
||||||
|
(end (mc/cursor-end cursor)))
|
||||||
|
(buffer-substring-no-properties beg end)))
|
||||||
|
(mc/all-fake-cursors))))
|
||||||
|
;; Add the main cursor's region as well
|
||||||
|
(push (buffer-substring-no-properties (region-beginning) (region-end)) strings)
|
||||||
|
;; Sort by position so they match document order
|
||||||
|
(setq strings (mapcar #'cdr
|
||||||
|
(sort (cl-mapcar #'cons
|
||||||
|
(cons (point) (mapcar #'mc/cursor-beg (mc/all-fake-cursors)))
|
||||||
|
strings)
|
||||||
|
(lambda (a b) (< (car a) (car b))))))
|
||||||
|
(kill-new (string-join strings "\n"))
|
||||||
|
(message "Copied %d cursor regions as a block." (length strings)))
|
||||||
|
(message "No active multiple-cursors regions to copy.")))
|
||||||
|
|
||||||
(provide 'system)
|
(provide 'system)
|
||||||
;;unqualified-search-registries = ["docker.io"]
|
|
||||||
|
|||||||
+6
-2
@@ -1,18 +1,22 @@
|
|||||||
;;; ../../lyfi/configs/apps/doom/custom/ui.el -*- lexical-binding: t; -*-
|
;;; ../../lyfi/configs/apps/doom/custom/ui.el -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
|
(defun my-set-buffer-font ()
|
||||||
|
"Set a specific font for the current buffer only."
|
||||||
|
(buffer-face-set '(:family "Noto Sans" :height 140)))
|
||||||
|
|
||||||
(defun my/apply-theme (frame)
|
(defun my/apply-theme (frame)
|
||||||
"Apply a specific theme and update package colors based on whether the FRAME is graphic or TUI."
|
"Apply a specific theme and update package colors based on whether the FRAME is graphic or TUI."
|
||||||
(select-frame frame)
|
(select-frame frame)
|
||||||
(if (display-graphic-p frame)
|
(if (display-graphic-p frame)
|
||||||
(progn
|
(progn
|
||||||
(mapc #'disable-theme custom-enabled-themes)
|
(mapc #'disable-theme custom-enabled-themes)
|
||||||
(load-theme 'cutarv41 t)
|
(load-theme 'cutarv42 t)
|
||||||
;; Update rainbow-delimiters colors for Light theme
|
;; Update rainbow-delimiters colors for Light theme
|
||||||
(setq rainbow-delimiters-rainbow-colors
|
(setq rainbow-delimiters-rainbow-colors
|
||||||
'("#007cbf" "#cf3f29" "#2374de" "#c75e10" "#b05197" "#429e66" "#129cc9" "#a64dd6")))
|
'("#007cbf" "#cf3f29" "#2374de" "#c75e10" "#b05197" "#429e66" "#129cc9" "#a64dd6")))
|
||||||
(progn
|
(progn
|
||||||
(mapc #'disable-theme custom-enabled-themes)
|
(mapc #'disable-theme custom-enabled-themes)
|
||||||
(load-theme 'cutarv41 t)
|
(load-theme 'cutarv42 t)
|
||||||
;; Update rainbow-delimiters colors for Dark theme
|
;; Update rainbow-delimiters colors for Dark theme
|
||||||
;; (setq rainbow-delimiters-rainbow-colors
|
;; (setq rainbow-delimiters-rainbow-colors
|
||||||
;; '("#4da6ff" "#ff6b6b" "#6da6ff" "#ffb347" "#d18ecb" "#8fbc8f" "#80daeb" "#c8a0f2"))
|
;; '("#4da6ff" "#ff6b6b" "#6da6ff" "#ffb347" "#d18ecb" "#8fbc8f" "#80daeb" "#c8a0f2"))
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
;;; ../../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))
|
|
||||||
+1
-16
@@ -39,10 +39,6 @@ Blocks are defined by: whitespace, alphanumerics, or groups of symbols."
|
|||||||
|
|
||||||
(delete-region (point) end)))))
|
(delete-region (point) end)))))
|
||||||
|
|
||||||
(defun my-set-buffer-font ()
|
|
||||||
"Set a specific font for the current buffer only."
|
|
||||||
(buffer-face-set '(:family "Noto Sans" :height 140)))
|
|
||||||
|
|
||||||
(defun my/toggle-quote-wrap-all-in-region (beg end)
|
(defun my/toggle-quote-wrap-all-in-region (beg end)
|
||||||
"Toggle wrapping all items in region with double quotes."
|
"Toggle wrapping all items in region with double quotes."
|
||||||
;;https://xenodium.com/emacs-quote-wrap-all-in-region
|
;;https://xenodium.com/emacs-quote-wrap-all-in-region
|
||||||
@@ -60,17 +56,6 @@ Blocks are defined by: whitespace, alphanumerics, or groups of symbols."
|
|||||||
(delete-region beg end)
|
(delete-region beg end)
|
||||||
(insert replacement)))
|
(insert replacement)))
|
||||||
|
|
||||||
(defun my/meow-wrap-arbitrary (s e)
|
|
||||||
"Wrap the current meow selection with arbitrary strings."
|
|
||||||
(interactive "r")
|
|
||||||
(let ((start-str (read-string "Start: "))
|
|
||||||
(end-str (read-string "End: ")))
|
|
||||||
(save-excursion
|
|
||||||
(goto-char e)
|
|
||||||
(insert end-str)
|
|
||||||
(goto-char s)
|
|
||||||
(insert start-str))))
|
|
||||||
|
|
||||||
(defun my/column-align-regexp ()
|
(defun my/column-align-regexp ()
|
||||||
"Aligns the matched regexp to `comment-column`.
|
"Aligns the matched regexp to `comment-column`.
|
||||||
If the text preceding the regexp is already past `comment-column`,
|
If the text preceding the regexp is already past `comment-column`,
|
||||||
@@ -81,7 +66,7 @@ it ensures exactly one space of separation."
|
|||||||
(target-col (if (and (boundp 'comment-column)
|
(target-col (if (and (boundp 'comment-column)
|
||||||
(numberp comment-column))
|
(numberp comment-column))
|
||||||
comment-column
|
comment-column
|
||||||
40))
|
80))
|
||||||
(start (region-beginning))
|
(start (region-beginning))
|
||||||
(end (region-end)))
|
(end (region-end)))
|
||||||
|
|
||||||
|
|||||||
+501
-17
@@ -1,21 +1,505 @@
|
|||||||
;;; early-init.el -*- lexical-binding: t; -*-
|
;;; early-init.el --- Early Init -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
;; Prevent package.el from loading at startup (elpaca handles it)
|
;; Author: James Cherti <https://www.jamescherti.com/contact/>
|
||||||
(setq package-enable-at-startup nil)
|
;; URL: https://github.com/jamescherti/minimal-emacs.d
|
||||||
|
;; Package-Requires: ((emacs "29.1"))
|
||||||
|
;; Keywords: maint
|
||||||
|
;; Version: 1.5.1
|
||||||
|
;; SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
;; Disable UI elements early for faster frame rendering
|
;;; Commentary:
|
||||||
(setq inhibit-startup-screen t
|
;; The minimal-emacs.d project is a lightweight and optimized Emacs base
|
||||||
inhibit-startup-echo-area-message user-login-name
|
;; (init.el and early-init.el) that gives you full control over your
|
||||||
initial-scratch-message nil
|
;; configuration. It provides better defaults, an optimized startup, and a clean
|
||||||
initial-major-mode 'fundamental-mode
|
;; foundation for building your own vanilla Emacs setup.
|
||||||
frame-inhibit-implied-resize t
|
;;
|
||||||
garbage-collection-messages t)
|
;; Building the minimal-emacs.d init.el and early-init.el was the result of
|
||||||
|
;; extensive research and testing to fine-tune the best parameters and
|
||||||
|
;; optimizations for an Emacs configuration.
|
||||||
|
;;
|
||||||
|
;; Do not modify this file; instead, modify pre-early-init.el or
|
||||||
|
;; post-early-init.el.
|
||||||
|
|
||||||
;; Temporarily raise GC threshold during startup
|
;;; Code:
|
||||||
(setq gc-cons-threshold 8000000000
|
|
||||||
gc-cons-percentage 0.6)
|
|
||||||
(add-hook 'after-init-hook (lambda () (setq gc-cons-threshold 80000000)))
|
|
||||||
|
|
||||||
;; Disable UI chrome
|
;;; Internal variables
|
||||||
(dolist (mode '(menu-bar-mode tool-bar-mode scroll-bar-mode))
|
|
||||||
(when (fboundp mode) (funcall mode -1)))
|
;; Backup of `gc-cons-threshold' and `gc-cons-percentage' before startup.
|
||||||
|
(defvar minimal-emacs--backup-gc-cons-threshold gc-cons-threshold)
|
||||||
|
(defvar minimal-emacs--backup-gc-cons-percentage gc-cons-percentage)
|
||||||
|
|
||||||
|
;; Temporarily raise the garbage collection threshold to its maximum value.
|
||||||
|
;; It will be restored later to controlled values.
|
||||||
|
(if noninteractive
|
||||||
|
(setq gc-cons-threshold 268435456) ; 256 Mb
|
||||||
|
(setq gc-cons-threshold most-positive-fixnum))
|
||||||
|
(setq gc-cons-percentage 1.0)
|
||||||
|
|
||||||
|
;;; Variables
|
||||||
|
|
||||||
|
(defvar minimal-emacs-ui-features '()
|
||||||
|
"List of user interface features to enable in minimal Emacs setup.
|
||||||
|
This variable holds a list of Emacs UI features that can be enabled:
|
||||||
|
- context-menu (Enables the context menu in graphical environments.)
|
||||||
|
- tool-bar (Enables the tool bar in graphical environments.)
|
||||||
|
- menu-bar (Enables the menu bar in graphical environments.)
|
||||||
|
- dialogs (Enables both file dialogs and dialog boxes.)
|
||||||
|
- tooltips (Enables tooltips.)")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-frame-title-format "%b – Emacs"
|
||||||
|
"Template for displaying the title bar of visible and iconified frame.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-debug (bound-and-true-p init-file-debug)
|
||||||
|
"Non-nil to enable debug.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-optimize-startup-gc t
|
||||||
|
"If non-nil, increase `gc-cons-threshold' during startup to reduce pauses.
|
||||||
|
After Emacs finishes loading, `gc-cons-threshold' is restored to the value
|
||||||
|
stored in `minimal-emacs-gc-cons-threshold'.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-gc-cons-threshold (* 32 1024 1024)
|
||||||
|
"Value to which `gc-cons-threshold' is set after Emacs startup.
|
||||||
|
Ignored if `minimal-emacs-optimize-startup-gc' is nil.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-gc-cons-percentage gc-cons-percentage
|
||||||
|
"Value to which `gc-cons-percentage' is set after Emacs startup.
|
||||||
|
Ignored if `minimal-emacs-optimize-startup-gc' is nil.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-gc-cons-threshold-restore-delay nil
|
||||||
|
"Number of seconds to wait before restoring `gc-cons-threshold'.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-optimize-file-name-handler-alist t
|
||||||
|
"Enable optimization of `file-name-handler-alist'.
|
||||||
|
When non-nil, this variable activates optimizations to reduce file name handler
|
||||||
|
lookups during Emacs startup.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-disable-mode-line-during-startup t
|
||||||
|
"Disable the mode line during startup.
|
||||||
|
This reduces visual clutter and slightly enhances startup performance. The
|
||||||
|
tradeoff is that the mode line is hidden during the startup phase.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-package-initialize-and-refresh nil
|
||||||
|
"Whether to automatically initialize and refresh packages.
|
||||||
|
When set to non-nil, Emacs will automatically call `package-initialize' and
|
||||||
|
`package-refresh-contents' to set up and update the package system.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-inhibit-redisplay-during-startup nil
|
||||||
|
"Suppress redisplay during startup to improve performance.
|
||||||
|
This prevents visual updates while Emacs initializes. The tradeoff is that you
|
||||||
|
won't see the progress or activities during the startup process.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-inhibit-message-during-startup nil
|
||||||
|
"Suppress startup messages for a cleaner experience.
|
||||||
|
This slightly enhances performance. The tradeoff is that you won't be informed
|
||||||
|
of the progress or any relevant activities during startup.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-user-directory user-emacs-directory
|
||||||
|
"Directory beneath minimal-emacs.d files are placed.
|
||||||
|
Note that this should end with a directory separator.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-load-pre-early-init t
|
||||||
|
"If non-nil, attempt to load `pre-early-init.el`.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-load-post-early-init t
|
||||||
|
"If non-nil, attempt to load `post-early-init.el`.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-load-pre-init t
|
||||||
|
"If non-nil, attempt to load `pre-init.el`.")
|
||||||
|
|
||||||
|
(defvar minimal-emacs-load-post-init t
|
||||||
|
"If non-nil, attempt to load `post-init.el`.")
|
||||||
|
|
||||||
|
;;; Load pre-early-init.el
|
||||||
|
|
||||||
|
;; Prefer loading newer compiled files
|
||||||
|
(setq load-prefer-newer t)
|
||||||
|
(when minimal-emacs-debug
|
||||||
|
(setq debug-on-error minimal-emacs-debug))
|
||||||
|
|
||||||
|
(defvar minimal-emacs--success nil)
|
||||||
|
(defun minimal-emacs--check-success ()
|
||||||
|
"Verify that the Emacs configuration has loaded successfully."
|
||||||
|
(unless minimal-emacs--success
|
||||||
|
(cond
|
||||||
|
((or (file-exists-p (expand-file-name "~/.emacs.el"))
|
||||||
|
(file-exists-p (expand-file-name "~/.emacs")))
|
||||||
|
(error "Emacs ignored loading 'init.el'. Please ensure that files such as ~/.emacs or ~/.emacs.el do not exist, as they may be preventing Emacs from loading the 'init.el' file"))
|
||||||
|
|
||||||
|
(t
|
||||||
|
(error "Configuration error. Debug by starting Emacs with: --debug-init")))))
|
||||||
|
|
||||||
|
(unless noninteractive
|
||||||
|
(add-hook 'emacs-startup-hook #'minimal-emacs--check-success 102))
|
||||||
|
|
||||||
|
(defvar minimal-emacs-load-compiled-init-files nil
|
||||||
|
"If non-nil, attempt to load byte-compiled .elc for init files.
|
||||||
|
This will enable minimal-emacs to load byte-compiled or possibly native-compiled
|
||||||
|
init files for the following initialization files: pre-init.el, post-init.el,
|
||||||
|
pre-early-init.el, and post-early-init.el.")
|
||||||
|
|
||||||
|
(defun minimal-emacs--remove-el-file-suffix (filename)
|
||||||
|
"Remove the Elisp file suffix from FILENAME and return it (.el, .el.gz...)."
|
||||||
|
(let ((suffixes (mapcar (lambda (ext) (concat ".el" ext))
|
||||||
|
load-file-rep-suffixes)))
|
||||||
|
(catch 'done
|
||||||
|
(dolist (suffix suffixes filename)
|
||||||
|
(when (string-suffix-p suffix filename)
|
||||||
|
(setq filename (substring filename 0 (- (length suffix))))
|
||||||
|
(throw 'done t))))
|
||||||
|
filename))
|
||||||
|
|
||||||
|
(defun minimal-emacs-load-user-init (filename)
|
||||||
|
"Execute a file of Lisp code named FILENAME."
|
||||||
|
(let ((init-file (expand-file-name filename
|
||||||
|
minimal-emacs-user-directory)))
|
||||||
|
(if (not minimal-emacs-load-compiled-init-files)
|
||||||
|
(load init-file :no-error (not minimal-emacs-debug) :nosuffix)
|
||||||
|
;; Remove the file suffix (.el, .el.gz, etc.) to let the `load' function
|
||||||
|
;; select between .el and .elc files.
|
||||||
|
(setq init-file (minimal-emacs--remove-el-file-suffix init-file))
|
||||||
|
(load init-file :no-error (not minimal-emacs-debug)))))
|
||||||
|
|
||||||
|
(when minimal-emacs-load-pre-early-init
|
||||||
|
(minimal-emacs-load-user-init "pre-early-init.el"))
|
||||||
|
|
||||||
|
(setq custom-theme-directory
|
||||||
|
(expand-file-name "themes/" minimal-emacs-user-directory))
|
||||||
|
|
||||||
|
(setq custom-file (expand-file-name "custom.el" minimal-emacs-user-directory))
|
||||||
|
|
||||||
|
;;; Garbage collection
|
||||||
|
;; Garbage collection significantly affects startup times. This setting delays
|
||||||
|
;; garbage collection during startup but will be reset later.
|
||||||
|
|
||||||
|
(defun minimal-emacs--restore-gc-values ()
|
||||||
|
"Restore garbage collection values to minimal-emacs.d values."
|
||||||
|
(setq gc-cons-threshold minimal-emacs-gc-cons-threshold)
|
||||||
|
(setq gc-cons-percentage minimal-emacs-gc-cons-percentage))
|
||||||
|
|
||||||
|
(defun minimal-emacs--restore-gc ()
|
||||||
|
"Restore garbage collection settings."
|
||||||
|
(if (and (bound-and-true-p minimal-emacs-gc-cons-threshold-restore-delay)
|
||||||
|
;; In noninteractive mode, the event loop does not run
|
||||||
|
(not noninteractive))
|
||||||
|
;; Defer garbage collection during initialization to avoid 2 collections.
|
||||||
|
(run-with-timer minimal-emacs-gc-cons-threshold-restore-delay nil
|
||||||
|
#'minimal-emacs--restore-gc-values)
|
||||||
|
(minimal-emacs--restore-gc-values)))
|
||||||
|
|
||||||
|
(if minimal-emacs-optimize-startup-gc
|
||||||
|
;; `gc-cons-threshold' is managed by minimal-emacs.d
|
||||||
|
(add-hook 'emacs-startup-hook #'minimal-emacs--restore-gc 105)
|
||||||
|
;; gc-cons-threshold is not managed by minimal-emacs.d.
|
||||||
|
(when (= gc-cons-threshold most-positive-fixnum)
|
||||||
|
(setq gc-cons-threshold minimal-emacs--backup-gc-cons-threshold)
|
||||||
|
(setq gc-cons-percentage minimal-emacs--backup-gc-cons-percentage)))
|
||||||
|
|
||||||
|
;;; Native compilation and Byte compilation
|
||||||
|
|
||||||
|
(unless (and (featurep 'native-compile)
|
||||||
|
(fboundp 'native-comp-available-p)
|
||||||
|
(native-comp-available-p))
|
||||||
|
;; Deactivate the `native-compile' feature if it is not available
|
||||||
|
(setq native-comp-jit-compilation nil)
|
||||||
|
(setq features (delq 'native-compile features)))
|
||||||
|
|
||||||
|
(setq native-comp-warning-on-missing-source minimal-emacs-debug
|
||||||
|
native-comp-async-report-warnings-errors (or minimal-emacs-debug 'silent))
|
||||||
|
|
||||||
|
(setq jka-compr-verbose minimal-emacs-debug)
|
||||||
|
(setq byte-compile-warnings minimal-emacs-debug
|
||||||
|
byte-compile-verbose minimal-emacs-debug)
|
||||||
|
|
||||||
|
;;; Miscellaneous
|
||||||
|
|
||||||
|
(set-language-environment "UTF-8")
|
||||||
|
|
||||||
|
;; Increase how much is read from processes in a single chunk
|
||||||
|
(setq read-process-output-max (* 4 1024 1024)) ; 4096kb
|
||||||
|
|
||||||
|
(setq process-adaptive-read-buffering nil)
|
||||||
|
|
||||||
|
;; Don't ping things that look like domain names.
|
||||||
|
(setq ffap-machine-p-known 'reject)
|
||||||
|
|
||||||
|
(setq warning-minimum-level (if minimal-emacs-debug :warning :error))
|
||||||
|
|
||||||
|
;; Establish a strict baseline for suppressed warnings.
|
||||||
|
;; - defvaralias: Emacs emits warnings when an alias is defined for a variable
|
||||||
|
;; that already exists. In modern, lazy-loaded configurations, this occurs
|
||||||
|
;; frequently and is almost always benign.
|
||||||
|
;; - lexical-binding: Emacs warns about third-party packages that lack
|
||||||
|
;; lexical-binding. Because end users cannot easily fix upstream source code,
|
||||||
|
;; these warnings create noise without providing actionable value.
|
||||||
|
(setq warning-suppress-types '((defvaralias) (lexical-binding)))
|
||||||
|
(setq warning-inhibit-types '((files missing-lexbind-cookie)))
|
||||||
|
|
||||||
|
(when minimal-emacs-debug
|
||||||
|
(setq message-log-max 16384))
|
||||||
|
|
||||||
|
;; Disable warnings from the legacy advice API. They aren't useful.
|
||||||
|
(setq ad-redefinition-action 'accept)
|
||||||
|
|
||||||
|
;;; Performance: Miscellaneous options
|
||||||
|
|
||||||
|
;; A second, case-insensitive pass over `auto-mode-alist' is time wasted.
|
||||||
|
;; No second pass of case-insensitive search over auto-mode-alist.
|
||||||
|
(setq auto-mode-case-fold nil)
|
||||||
|
|
||||||
|
(unless minimal-emacs-debug
|
||||||
|
;; Unset command line options irrelevant to the current OS. These options
|
||||||
|
;; are still processed by `command-line-1` but have no effect.
|
||||||
|
(unless (eq system-type 'darwin)
|
||||||
|
(setq command-line-ns-option-alist nil))
|
||||||
|
(unless (memq initial-window-system '(x pgtk))
|
||||||
|
(setq command-line-x-option-alist nil)))
|
||||||
|
|
||||||
|
(unless noninteractive
|
||||||
|
;; In PGTK, this timeout introduces latency. Reducing it from the default 0.1
|
||||||
|
;; improves responsiveness of childframes and related packages.
|
||||||
|
(when (boundp 'pgtk-wait-for-event-timeout)
|
||||||
|
(setq pgtk-wait-for-event-timeout 0.001))
|
||||||
|
|
||||||
|
;; Font compacting can be very resource-intensive, especially when rendering
|
||||||
|
;; icon fonts on Windows. This will increase memory usage.
|
||||||
|
(setq inhibit-compacting-font-caches t)
|
||||||
|
|
||||||
|
;; Resizing the Emacs frame can be costly when changing the font. Disable this
|
||||||
|
;; to improve startup times with fonts larger than the system default.
|
||||||
|
(setq frame-resize-pixelwise t)
|
||||||
|
|
||||||
|
;; Without this, Emacs will try to resize itself to a specific column size
|
||||||
|
(setq frame-inhibit-implied-resize t)
|
||||||
|
|
||||||
|
;; Reduce *Message* noise at startup. An empty scratch buffer (or the
|
||||||
|
;; dashboard) is more than enough, and faster to display.
|
||||||
|
(setq inhibit-startup-screen t
|
||||||
|
inhibit-startup-echo-area-message user-login-name)
|
||||||
|
(setq initial-buffer-choice nil
|
||||||
|
inhibit-startup-buffer-menu t
|
||||||
|
inhibit-x-resources t)
|
||||||
|
|
||||||
|
;; Disable startup screens and messages
|
||||||
|
(setq inhibit-splash-screen t)
|
||||||
|
|
||||||
|
;; Disable bidirectional text scanning for a modest performance boost.
|
||||||
|
(setq-default bidi-display-reordering 'left-to-right
|
||||||
|
bidi-paragraph-direction 'left-to-right)
|
||||||
|
|
||||||
|
;; Give up some bidirectional functionality for slightly faster re-display.
|
||||||
|
(setq bidi-inhibit-bpa t)
|
||||||
|
|
||||||
|
;; Remove "For information about GNU Emacs..." message at startup
|
||||||
|
(advice-add 'display-startup-echo-area-message :override #'ignore)
|
||||||
|
|
||||||
|
;; Suppress the vanilla startup screen completely. We've disabled it with
|
||||||
|
;; `inhibit-startup-screen', but it would still initialize anyway.
|
||||||
|
(advice-add 'display-startup-screen :override #'ignore))
|
||||||
|
|
||||||
|
;;; Performance: File-name-handler-alist
|
||||||
|
|
||||||
|
(defvar minimal-emacs--old-file-name-handler-alist (default-toplevel-value
|
||||||
|
'file-name-handler-alist))
|
||||||
|
|
||||||
|
(defun minimal-emacs--respect-file-handlers (fn args-left)
|
||||||
|
"Respect file handlers.
|
||||||
|
FN is the function and ARGS-LEFT is the same argument as `command-line-1'.
|
||||||
|
Emacs processes command-line files very early in startup. These files may
|
||||||
|
include special paths like TRAMP paths, so restore `file-name-handler-alist' for
|
||||||
|
this stage of initialization."
|
||||||
|
(let ((file-name-handler-alist (if args-left
|
||||||
|
minimal-emacs--old-file-name-handler-alist
|
||||||
|
file-name-handler-alist)))
|
||||||
|
(funcall fn args-left)))
|
||||||
|
|
||||||
|
(defun minimal-emacs--restore-file-name-handler-alist ()
|
||||||
|
"Restore `file-name-handler-alist'."
|
||||||
|
(set-default-toplevel-value
|
||||||
|
'file-name-handler-alist
|
||||||
|
;; Merge instead of overwrite to preserve any changes made since startup.
|
||||||
|
(delete-dups (append file-name-handler-alist
|
||||||
|
minimal-emacs--old-file-name-handler-alist))))
|
||||||
|
|
||||||
|
(when (and minimal-emacs-optimize-file-name-handler-alist
|
||||||
|
(not minimal-emacs-debug)
|
||||||
|
(not noninteractive))
|
||||||
|
;; Determine the state of bundled libraries using calc-loaddefs.el. If
|
||||||
|
;; compressed, retain the gzip handler in `file-name-handler-alist`. If
|
||||||
|
;; compiled or neither, omit the gzip handler during startup for improved
|
||||||
|
;; startup and package load time.
|
||||||
|
(set-default-toplevel-value
|
||||||
|
'file-name-handler-alist
|
||||||
|
(if (locate-file-internal "calc-loaddefs.el" load-path)
|
||||||
|
nil
|
||||||
|
(list (rassq 'jka-compr-handler
|
||||||
|
minimal-emacs--old-file-name-handler-alist))))
|
||||||
|
|
||||||
|
;; Ensure the new value persists through any current let-binding.
|
||||||
|
(put 'file-name-handler-alist 'initial-value
|
||||||
|
minimal-emacs--old-file-name-handler-alist)
|
||||||
|
|
||||||
|
;; Emacs processes command-line files very early in startup. These files may
|
||||||
|
;; include special paths TRAMP. Restore `file-name-handler-alist'.
|
||||||
|
(advice-add 'command-line-1 :around #'minimal-emacs--respect-file-handlers)
|
||||||
|
|
||||||
|
(add-hook 'emacs-startup-hook #'minimal-emacs--restore-file-name-handler-alist
|
||||||
|
101))
|
||||||
|
|
||||||
|
;;; Performance: Inhibit redisplay
|
||||||
|
|
||||||
|
(defun minimal-emacs--reset-inhibit-redisplay ()
|
||||||
|
"Reset inhibit redisplay."
|
||||||
|
(setq-default inhibit-redisplay nil)
|
||||||
|
(remove-hook 'post-command-hook #'minimal-emacs--reset-inhibit-redisplay))
|
||||||
|
|
||||||
|
(when (and minimal-emacs-inhibit-redisplay-during-startup
|
||||||
|
(not noninteractive)
|
||||||
|
(not minimal-emacs-debug))
|
||||||
|
;; Suppress redisplay and redraw during startup to avoid delays and
|
||||||
|
;; prevent flashing an unstyled Emacs frame.
|
||||||
|
(setq-default inhibit-redisplay t)
|
||||||
|
(add-hook 'post-command-hook #'minimal-emacs--reset-inhibit-redisplay -100))
|
||||||
|
|
||||||
|
;;; Performance: Inhibit message
|
||||||
|
|
||||||
|
(defun minimal-emacs--reset-inhibit-message ()
|
||||||
|
"Reset inhibit message."
|
||||||
|
(setq-default inhibit-message nil)
|
||||||
|
(remove-hook 'post-command-hook #'minimal-emacs--reset-inhibit-message))
|
||||||
|
|
||||||
|
(when (and minimal-emacs-inhibit-message-during-startup
|
||||||
|
(not noninteractive)
|
||||||
|
(not minimal-emacs-debug))
|
||||||
|
(setq-default inhibit-message t)
|
||||||
|
(add-hook 'post-command-hook #'minimal-emacs--reset-inhibit-message -100))
|
||||||
|
|
||||||
|
;;; Performance: Disable mode-line during startup
|
||||||
|
|
||||||
|
(defvar-local minimal-emacs--hidden-mode-line nil
|
||||||
|
"Store the buffer-local value of `mode-line-format' during startup.")
|
||||||
|
|
||||||
|
(when (and minimal-emacs-disable-mode-line-during-startup
|
||||||
|
(not noninteractive)
|
||||||
|
(not minimal-emacs-debug))
|
||||||
|
(put 'mode-line-format
|
||||||
|
'initial-value (default-toplevel-value 'mode-line-format))
|
||||||
|
(setq-default mode-line-format nil)
|
||||||
|
(dolist (buf (buffer-list))
|
||||||
|
(with-current-buffer buf
|
||||||
|
(when (local-variable-p 'mode-line-format)
|
||||||
|
(setq minimal-emacs--hidden-mode-line mode-line-format)
|
||||||
|
(setq mode-line-format nil)))))
|
||||||
|
|
||||||
|
;;; Restore values
|
||||||
|
|
||||||
|
(defun minimal-emacs--startup-load-user-init-file (fn &rest args)
|
||||||
|
"Advice to reset `mode-line-format'. FN and ARGS are the function and args."
|
||||||
|
(unwind-protect
|
||||||
|
;; Start up as normal
|
||||||
|
(apply fn args)
|
||||||
|
;; If we don't undo inhibit-{message, redisplay} and there's an error, we'll
|
||||||
|
;; see nothing but a blank Emacs frame.
|
||||||
|
(when minimal-emacs-inhibit-message-during-startup
|
||||||
|
(setq-default inhibit-message nil))
|
||||||
|
(when minimal-emacs-inhibit-redisplay-during-startup
|
||||||
|
(setq-default inhibit-redisplay nil))
|
||||||
|
;; Restore the mode-line
|
||||||
|
(when minimal-emacs-disable-mode-line-during-startup
|
||||||
|
(unless (default-toplevel-value 'mode-line-format)
|
||||||
|
(setq-default mode-line-format (get 'mode-line-format
|
||||||
|
'initial-value)))
|
||||||
|
(dolist (buf (buffer-list))
|
||||||
|
(with-current-buffer buf
|
||||||
|
(when (local-variable-p 'minimal-emacs--hidden-mode-line)
|
||||||
|
(setq mode-line-format minimal-emacs--hidden-mode-line)
|
||||||
|
(kill-local-variable 'minimal-emacs--hidden-mode-line)))))))
|
||||||
|
|
||||||
|
(advice-add 'startup--load-user-init-file :around
|
||||||
|
#'minimal-emacs--startup-load-user-init-file)
|
||||||
|
|
||||||
|
;;; UI elements
|
||||||
|
|
||||||
|
(defun minimal-emacs--setup-toolbar (&rest _)
|
||||||
|
"Setup the toolbar."
|
||||||
|
(when (fboundp 'tool-bar-setup)
|
||||||
|
(advice-remove 'tool-bar-setup #'ignore)
|
||||||
|
(when (bound-and-true-p tool-bar-mode)
|
||||||
|
(funcall 'tool-bar-setup))))
|
||||||
|
|
||||||
|
(unless noninteractive
|
||||||
|
(setq frame-title-format minimal-emacs-frame-title-format
|
||||||
|
icon-title-format minimal-emacs-frame-title-format)
|
||||||
|
|
||||||
|
;; I intentionally avoid calling `menu-bar-mode', `tool-bar-mode', and
|
||||||
|
;; `scroll-bar-mode' because manipulating frame parameters can trigger or queue
|
||||||
|
;; a superfluous and potentially expensive frame redraw at startup, depending
|
||||||
|
;; on the window system. The variables must also be set to `nil' so users don't
|
||||||
|
;; have to call the functions twice to re-enable them.
|
||||||
|
(unless (memq 'menu-bar minimal-emacs-ui-features)
|
||||||
|
(push '(menu-bar-lines . 0) default-frame-alist)
|
||||||
|
(unless (memq window-system '(mac ns))
|
||||||
|
(setq menu-bar-mode nil)))
|
||||||
|
|
||||||
|
(when (fboundp 'tool-bar-setup)
|
||||||
|
;; Temporarily override the tool-bar-setup function to prevent it from
|
||||||
|
;; running during the initial stages of startup
|
||||||
|
(advice-add 'tool-bar-setup :override #'ignore)
|
||||||
|
|
||||||
|
(advice-add 'startup--load-user-init-file :after
|
||||||
|
#'minimal-emacs--setup-toolbar))
|
||||||
|
|
||||||
|
(unless (memq 'tool-bar minimal-emacs-ui-features)
|
||||||
|
(push '(tool-bar-lines . 0) default-frame-alist)
|
||||||
|
(setq tool-bar-mode nil))
|
||||||
|
|
||||||
|
(setq default-frame-scroll-bars 'right)
|
||||||
|
(push '(vertical-scroll-bars) default-frame-alist)
|
||||||
|
(push '(horizontal-scroll-bars) default-frame-alist)
|
||||||
|
(setq scroll-bar-mode nil)
|
||||||
|
|
||||||
|
(unless (memq 'tooltips minimal-emacs-ui-features)
|
||||||
|
(when (bound-and-true-p tooltip-mode)
|
||||||
|
(tooltip-mode -1)))
|
||||||
|
|
||||||
|
;; Disable GUIs because they are inconsistent across systems, desktop
|
||||||
|
;; environments, and themes, and they don't match the look of Emacs.
|
||||||
|
(unless (memq 'dialogs minimal-emacs-ui-features)
|
||||||
|
(setq use-file-dialog nil)
|
||||||
|
(setq use-dialog-box nil)))
|
||||||
|
|
||||||
|
;;; Security
|
||||||
|
(setq gnutls-verify-error t) ; Prompts if there are cert issues
|
||||||
|
(setq tls-checktrust gnutls-verify-error) ; Ensure SSL/TLS connections checks
|
||||||
|
(setq gnutls-min-prime-bits 3072) ; Stronger GnuTLS encryption
|
||||||
|
|
||||||
|
;; This results in a more compact output that emphasizes performance
|
||||||
|
(setq use-package-expand-minimally t)
|
||||||
|
|
||||||
|
;; (setq use-package-minimum-reported-time (if minimal-emacs-debug 0 0.1))
|
||||||
|
;; (setq use-package-verbose minimal-emacs-debug)
|
||||||
|
;; (setq use-package-always-ensure (not noninteractive))
|
||||||
|
;; (setq use-package-enable-imenu-support t)
|
||||||
|
|
||||||
|
;; package.el
|
||||||
|
(setq package-enable-at-startup nil) ; Let the init.el file handle this
|
||||||
|
;; (setq package-quickstart-file
|
||||||
|
;; (expand-file-name "package-quickstart.el" user-emacs-directory))
|
||||||
|
;; (setq package-archives '(("melpa" . "https://melpa.org/packages/")
|
||||||
|
;; ("gnu" . "https://elpa.gnu.org/packages/")
|
||||||
|
;; ("nongnu" . "https://elpa.nongnu.org/nongnu/")
|
||||||
|
;; ("melpa-stable" . "https://stable.melpa.org/packages/")))
|
||||||
|
;; (setq package-archive-priorities '(("gnu" . 99)
|
||||||
|
;; ("nongnu" . 80)
|
||||||
|
;; ("melpa" . 70)
|
||||||
|
;; ("melpa-stable" . 50)))
|
||||||
|
|
||||||
|
;;; Load post-early-init.el
|
||||||
|
|
||||||
|
(when minimal-emacs-load-post-early-init
|
||||||
|
(minimal-emacs-load-user-init "post-early-init.el"))
|
||||||
|
|
||||||
|
;; Local variables:
|
||||||
|
;; byte-compile-warnings: (not obsolete free-vars)
|
||||||
|
;; End:
|
||||||
|
|
||||||
|
;;; early-init.el ends here
|
||||||
|
|||||||
@@ -38,10 +38,8 @@
|
|||||||
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
|
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
|
||||||
(add-hook 'after-init-hook #'elpaca-process-queues)
|
(add-hook 'after-init-hook #'elpaca-process-queues)
|
||||||
(elpaca `(,@elpaca-order))
|
(elpaca `(,@elpaca-order))
|
||||||
;;(elpaca-wait)
|
|
||||||
(elpaca benchmark-init)
|
(elpaca benchmark-init)
|
||||||
(elpaca-wait)
|
(elpaca-wait)
|
||||||
|
|
||||||
(benchmark-init/activate)
|
(benchmark-init/activate)
|
||||||
|
|
||||||
;; emacs 30 fix
|
;; emacs 30 fix
|
||||||
@@ -53,12 +51,13 @@
|
|||||||
|
|
||||||
(elpaca compat)
|
(elpaca compat)
|
||||||
(elpaca general) ;Keybindings
|
(elpaca general) ;Keybindings
|
||||||
(elpaca vertico) ;Vertical completion
|
(elpaca vertico) ;vertical minibuffer
|
||||||
|
(elpaca vertico-posframe) ;hover
|
||||||
(elpaca orderless) ;Filtering for Consult/Vertico
|
(elpaca orderless) ;Filtering for Consult/Vertico
|
||||||
(elpaca marginalia) ;Annotations in the minibuffer
|
(elpaca marginalia) ;Annotations in the minibuffer
|
||||||
(elpaca corfu) ;In-buffer completion
|
(elpaca corfu) ;In-buffer completion
|
||||||
(elpaca corfu-terminal) ;necessary for popup on emacs <31
|
;;(elpaca corfu-terminal) ;necessary for popup on emacs <31 ; codeberg not cooperating.
|
||||||
(elpaca-wait) ;Ensure UI is ready before loading tools
|
;;(elpaca-wait) ;Ensure UI is ready before loading tools
|
||||||
(elpaca nerd-icons)
|
(elpaca nerd-icons)
|
||||||
(elpaca nerd-icons-completion)
|
(elpaca nerd-icons-completion)
|
||||||
(elpaca nerd-icons-dired)
|
(elpaca nerd-icons-dired)
|
||||||
@@ -70,34 +69,37 @@
|
|||||||
;; EDITING & NAVIGATION
|
;; EDITING & NAVIGATION
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
|
|
||||||
(elpaca meow) ; Modal editing
|
;;(elpaca meow) ; Modal editing
|
||||||
|
(elpaca god-mode) ; psuedo modal editing
|
||||||
|
(elpaca multiple-cursors)
|
||||||
(elpaca avy) ; Fast jumping
|
(elpaca avy) ; Fast jumping
|
||||||
(elpaca smartparens)
|
(elpaca surround) ; utilties around surround selection
|
||||||
;;(elpaca expand-region) ; replaced by expreg
|
(elpaca expreg) ; expand selection
|
||||||
(elpaca expreg) ;expand selection
|
|
||||||
(elpaca undo-fu)
|
(elpaca undo-fu)
|
||||||
(elpaca vundo) ; Visual undo tree
|
(elpaca vundo) ; Visual undo tree
|
||||||
(elpaca xclip)
|
(elpaca xclip)
|
||||||
(elpaca clipetty)
|
(elpaca clipetty) ; clipboard stuff TUI-GUI-Wayland
|
||||||
(elpaca embark) ; Contextual actions
|
(elpaca embark) ; Contextual actions
|
||||||
(elpaca embark-consult)
|
(elpaca embark-consult)
|
||||||
(elpaca lsp-embark)
|
(elpaca wgrep) ; allow writeable grep buffers
|
||||||
(elpaca kirigami) ; Selection/Editing
|
;(elpaca lsp-embark)
|
||||||
(elpaca jinx) ; Fast duplicate lines
|
(elpaca kirigami) ; folding meta utility
|
||||||
|
(elpaca pcre2el) ; fix regex
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
;; CODE ANALYSIS & VISUALS
|
;; CODE ANALYSIS & VISUALS
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
|
|
||||||
(elpaca treesit-auto)
|
(elpaca treesit-auto) ; automatically install treesitter grammars
|
||||||
(elpaca treesit-fold)
|
(elpaca treesit-fold) ; folding based on treesit
|
||||||
(elpaca highlight-quoted)
|
(elpaca highlight-quoted) ; emacs
|
||||||
(elpaca highlight-defined)
|
(elpaca highlight-defined) ; emacs
|
||||||
(elpaca color-identifiers-mode)
|
(elpaca color-identifiers-mode) ; emacs
|
||||||
(elpaca rainbow-delimiters)
|
(elpaca highlight-parentheses) ; delimiters around point
|
||||||
(elpaca indent-bars)
|
(elpaca rainbow-delimiters) ; rainbow colours for pairs
|
||||||
(elpaca outline-indent)
|
(elpaca indent-bars) ; show indentation bars
|
||||||
|
(elpaca outline-indent) ;
|
||||||
|
(elpaca (svg-margin :repo "chiply/svg-margin"
|
||||||
|
:host github))
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
;; LSP & DEVELOPMENT
|
;; LSP & DEVELOPMENT
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
@@ -105,8 +107,9 @@
|
|||||||
(elpaca mason) ; LSP server manager
|
(elpaca mason) ; LSP server manager
|
||||||
(elpaca lsp-mode)
|
(elpaca lsp-mode)
|
||||||
(elpaca lsp-ui)
|
(elpaca lsp-ui)
|
||||||
(elpaca consult-lsp)
|
|
||||||
(elpaca flycheck)
|
(elpaca flycheck)
|
||||||
|
(elpaca consult-lsp)
|
||||||
|
(elpaca consult-flycheck)
|
||||||
(elpaca yasnippet)
|
(elpaca yasnippet)
|
||||||
(elpaca yasnippet-snippets)
|
(elpaca yasnippet-snippets)
|
||||||
|
|
||||||
@@ -118,19 +121,24 @@
|
|||||||
(elpaca csv-mode)
|
(elpaca csv-mode)
|
||||||
(elpaca arduino-mode)
|
(elpaca arduino-mode)
|
||||||
(elpaca nix-mode)
|
(elpaca nix-mode)
|
||||||
|
(elpaca web-mode)
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
;; UTILITIES
|
;; UTILITIES
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
|
|
||||||
(elpaca consult) ; Enhanced search/navigation
|
(elpaca consult) ; Enhanced search/navigation
|
||||||
(elpaca vterm)
|
(elpaca ghostel) ; terminal
|
||||||
(elpaca vterm-toggle)
|
(elpaca shell-pop)
|
||||||
(elpaca colorful-mode)
|
(elpaca colorful-mode) ; colourise color codes
|
||||||
(elpaca (dirvish :repo "latiagertrutis/dirvish"
|
(elpaca (dirvish :repo "latiagertrutis/dirvish"
|
||||||
:host github)) ; broken on emacs 30, fixed by using fork
|
:host github)) ; broken on emacs 30, fixed by using fork
|
||||||
(elpaca transient)
|
(elpaca (dired-clipboard :repo "kn66/dired-clipboard.el" ;system clipboard in dired
|
||||||
(elpaca magit)
|
:host github))
|
||||||
(elpaca transpose-frame)
|
(elpaca transient) ; bindings in modes
|
||||||
|
(elpaca magit) ; git client
|
||||||
|
(elpaca transpose-frame) ; edit frame layout
|
||||||
|
(elpaca jit-spell) ; spellcheck
|
||||||
|
(elpaca sudo-edit) ; sudo util
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
;; KNOWLEDGE MANAGEMENT (ZK/DENOTE)
|
;; KNOWLEDGE MANAGEMENT (ZK/DENOTE)
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
@@ -141,6 +149,8 @@
|
|||||||
(elpaca zk)
|
(elpaca zk)
|
||||||
(elpaca zk-index)
|
(elpaca zk-index)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
;; ELPACA CONFIGURATION
|
;; ELPACA CONFIGURATION
|
||||||
;; ==============================================================================
|
;; ==============================================================================
|
||||||
@@ -157,21 +167,16 @@
|
|||||||
;; Your init file should contain only one such instance.
|
;; Your init file should contain only one such instance.
|
||||||
;; If there is more than one, they won't work right.
|
;; If there is more than one, they won't work right.
|
||||||
'(custom-safe-themes
|
'(custom-safe-themes
|
||||||
'("c9afaac8aedf1bb721d21053a79a65969fd8f44314d22ff29c8981709ee4245f"
|
'("312bc908e53b07c97cbe1e09521e44c560d457c34399fe19f2dbf5a052104207")))
|
||||||
"0672d7fbe7fa24344bbe98461a8db26cb52a074354f9a4529cea4ba1af456044"
|
|
||||||
"664111db1521fe3351061dc87aea95fa98b3f244f4b830fbc048d39c3a8bc125"
|
|
||||||
"df7b90a88131500ce9e5a911c815ce96eb7855d88747830f298c6914d80be48e"
|
|
||||||
"4fa3b7b09062f707a4770804dda9dda4807aa5c86623076b9741897df2e7acdd"
|
|
||||||
"5bfc7c010e3ee71396e421c2e8a5a561c305da812eba9e0e48742896d8e45d97"
|
|
||||||
"48cebeaf733cae05b5265eceafea44c042f2fc65906ccd999f652d230be25b6f"
|
|
||||||
"1b4f5bebc7f47257997a8d56e797e2e8d85581bbd824a275bb1ebc7aea7c1399"
|
|
||||||
"a7dab7ccf5c97be13a1d957e8847cfda7cf768554595429a43f6b6393459c45e"
|
|
||||||
"ca223796522e77b1813111ad2994b8e579df1000d1e3c34b604fe0a18ad45dec"
|
|
||||||
default)))
|
|
||||||
(custom-set-faces
|
(custom-set-faces
|
||||||
;; custom-set-faces was added by Custom.
|
;; custom-set-faces was added by Custom.
|
||||||
;; If you edit it by hand, you could mess it up, so be careful.
|
;; If you edit it by hand, you could mess it up, so be careful.
|
||||||
;; Your init file should contain only one such instance.
|
;; Your init file should contain only one such instance.
|
||||||
;; If there is more than one, they won't work right.
|
;; If there is more than one, they won't work right.
|
||||||
'(meow-insert-cursor ((t (:inherit unspecified :background "#c75e10"))))
|
)
|
||||||
'(meow-normal-cursor ((t (:foreground "#7cc9f2" :background "#f8f8ff")))))
|
|
||||||
|
|
||||||
|
(setq minimal-emacs--success t)
|
||||||
|
|
||||||
|
(setq initial-major-mode 'fundamental-mode
|
||||||
|
initial-scratch-message nil)
|
||||||
|
|||||||
@@ -12,9 +12,59 @@
|
|||||||
(corfu-auto-prefix 2)
|
(corfu-auto-prefix 2)
|
||||||
(corfu-popupinfo-delay '(0.5 . 0.3)))
|
(corfu-popupinfo-delay '(0.5 . 0.3)))
|
||||||
|
|
||||||
|
;; (use-package corfu-terminal
|
||||||
|
;; :after corfu
|
||||||
|
;; :init
|
||||||
|
;; (unless (display-graphic-p)
|
||||||
|
;; (corfu-terminal-mode +1)))
|
||||||
|
|
||||||
(use-package vertico
|
(use-package vertico
|
||||||
:init
|
:init
|
||||||
(vertico-mode))
|
(vertico-mode)
|
||||||
|
:config
|
||||||
|
(vertico-multiform-mode t)
|
||||||
|
|
||||||
|
(setq vertico-multiform-commands
|
||||||
|
'(
|
||||||
|
(consult-imenu posframe indexed)
|
||||||
|
(consult-completion-in-region grid)))
|
||||||
|
)
|
||||||
|
|
||||||
|
;; Configure directory extension.
|
||||||
|
(use-package vertico-directory
|
||||||
|
:after vertico
|
||||||
|
:ensure nil
|
||||||
|
;; More convenient directory navigation commands
|
||||||
|
:bind (:map vertico-map
|
||||||
|
("RET" . vertico-directory-enter)
|
||||||
|
("DEL" . vertico-directory-delete-char)
|
||||||
|
("M-DEL" . vertico-directory-delete-word))
|
||||||
|
;; Tidy shadowed file names
|
||||||
|
:hook (rfn-eshadow-update-overlay . vertico-directory-tidy))
|
||||||
|
|
||||||
|
(use-package vertico-posframe
|
||||||
|
:after vertico
|
||||||
|
:config
|
||||||
|
(vertico-posframe-mode t)
|
||||||
|
|
||||||
|
(setq vertico-posframe-width 150
|
||||||
|
vertico-posframe-min-width 90
|
||||||
|
vertico-posframe-border-width 3
|
||||||
|
vertico-count 15
|
||||||
|
vertico-scroll-margin 4)
|
||||||
|
)
|
||||||
|
|
||||||
|
;use consult + vertico instead of corfu if in terminal
|
||||||
|
(use-package consult
|
||||||
|
:defer t
|
||||||
|
:init
|
||||||
|
(setq completion-in-region-function #'consult-completion-in-region
|
||||||
|
consult-fd-args '("fd" "--color=never" "--hidden" ))
|
||||||
|
:config
|
||||||
|
(add-hook 'after-change-major-mode-hook
|
||||||
|
(lambda ()
|
||||||
|
(setq completion-in-region-function #'consult-completion-in-regionc)))
|
||||||
|
)
|
||||||
|
|
||||||
(use-package marginalia
|
(use-package marginalia
|
||||||
:init
|
:init
|
||||||
@@ -23,7 +73,6 @@
|
|||||||
(use-package orderless
|
(use-package orderless
|
||||||
:custom
|
:custom
|
||||||
(completion-styles '(orderless basic))
|
(completion-styles '(orderless basic))
|
||||||
(completion-category-overrides '((file (styles partial-completion))))
|
|
||||||
(completion-pcm-leading-wildcard t))
|
(completion-pcm-leading-wildcard t))
|
||||||
|
|
||||||
(provide 'completion-packages)
|
(provide 'completion-packages)
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
;; Tree-sitter & LSP tweaks (Core transformative changes)
|
||||||
|
|
||||||
|
(use-package treesit-auto
|
||||||
|
:functions global-treesit-auto-mode
|
||||||
|
:config
|
||||||
|
(treesit-auto-add-to-auto-mode-alist 'all)
|
||||||
|
:hook (after-init . global-treesit-auto-mode)
|
||||||
|
:custom
|
||||||
|
(treesit-auto-install 'prompt)
|
||||||
|
)
|
||||||
|
|
||||||
|
(use-package treesit-fold
|
||||||
|
:defer t
|
||||||
|
: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))
|
||||||
|
|
||||||
|
;; Tree-sitter hooks
|
||||||
|
(dolist (hook '(c-ts-mode-hook c++-ts-mode-hook java-ts-mode-hook rust-ts-mode-hook
|
||||||
|
go-ts-mode-hook ruby-ts-mode-hook js-ts-mode-hook typescript-ts-mode-hook
|
||||||
|
tsx-ts-mode-hook css-ts-mode-hook html-ts-mode-hook bash-ts-mode-hook
|
||||||
|
cmake-ts-mode-hook dockerfile-ts-mode-hook json-ts-mode-hook toml-ts-mode-hook yaml-ts-mode-hook))
|
||||||
|
(add-hook hook #'treesit-fold-mode))
|
||||||
|
|
||||||
|
(with-eval-after-load 'treesit
|
||||||
|
(setq treesit-font-lock-level 4))
|
||||||
|
|
||||||
|
(use-package mason
|
||||||
|
:defer t
|
||||||
|
:config
|
||||||
|
(mason-setup))
|
||||||
|
|
||||||
|
(use-package lsp-mode
|
||||||
|
:defer t
|
||||||
|
:hook ((c-mode . lsp-deferred)
|
||||||
|
(c++-mode . lsp-deferred)
|
||||||
|
(c-ts-mode . lsp-deferred)
|
||||||
|
(c++-ts-mode . lsp-deferred)
|
||||||
|
(typescript-ts-mode . lsp-deferred)
|
||||||
|
(js-ts-mode . lsp-deferred)
|
||||||
|
(tsx-ts-mode . lsp-deferred)
|
||||||
|
(arduino-mode . lsp-deferred)
|
||||||
|
(toml-ts-mode . lsp-deferred)
|
||||||
|
(json-ts-mode . lsp-deferred)
|
||||||
|
(lsp-mode . lsp-enable-which-key-integration))
|
||||||
|
:commands lsp
|
||||||
|
:init
|
||||||
|
(setq lsp-keymap-prefix "C-l")
|
||||||
|
:config
|
||||||
|
(setq lsp-clients-clangd-executable "clangd"
|
||||||
|
lsp-clangd-binary-path "/usr/bin/clangd"
|
||||||
|
lsp-clients--clangd-default-executable "/usr/bind/clangd"
|
||||||
|
lsp-completion-provider :none
|
||||||
|
lsp-clients-clangd-args '("--header-insertion=iwyu" "--fallback-style=LLVM")
|
||||||
|
)
|
||||||
|
|
||||||
|
(with-eval-after-load 'lsp-mode
|
||||||
|
(define-key lsp-command-map (kbd "a") #'lsp-execute-code-action)
|
||||||
|
(define-key lsp-command-map (kbd "d") #'lsp-ui-doc-glance)
|
||||||
|
(define-key lsp-command-map (kbd "r") #'lsp-rename)
|
||||||
|
|
||||||
|
;; Safe Capability Filter: Handles both association list (alist) and hash-table formats
|
||||||
|
(advice-add 'lsp--client-capabilities :filter-return
|
||||||
|
(lambda (caps)
|
||||||
|
(cond
|
||||||
|
;; If it's a hash table
|
||||||
|
((hash-table-p caps)
|
||||||
|
(when-let ((text-doc (gethash "textDocument" caps)))
|
||||||
|
(if (hash-table-p text-doc)
|
||||||
|
(remhash "inlineCompletion" text-doc)
|
||||||
|
(setcdr (assoc "inlineCompletion" text-doc) nil))))
|
||||||
|
;; If it's an association list (alist)
|
||||||
|
((listp caps)
|
||||||
|
(when-let ((text-doc (cdr (assoc 'textDocument caps))))
|
||||||
|
(setcdr (assoc 'textDocument caps)
|
||||||
|
(assq-delete-all 'inlineCompletion text-doc)))))
|
||||||
|
caps))
|
||||||
|
|
||||||
|
;; Set up arduino-mode safely after lsp-mode is loaded
|
||||||
|
(add-to-list 'lsp-language-id-configuration '(arduino-mode . "cpp"))
|
||||||
|
(lsp-register-client
|
||||||
|
(make-lsp-client
|
||||||
|
:new-connection (lsp-stdio-connection '("clangd" "--header-insertion=never"))
|
||||||
|
:activation-fn (lsp-activate-on "arduino")
|
||||||
|
:server-id 'lsp-arduino-clangd
|
||||||
|
))))
|
||||||
|
|
||||||
|
(use-package lsp-ui
|
||||||
|
:defer t
|
||||||
|
:after lsp-mode
|
||||||
|
:commands lsp-ui-mode
|
||||||
|
:init
|
||||||
|
(setq lsp-ui-sideline-show-symbol t
|
||||||
|
lsp-ui-side-show-code-actions t
|
||||||
|
lsp-ui-sideline-show-hover t
|
||||||
|
|
||||||
|
lsp-ui-doc-enable t
|
||||||
|
lsp-ui-doc-delay 1
|
||||||
|
lsp-ui-doc-position 'at-point
|
||||||
|
lsp-ui-sideline-show-hover t
|
||||||
|
lsp-ui-sideline-show-diagnostics t
|
||||||
|
lsp-ui-side-show-code-actions t
|
||||||
|
lsp-ui-sideline-delay 0.25
|
||||||
|
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(with-eval-after-load 'lsp-mode
|
||||||
|
(add-to-list 'lsp-disabled-clients 'tailwindcss))
|
||||||
|
|
||||||
|
(provide 'dev-packages)
|
||||||
@@ -1,27 +1,37 @@
|
|||||||
;;; editing-packages.el --- Editing and navigation configuration -*- lexical-binding: t; -*-
|
;;; editing-packages.el --- Editing and navigation configuration -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
(use-package meow
|
|
||||||
:config
|
|
||||||
(setq meow-use-clipboard nil
|
|
||||||
meow--kbd-kill-region "C-S-x")
|
|
||||||
(meow-setup)
|
|
||||||
(meow-global-mode 1)
|
|
||||||
)
|
|
||||||
|
|
||||||
(use-package avy
|
(use-package avy
|
||||||
|
:defer t
|
||||||
:config
|
:config
|
||||||
(setq avy-timeout-seconds 0.25
|
(setq avy-timeout-seconds 0.25
|
||||||
avy-style 'at-full
|
avy-style 'at-full
|
||||||
avy-keys (number-sequence ?a ?z)))
|
avy-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l ?A ?S ?D ?F ?G ?H ?J ?K ?L)
|
||||||
|
avy-orders-alist nil)
|
||||||
|
)
|
||||||
|
|
||||||
(use-package smartparens
|
(use-package surround
|
||||||
:config
|
:defer t
|
||||||
(smartparens-global-mode 1))
|
:bind-keymap ("M-'" . surround-keymap)) ; Or bind to a prefix in general-def
|
||||||
|
|
||||||
(use-package kirigami
|
(use-package kirigami
|
||||||
|
:defer t
|
||||||
:commands (kirigami-open-fold kirigami-open-fold-rec kirigami-close-fold
|
:commands (kirigami-open-fold kirigami-open-fold-rec kirigami-close-fold
|
||||||
kirigami-toggle-fold kirigami-open-folds
|
kirigami-toggle-fold kirigami-open-folds
|
||||||
kirigami-close-folds-except-current
|
kirigami-close-folds-except-current
|
||||||
kirigami-close-folds))
|
kirigami-close-folds))
|
||||||
|
|
||||||
|
(use-package embark
|
||||||
|
:defer t
|
||||||
|
:bind
|
||||||
|
(("M-m" . embark-act)
|
||||||
|
("C-h B" . embark-bindings)
|
||||||
|
)
|
||||||
|
:config
|
||||||
|
(add-to-list 'display-buffer-alist
|
||||||
|
'("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*"
|
||||||
|
nil
|
||||||
|
(window-parameters (mode-line-format . none))))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
(provide 'editing-packages)
|
(provide 'editing-packages)
|
||||||
|
|||||||
+24
-12
@@ -3,25 +3,37 @@
|
|||||||
(use-package clipetty
|
(use-package clipetty
|
||||||
:hook (after-init . global-clipetty-mode))
|
:hook (after-init . global-clipetty-mode))
|
||||||
|
|
||||||
|
|
||||||
(use-package dirvish
|
(use-package dirvish
|
||||||
:defer t
|
|
||||||
:config
|
:config
|
||||||
(dirvish-peek-mode)
|
(dirvish-peek-mode)
|
||||||
(dirvish-side-follow-mode)
|
(dirvish-side-follow-mode)
|
||||||
(add-hook 'dirvish-directory-view-mode 'diredfl-mode))
|
(add-hook 'dirvish-directory-view-mode 'diredfl-mode)
|
||||||
|
(with-eval-after-load 'dirvish
|
||||||
|
(define-key dirvish-mode-map (kbd "a") #'dirvish-setup-menu)
|
||||||
|
(define-key dirvish-mode-map (kbd "v") #'dirvish-move))
|
||||||
|
)
|
||||||
|
|
||||||
(use-package embark
|
(use-package shell-pop
|
||||||
|
:defer t
|
||||||
|
:custom
|
||||||
|
;(shell-pop-universal-key "C-s s")
|
||||||
|
(shell-pop-window-position "bottom")
|
||||||
|
(shell-pop-term-shell shell-file-name)
|
||||||
|
(shell-pop-window-size 50)
|
||||||
|
)
|
||||||
|
|
||||||
:bind
|
(with-eval-after-load 'shell-pop
|
||||||
(("C-." . embark-act)
|
(setopt shell-pop-shell-type '("ghostel" "*ghostel*"
|
||||||
("C-h B" . embark-bindings)
|
(lambda ()
|
||||||
)
|
(when (fboundp 'ghostel)
|
||||||
|
(let ((ghostel-shell shell-pop-term-shell))
|
||||||
|
(ghostel)))))))
|
||||||
|
|
||||||
|
(use-package dired-clipboard
|
||||||
|
:hook (dired-mode . dired-clipboard-mode)
|
||||||
:config
|
:config
|
||||||
(add-to-list 'display-buffer-alist
|
(setq dired-clipboard-use-wl-copy t
|
||||||
'("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*"
|
dired-clipboard-wayland-target 'uri-list)
|
||||||
nil
|
|
||||||
(window-parameters (mode-line-format . none))))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
(use-package benchmark-init
|
(use-package benchmark-init
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
|
|
||||||
(use-package denote
|
(use-package denote
|
||||||
|
:defer t
|
||||||
:config
|
:config
|
||||||
(setq denote-directory (list (expand-file-name "~/lyfi/SOR/Notes/"))
|
(setq denote-directory (list (expand-file-name "~/lyrinv/SOR/Notes/"))
|
||||||
denote-file-type 'markdown-yaml
|
denote-file-type 'markdown-yaml
|
||||||
denote-prompts '(title subdirectory keywords)))
|
denote-prompts '(title subdirectory keywords))
|
||||||
|
)
|
||||||
(use-package jinx
|
|
||||||
:hook (emacs-startup . global-jinx-mode)
|
|
||||||
:custom (jinx-languages "en_US nl_NL"))
|
|
||||||
|
|
||||||
(provide 'tutilities-packages)
|
(provide 'tutilities-packages)
|
||||||
|
|||||||
@@ -1,40 +1,5 @@
|
|||||||
;;; visuals-packages.el --- Visual and structural configuration -*- lexical-binding: t; -*-
|
;;; visuals-packages.el --- Visual and structural configuration -*- lexical-binding: t; -*-
|
||||||
|
t
|
||||||
(use-package treesit-auto
|
|
||||||
:functions global-treesit-auto-mode
|
|
||||||
:config
|
|
||||||
(treesit-auto-add-to-auto-mode-alist 'all)
|
|
||||||
:hook (after-init . global-treesit-auto-mode)
|
|
||||||
:custom
|
|
||||||
(treesit-auto-install 'prompt)
|
|
||||||
)
|
|
||||||
|
|
||||||
(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))
|
|
||||||
|
|
||||||
;; Tree-sitter hooks
|
|
||||||
(dolist (hook '(c-ts-mode-hook c++-ts-mode-hook java-ts-mode-hook rust-ts-mode-hook
|
|
||||||
go-ts-mode-hook ruby-ts-mode-hook js-ts-mode-hook typescript-ts-mode-hook
|
|
||||||
tsx-ts-mode-hook css-ts-mode-hook html-ts-mode-hook bash-ts-mode-hook
|
|
||||||
cmake-ts-mode-hook dockerfile-ts-mode-hook json-ts-mode-hook toml-ts-mode-hook))
|
|
||||||
(add-hook hook #'treesit-fold-mode))
|
|
||||||
|
|
||||||
(use-package highlight-quoted
|
(use-package highlight-quoted
|
||||||
:hook (emacs-lisp-mode . highlight-quoted-mode))
|
:hook (emacs-lisp-mode . highlight-quoted-mode))
|
||||||
|
|
||||||
@@ -49,6 +14,17 @@
|
|||||||
(prog-mode . rainbow-delimiters-mode)
|
(prog-mode . rainbow-delimiters-mode)
|
||||||
(inferior-ess-mode . rainbow-delimiters-mode))
|
(inferior-ess-mode . rainbow-delimiters-mode))
|
||||||
|
|
||||||
|
(use-package highlight-parentheses
|
||||||
|
:hook (prog-mode . highlight-parentheses-mode)
|
||||||
|
:config
|
||||||
|
(setq highlight-parentheses-colors
|
||||||
|
'("grey95" "#111" "#333" "#666")
|
||||||
|
highlight-parentheses-background-colors
|
||||||
|
'("#111" "blue" "green" "red")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
(use-package indent-bars
|
(use-package indent-bars
|
||||||
:config
|
:config
|
||||||
(setq indent-bars-prefer-character ?.
|
(setq indent-bars-prefer-character ?.
|
||||||
@@ -57,11 +33,12 @@
|
|||||||
indent-bars-pad-frac 0.2
|
indent-bars-pad-frac 0.2
|
||||||
indent-bars-color-by-depth '(:regexp "outline-\\([0-9]+\\)" :blend 0.9)
|
indent-bars-color-by-depth '(:regexp "outline-\\([0-9]+\\)" :blend 0.9)
|
||||||
indent-bars-highlight-current-depth '(:face default :blend 0.4))
|
indent-bars-highlight-current-depth '(:face default :blend 0.4))
|
||||||
(add-hook 'prog-mode-hook #'indent-bars-mode)
|
;(add-hook 'prog-mode-hook #'indent-bars-mode)
|
||||||
:hook (prog-mode . indent-bars-mode))
|
:hook (prog-mode . indent-bars-mode))
|
||||||
|
|
||||||
|
|
||||||
(use-package colorful-mode
|
(use-package colorful-mode
|
||||||
|
:defer t
|
||||||
:config (setq colorful-allow-mouse-clicks nil))
|
:config (setq colorful-allow-mouse-clicks nil))
|
||||||
|
|
||||||
(use-package doom-modeline
|
(use-package doom-modeline
|
||||||
@@ -71,7 +48,9 @@
|
|||||||
:config
|
:config
|
||||||
(setq
|
(setq
|
||||||
doom-modeline-minor-modes t
|
doom-modeline-minor-modes t
|
||||||
doom-modeline-indent-info t)
|
doom-modeline-indent-info t
|
||||||
|
doom-modeline-column-zero-based t
|
||||||
|
doom-modeline-position-column-line-format '("%l:%c"))
|
||||||
)
|
)
|
||||||
|
|
||||||
;;---
|
;;---
|
||||||
@@ -79,17 +58,20 @@
|
|||||||
;;---
|
;;---
|
||||||
|
|
||||||
(use-package nerd-icons-completion
|
(use-package nerd-icons-completion
|
||||||
|
:defer t
|
||||||
:after marginalia
|
:after marginalia
|
||||||
:config
|
:config
|
||||||
(nerd-icons-completion-mode)
|
(nerd-icons-completion-mode)
|
||||||
(add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup))
|
(add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup))
|
||||||
|
|
||||||
(use-package nerd-icons-corfu
|
(use-package nerd-icons-corfu
|
||||||
|
:defer t
|
||||||
:after corfu
|
:after corfu
|
||||||
:config
|
:config
|
||||||
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
|
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
|
||||||
|
|
||||||
(use-package nerd-icons-dired
|
(use-package nerd-icons-dired
|
||||||
|
:defer t
|
||||||
:config
|
:config
|
||||||
(nerd-icons-dired-mode)
|
(nerd-icons-dired-mode)
|
||||||
(add-hook 'dired-mode-hook #'nerd-icons-dired-mode))
|
(add-hook 'dired-mode-hook #'nerd-icons-dired-mode))
|
||||||
|
|||||||
@@ -0,0 +1,180 @@
|
|||||||
|
;;; cutarv42-theme.el --- A high-contrast light theme with blue/pink accents -*- lexical-binding: t; no-byte-compile: t; -*-
|
||||||
|
|
||||||
|
(deftheme cutarv42
|
||||||
|
"A high-contrast light theme with blue/pink accents, optimized for clarity and syntax highlighting.")
|
||||||
|
|
||||||
|
(let* (;; --- 1. Primitive Palette (Raw Colors) ---
|
||||||
|
(pure-white "#f8f8ff")
|
||||||
|
(pure-black "#010101")
|
||||||
|
(deep-blue "#007cbf")
|
||||||
|
(mid-blue "#2374de")
|
||||||
|
(soft-pink "#ef89df")
|
||||||
|
(deep-purple "#a64dd6")
|
||||||
|
(raw-magenta "#b05197")
|
||||||
|
(burnt-amber "#e58e40")
|
||||||
|
(duck-blue "#007a94")
|
||||||
|
(forest-green "#429e66")
|
||||||
|
(bright-green "#2cd45c")
|
||||||
|
(crimson-red "#cf3f29")
|
||||||
|
(soft-red "#f07b69")
|
||||||
|
(deep-orange "#ee7722")
|
||||||
|
(light-blue "#7cc9f2")
|
||||||
|
(light-grey "#f9f9f9")
|
||||||
|
(mid-grey "#888888")
|
||||||
|
(dark-grey "#444444")
|
||||||
|
(faint-purple "#eeccee")
|
||||||
|
|
||||||
|
;; --- 2. Semantic Palette (Functional Roles) ---
|
||||||
|
;; Base UI
|
||||||
|
(bg-main pure-white)
|
||||||
|
(fg-main pure-black)
|
||||||
|
(ui-accent soft-pink)
|
||||||
|
(ui-hl-line faint-purple)
|
||||||
|
(ui-selection light-blue)
|
||||||
|
(ui-border raw-magenta)
|
||||||
|
(ui-muted mid-grey)
|
||||||
|
|
||||||
|
;; Syntax Roles
|
||||||
|
(syntax-keyword duck-blue)
|
||||||
|
(syntax-string forest-green)
|
||||||
|
(syntax-variable mid-blue)
|
||||||
|
(syntax-type deep-purple)
|
||||||
|
(syntax-constant burnt-amber)
|
||||||
|
(syntax-builtin deep-orange)
|
||||||
|
(syntax-comment "#666666") ;; Standard grey for comments
|
||||||
|
(syntax-comment-d bright-green) ;; Delimiter color
|
||||||
|
(syntax-function deep-blue)
|
||||||
|
|
||||||
|
;; Status / Feedback
|
||||||
|
(status-error crimson-red)
|
||||||
|
(status-warning soft-red)
|
||||||
|
(status-info deep-orange)
|
||||||
|
(status-success bright-green)
|
||||||
|
(status-highlight deep-blue)
|
||||||
|
|
||||||
|
;; Theme Class
|
||||||
|
(class '((class color) (min-colors 256))))
|
||||||
|
|
||||||
|
(custom-theme-set-faces
|
||||||
|
'cutarv42
|
||||||
|
|
||||||
|
;; --- Core UI ---
|
||||||
|
`(default ((,class (:background ,bg-main :foreground ,fg-main))))
|
||||||
|
`(cursor ((,class (:background ,bg-main :foreground ,bg-main))))
|
||||||
|
`(fringe ((,class (:background ,bg-main :foreground ,status-highlight))))
|
||||||
|
`(region ((,class (:background ,ui-accent))))
|
||||||
|
`(highlight ((,class (:background ,ui-selection :foreground ,bg-main))))
|
||||||
|
`(hl-line ((,class (:background ,ui-hl-line :extend t))))
|
||||||
|
`(link ((,class (:foreground ,syntax-keyword :underline t))))
|
||||||
|
`(link-visited ((,class (:foreground ,syntax-type :underline t))))
|
||||||
|
`(minibuffer-prompt ((,class (:foreground ,status-highlight :weight bold))))
|
||||||
|
`(vertical-border ((,class (:foreground ,ui-border))))
|
||||||
|
|
||||||
|
;; --- Syntax Highlighting (Font Lock) ---
|
||||||
|
`(font-lock-comment-face ((,class (:foreground ,syntax-comment :slant italic))))
|
||||||
|
`(font-lock-doc-face ((,class (:inherit font-lock-comment-face))))
|
||||||
|
`(font-lock-comment-delimiter-face ((,class (:foreground ,syntax-comment-d :slant italic))))
|
||||||
|
`(font-lock-string-face ((,class (:foreground ,syntax-string))))
|
||||||
|
`(font-lock-type-face ((,class (:foreground ,syntax-type))))
|
||||||
|
`(font-lock-keyword-face ((,class (:foreground ,syntax-keyword :weight bold))))
|
||||||
|
`(font-lock-function-name-face ((,class (:foreground ,syntax-function :weight bold))))
|
||||||
|
`(font-lock-variable-name-face ((,class (:foreground ,syntax-variable))))
|
||||||
|
`(font-lock-constant-face ((,class (:foreground ,syntax-constant))))
|
||||||
|
`(font-lock-builtin-face ((,class (:foreground ,syntax-builtin))))
|
||||||
|
`(font-lock-warning-face ((,class (:foreground ,status-warning :weight bold))))
|
||||||
|
`(font-lock-negation-char-face ((,class (:foreground ,status-error))))
|
||||||
|
`(font-lock-regexp-grouping-backslash ((,class (:foreground ,status-info))))
|
||||||
|
`(font-lock-regexp-grouping-construct ((,class (:inherit font-lock-constant-face))))
|
||||||
|
|
||||||
|
;; --- Mode-line ---
|
||||||
|
`(mode-line ((,class (:background ,ui-accent :foreground ,bg-main))))
|
||||||
|
`(mode-line-inactive ((,class (:background ,ui-selection :foreground ,fg-main))))
|
||||||
|
;:box (:line-width 1 :color ,syntax-keyword)
|
||||||
|
|
||||||
|
;; --- Search & Isearch ---
|
||||||
|
`(isearch ((,class (:inherit hl-line))))
|
||||||
|
`(isearch-fail ((,class (:inherit show-paren-mismatch))))
|
||||||
|
`(lazy-highlight ((,class (:background ,status-info :foreground ,bg-main))))
|
||||||
|
|
||||||
|
;; --- Line Numbers ---
|
||||||
|
`(line-number ((,class (:foreground ,fg-main :background ,ui-selection))))
|
||||||
|
`(line-number-current-line ((,class (:inherit mode-line :weight bold))))
|
||||||
|
|
||||||
|
;; --- Package Specifics ---
|
||||||
|
;; Doom Modeline
|
||||||
|
`(doom-modeline-bar ((,class (:background ,ui-accent :foreground ,fg-main))))
|
||||||
|
`(doom-modeline-buffer-file ((,class (:foreground ,fg-main :weight bold))))
|
||||||
|
`(doom-modeline-buffer-path ((,class (:foreground ,fg-main :weight bold))))
|
||||||
|
`(doom-modeline-buffer-modified ((,class (:foreground ,status-info :weight bold))))
|
||||||
|
`(doom-modeline-debug ((,class (:inherit font-lock-warning-face))))
|
||||||
|
`(doom-modeline-info ((,class (:inherit font-lock-delimiter-face))))
|
||||||
|
`(doom-modeline-warning ((,class (:inherit font-lock-warning-face))))
|
||||||
|
`(doom-modeline-error ((,class (:inherit error))))
|
||||||
|
|
||||||
|
;; Vertico / Marginalia
|
||||||
|
`(vertico-current ((,class (:inherit line-number-current-line))))
|
||||||
|
`(marginalia-documentation ((,class (:inherit font-lock-comment-face))))
|
||||||
|
|
||||||
|
;; Magit
|
||||||
|
`(magit-branch-local ((,class (:foreground ,syntax-function :weight bold))))
|
||||||
|
`(magit-branch-remote ((,class (:foreground ,syntax-string :weight bold))))
|
||||||
|
`(magit-hash ((,class (:foreground ,status-highlight))))
|
||||||
|
`(magit-item-highlight ((,class (:background ,ui-selection))))
|
||||||
|
`(magit-diff-added ((,class (:foreground ,status-success :background unspecified))))
|
||||||
|
`(magit-diff-removed ((,class (:foreground ,status-error :background unspecified))))
|
||||||
|
`(magit-diff-context-highlight ((,class (:background ,status-highlight :foreground ,fg-main))))
|
||||||
|
`(magit-section-heading ((,class (:foreground ,ui-selection :weight bold :underline t))))
|
||||||
|
|
||||||
|
;; Tree-sitter
|
||||||
|
`(tree-sitter-hl-face:function.call ((,class (:foreground ,ui-accent))))
|
||||||
|
`(tree-sitter-hl-face:method.call ((,class (:foreground ,ui-accent))))
|
||||||
|
`(tree-sitter-hl-face:type ((,class (:foreground ,syntax-function))))
|
||||||
|
`(tree-sitter-hl-face:property ((,class (:foreground ,ui-selection))))
|
||||||
|
`(tree-sitter-hl-face:parameter ((,class (:foreground ,status-info))))
|
||||||
|
`(tree-sitter-hl-face:escape ((,class (:foreground ,status-warning))))
|
||||||
|
|
||||||
|
;; Flycheck / LSP
|
||||||
|
`(flycheck-error ((,class (:underline (:style wave :color ,status-error)))))
|
||||||
|
`(flycheck-warning ((,class (:underline (:style wave :color ,status-info)))))
|
||||||
|
`(flycheck-info ((,class (:underline (:style wave :color ,syntax-keyword)))))
|
||||||
|
`(lsp-face-highlight-textual ((,class (:background ,ui-selection))))
|
||||||
|
|
||||||
|
;; Misc
|
||||||
|
`(show-paren-match ((,class (:background ,syntax-keyword :foreground ,bg-main :weight bold))))
|
||||||
|
`(show-paren-mismatch ((,class (:background ,status-error :foreground ,fg-main :weight bold))))
|
||||||
|
`(success ((,class (:foreground ,status-success))))
|
||||||
|
`(error ((,class (:foreground ,status-error :weight bold))))
|
||||||
|
`(warning ((,class (:foreground ,status-warning))))
|
||||||
|
`(header-line ((,class (:background ,status-highlight :foreground ,fg-main))))
|
||||||
|
|
||||||
|
;; Whitespace mode
|
||||||
|
`(whitespace-indentation ((,class (:background ,ui-muted :foreground ,status-warning ))))
|
||||||
|
`(whitespace-tab ((,class (:background ,light-grey :foreground ,syntax-constant))))
|
||||||
|
`(whitespace-space ((,class (:background ,light-grey :foreground ,status-info))))
|
||||||
|
`(whitespace-trailing ((,class (:background ,status-error :foreground ,status-info))))
|
||||||
|
`(whitespace-line ((,class (:background ,light-grey))))
|
||||||
|
|
||||||
|
;; Org Mode
|
||||||
|
`(org-level-1 ((,class (:foreground ,ui-accent :weight bold :height 1.2))))
|
||||||
|
`(org-level-2 ((,class (:foreground ,syntax-keyword :weight bold :height 1.1))))
|
||||||
|
`(org-level-3 ((,class (:foreground ,status-success :weight bold))))
|
||||||
|
`(org-level-4 ((,class (:foreground ,ui-selection :weight bold))))
|
||||||
|
`(org-level-5 ((,class (:foreground ,syntax-type :weight bold))))
|
||||||
|
`(org-todo ((,class (:foreground ,status-warning :weight bold :box t))))
|
||||||
|
`(org-done ((,class (:foreground ,status-success :weight bold :box t))))
|
||||||
|
`(org-date ((,class (:foreground ,syntax-keyword))))
|
||||||
|
`(org-link ((,class (:foreground ,syntax-type :underline t))))
|
||||||
|
`(org-code ((,class (:foreground ,status-info :background ,bg-main))))
|
||||||
|
`(org-block ((,class (:background ,bg-main :foreground ,fg-main :extend t))))
|
||||||
|
`(org-block-begin-line ((,class (:foreground ,status-highlight :background ,bg-main :extend t))))
|
||||||
|
))
|
||||||
|
|
||||||
|
;;;###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 'cutarv42)
|
||||||
|
|
||||||
|
;;; cutarv41-theme.el ends here
|
||||||
Reference in New Issue
Block a user