This commit is contained in:
Michael Thomson
2026-02-05 10:11:53 -05:00
parent 73fbc14e7a
commit 004ccccc35
11 changed files with 1170 additions and 634 deletions

View File

@@ -4,7 +4,7 @@
enable = true;
settings = {
email = "michael@michaelthomson.dev";
base_url = "https://vaultwarden.michaelthomson.dev";
base_url = "https://bitwarden.michaelthomson.dev";
pinentry = pkgs.pinentry-tty;
};
};

View File

@@ -8,6 +8,14 @@
inherit (pkgs) system;
overlays = [inputs.emacs-overlay.overlays.default];
};
addPlistSupport = pkg:
pkg.overrideAttrs (old: {
buildPhase =
''
export LSP_USE_PLISTS=true
''
+ (old.buildPhase or "");
});
in {
home.packages = with pkgs; [
emacs-lsp-booster
@@ -26,8 +34,13 @@ in {
libtool
glibtool
graphviz
mu
];
home.sessionVariables = {
LSP_USE_PLISTS = "true";
};
programs.emacs = {
enable = true;
package = myPkgs.emacsWithPackagesFromUsePackage {
@@ -40,6 +53,15 @@ in {
vterm
treesit-grammars.with-all-grammars
];
override = final: prev: {
lsp-mode = prev.lsp-mode.overrideAttrs (old: {
buildPhase =
''
export LSP_USE_PLISTS=true
''
+ (old.buildPhase or "");
});
};
};
};
services.emacs.enable = true;

View File

@@ -1,297 +1,169 @@
;; performance enhancements
(setq gc-cons-threshold #x40000000)
(setq gc-cons-threshold 100000000)
(setq read-process-output-max (* 1024 1024 4))
;; EMACS ----------
(use-package emacs
:ensure nil
:custom
(column-number-mode t)
(auto-save-default nil)
(create-lockfiles nil)
(display-line-numbers-type 'relative)
(global-auto-revert-non-file-buffers t)
(history-length 25)
(inhibit-startup-message t)
(initial-scratch-message "")
(ispell-dictionary "en_US")
(make-backup-files nil)
(pixel-scroll-precision-mode t)
(pixel-scroll-precision-use-momentum nil)
(ring-bell-function 'ignore)
(split-width-threshold 300)
(switch-to-buffer-obey-display-actions t)
(indent-tabs-mode nil)
(treesit-font-lock-level 4)
(truncate-lines t)
(use-dialog-box nil)
(use-short-answers t)
:custom ;; Set custom variables to configure Emacs behavior.
(auto-save-default nil) ;; Disable automatic saving of buffers.
(column-number-mode t) ;; Display the column number in the mode line.
(create-lockfiles nil) ;; Prevent the creation of lock files when editing.
(delete-by-moving-to-trash t) ;; Move deleted files to the trash instead of permanently deleting them.
(delete-selection-mode 1) ;; Enable replacing selected text with typed text.
(display-line-numbers-type 'relative) ;; Use relative line numbering in programming modes.
(global-auto-revert-non-file-bUffers t) ;; Automatically refresh non-file buffers.
(history-length 25) ;; Set the length of the command history.
(indent-tabs-mode nil) ;; Disable the use of tabs for indentation (use spaces instead).
(inhibit-startup-message t) ;; Disable the startup message when Emacs launches.
(initial-scratch-message "") ;; Clear the initial message in the *scratch* buffer.
(ispell-dictionary "en_US") ;; Set the default dictionary for spell checking.
(make-backup-files nil) ;; Disable creation of backup files.
(pixel-scroll-precision-mode t) ;; Enable precise pixel scrolling.
(pixel-scroll-precision-use-momentum nil) ;; Disable momentum scrolling for pixel precision.
(ring-bell-function 'ignore) ;; Disable the audible bell.
(split-width-threshold 300) ;; Prevent automatic window splitting if the window width exceeds 300 pixels.
(switch-to-buffer-obey-display-actions t) ;; Make buffer switching respect display actions.
(tab-always-indent 'complete) ;; Make the TAB key complete text instead of just indenting.
(tab-width 4) ;; Set the tab width to 4 spaces.
(treesit-font-lock-level 4) ;; Use advanced font locking for Treesit mode.
(truncate-lines t) ;; Enable line truncation to avoid wrapping long lines.
(use-dialog-box nil) ;; Disable dialog boxes in favor of minibuffer prompts.
(use-short-answers t) ;; Use short answers in prompts for quicker responses (y instead of yes)
(warning-minimum-level :emergency) ;; Set the minimum level of warnings to display.
;; recommended from vertico
(context-menu-mode t)
(enable-recursive-minibuffers t)
(read-extended-command-predicate #'command-completion-default-include-p)
(minibuffer-prompt-properties
'(read-only t cursor-intangible t face minibuffer-prompt))
;; recommended from corfu
(tab-always-indent 'complete)
(text-mode-ispell-word-completion nil)
:hook
(prog-mode . display-line-numbers-mode)
:hook ;; Add hooks to enable specific features in certain modes.
(prog-mode . display-line-numbers-mode) ;; Enable line numbers in programming modes.
:config
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 100)
(when (eq system-type 'darwin) ;; Check if the system is macOS.
(setq mac-command-modifier 'meta) ;; Set the Command key to act as the Meta key.
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 130))
;; Save manual customizations to a separate file instead of cluttering `init.el'.
(setq custom-file (locate-user-emacs-file "custom-vars.el")) ;; Specify the custom file path.
(load custom-file 'noerror 'nomessage) ;; Load the custom file quietly, ignoring errors.
:init ;; Initialization settings that apply before the package is loaded.
(tool-bar-mode -1) ;; Disable the tool bar for a cleaner interface.
(menu-bar-mode -1) ;; Disable the menu bar for a more streamlined look.
(when scroll-bar-mode
(scroll-bar-mode -1)) ;; Disable the scroll bar if it is active.
(global-hl-line-mode -1) ;; Disable highlight of the current line
(global-auto-revert-mode 1) ;; Enable global auto-revert mode to keep buffers up to date with their corresponding files.
(recentf-mode 1) ;; Enable tracking of recently opened files.
(savehist-mode 1) ;; Enable saving of command history.
(save-place-mode 1) ;; Enable saving the place in files for easier return.
(winner-mode 1) ;; Enable winner mode to easily undo window configuration changes.
(xterm-mouse-mode 1) ;; Enable mouse support in terminal mode.
(file-name-shadow-mode 1) ;; Enable shadowing of filenames for clarity.
(modify-coding-system-alist 'file "" 'utf-8))
(use-package dired
:ensure nil ;; This is built-in, no need to fetch it.
:custom
(dired-listing-switches "-lah --group-directories-first") ;; Display files in a human-readable format and group directories first.
(dired-dwim-target t) ;; Enable "do what I mean" for target directories.
(dired-kill-when-opening-new-dired-buffer t)) ;; Close the previous buffer when opening a new `dired' instance.
(use-package eldoc
:ensure nil ;; This is built-in, no need to fetch it.
:config
(setq eldoc-idle-delay 0) ;; Automatically fetch doc help
(setq eldoc-echo-area-use-multiline-p nil) ;; We use the "K" floating help instead
;; set to t if you want docs on the echo area
(setq eldoc-echo-area-display-truncation-message nil)
:init
(tool-bar-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(global-hl-line-mode 1)
(global-auto-revert-mode 1)
(indent-tabs-mode -1)
(recentf-mode 1)
(savehist-mode 1)
(save-place-mode 1)
(winner-mode 1)
(xterm-mouse-mode 1)
(file-name-shadow-mode 1))
(global-eldoc-mode))
;; THEMES AND MODELINE ----------
(use-package modus-themes
:ensure t
:config
(load-theme 'modus-operandi t))
(use-package doom-modeline
:ensure t
:config
(display-battery-mode t)
(display-time-mode t)
:config (doom-modeline-mode 1))
(use-package nerd-icons
:ensure t)
(use-package nerd-icons-dired
:ensure t
:hook
(dired-mode . nerd-icons-dired-mode))
(use-package spacious-padding
:ensure t
:config
(spacious-padding-mode t))
;; EVIL MODE ----------
(use-package evil
:ensure t
(use-package flymake
:ensure nil ;; This is built-in, no need to fetch it.
:defer t
:hook (prog-mode . flymake-mode)
:custom
(flymake-margin-indicators-string
'((error "" compilation-error) (warning "»" compilation-warning) (note "»" compilation-info))))
(use-package which-key
:ensure nil ;; This is built-in, no need to fetch it.
:defer t ;; Defer loading Which-Key until after init.
:hook
(after-init . evil-mode)
:init
(setq evil-want-integration t)
(setq evil-want-keybinding nil)
(setq evil-want-C-u-scroll t)
(setq evil-want-C-u-delete t)
:config
(evil-set-undo-system 'undo-tree)
(evil-set-leader 'normal (kbd "SPC"))
(evil-set-leader 'visual (kbd "SPC")))
(after-init . which-key-mode)) ;; Enable which-key mode after initialization.
(use-package evil-collection
:after evil
:ensure t
:config
(evil-collection-init))
(use-package evil-surround
:after evil
:ensure t
:config
(global-evil-surround-mode 1))
;; MINAD STACK -----------
(use-package vertico
:ensure t
:config
(setq vertico-cycle t)
(setq vertico-resize t)
(vertico-mode))
:hook
(after-init . vertico-mode) ;; Enable vertico after Emacs has initialized.
:custom
(vertico-count 10) ;; Number of candidates to display in the completion list.
(vertico-resize nil) ;; Disable resizing of the vertico minibuffer.
(vertico-cycle nil)) ;; Do not cycle through candidates when reaching the end of the list.
(use-package orderless
:ensure t
:config
(setq completion-styles '(orderless partial-completion basic))
;; (setq completion-category-overrides '((file (styles partial-completion))))
(setq completion-category-overrides nil)
(setq completion-category-defaults nil)
(setq completion-pcm-leading-wildcard t))
:defer t ;; Load Orderless on demand.
:after vertico ;; Ensure Vertico is loaded before Orderless.
:init
(setq completion-styles '(orderless basic) ;; Set the completion styles.
completion-category-defaults nil ;; Clear default category settings.
completion-category-overrides '((file (styles partial-completion))))) ;; Customize file completion styles.
(use-package marginalia
:ensure t
:config
(marginalia-mode))
:hook
(after-init . marginalia-mode))
(use-package consult
:ensure t)
:ensure t
:defer t
:init
;; Enhance register preview with thin lines and no mode line.
(advice-add #'register-preview :override #'consult-register-window)
;; Use Consult for xref locations with a preview feature.
(setq xref-show-xrefs-function #'consult-xref
xref-show-definitions-function #'consult-xref))
(use-package embark
:ensure t)
:ensure t
:defer t)
(use-package embark-consult
:ensure t
:hook
(embark-collect-mode . consult-preview-at-point-mode))
(embark-collect-mode . consult-preview-at-point-mode)) ;; Enable preview in Embark collect mode.
(use-package treesit-auto
:ensure t
:after emacs
:config
(treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode t))
(use-package corfu
:ensure t
:defer t
:custom
(corfu-auto t) ;; Only completes when hitting TAB
(corfu-auto-delay 0) ;; Delay before popup (enable if corfu-auto is t)
(corfu-auto-prefix 1) ;; Trigger completion after typing 1 character
(corfu-quit-no-match t) ;; Quit popup if no match
(corfu-scroll-margin 5) ;; Margin when scrolling completions
(corfu-max-width 50) ;; Maximum width of completion popup
(corfu-min-width 50) ;; Minimum width of completion popup
(corfu-popupinfo-delay 0.5) ;; Delay before showing documentation popup
:config
(setq corfu-cycle t)
(setq corfu-quit-at-boundary nil)
(setq corfu-quit-no-match t)
(setq corfu-preselect 'prompt)
(setq corfu-on-exact-match nil)
(setq corfu-preview-current 'insert)
(setq corfu-auto t)
(setq corfu-auto-prefix 2)
(setq corfu-auto-delay 0)
(setq corfu-popupinfo-delay '(0.5 . 0.2))
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)
:init
(global-corfu-mode)
(corfu-history-mode)
(corfu-popupinfo-mode))
(corfu-popupinfo-mode t))
(use-package nerd-icons-corfu
:ensure t
:after corfu
:config (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter))
(use-package cape
:ensure t
:bind ("C-c p" . cape-prefix-map)
:config
(add-hook 'completion-at-point-functions #'cape-abbrev)
(add-hook 'completion-at-point-functions #'cape-dict)
(add-hook 'completion-at-point-functions #'cape-file)
(add-hook 'completion-at-point-functions #'cape-elisp-block)
(add-hook 'completion-at-point-functions #'cape-keyword)
(add-hook 'completion-at-point-functions #'cape-tex))
(use-package yasnippet
:ensure t
:config
(yas-global-mode 1))
(use-package yasnippet-snippets
:ensure t
:after yasnippet)
(use-package eldoc
:ensure nil
:init
(global-eldoc-mode))
;; LINTING ------------
(use-package flycheck
:ensure t
:config
(global-flycheck-mode))
;; LANGUAGE MODES -------
(use-package treesit-auto
:ensure t
:config
(treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode))
(use-package nix-ts-mode
:ensure t
:mode "\\.nix\\'")
;; EDITOR CONFIG ------
(use-package editorconfig
:ensure nil
:config
(editorconfig-mode t))
;; LSP ---------
(use-package lsp-mode
:ensure t
:hook ((typescript-ts-mode . lsp)
(tsx-ts-mode . lsp)
(js-ts-mode . lsp)
(css-ts-mode . lsp)
(rust-ts-mode . lsp)
(go-ts-mode . lsp)
(lsp-mode . lsp-enable-which-key-integration))
:commands lsp
:config
;; core
(setq lsp-keymap-prefix "C-c l")
(setq lsp-completion-provider :none)
(setq lsp-log-io nil)
(setq lsp-keep-workspace-alive nil)
(setq lsp-idle-delay 0.5)
(setq lsp-enable-xref t)
(setq lsp-auto-configure t)
(setq lsp-eldoc-enable-hover t)
(setq lsp-enable-dap-auto-configure t)
(setq lsp-enable-file-watchers nil) ;; TODO: check this
(setq lsp-enable-folding nil)
(setq lsp-enable-imenu t)
(setq lsp-enable-indentation nil) ;; TODO: check this as well
(setq lsp-enable-links t)
(setq lsp-enable-on-type-formatting t)
(setq lsp-enable-suggest-server-download nil)
(setq lsp-enable-symbol-highlighting t)
(setq lsp-enable-text-document-color nil)
(setq lsp-auto-execute-action nil)
;; sideline
(setq lsp-ui-sideline-show-hover nil)
(setq lsp-ui-sideline-diagnostic-max-lines 20)
;; completion
(setq lsp-completion-enable t)
(setq lsp-completion-enable-additional-text-edit t)
(setq lsp-enable-snippet t)
(setq lsp-completion-show-kind t)
;; headerline
(setq lsp-headerline-breadcrumb-enable t)
(setq lsp-headerline-breadcrumb-icons-enable t)
;; modeline
(setq lsp-modeline-code-actions-enable nil)
(setq lsp-modeline-diagnostics-enable nil)
(setq lsp-modeline-workspace-status-enable nil)
(setq lsp-signature-doc-lines 1)
(setq lsp-ui-doc-use-childframe t)
;; lens
(setq lsp-lens-enable nil)
;; semantic
(setq lsp-semantic-tokens-enable nil)
;; misc
(setq lsp-use-plists nil)
;; language specific
(setq lsp-eslint-server-command '("vscode-eslint-language-server" "--stdio"))
)
(use-package lsp-ui
:ensure t
:after (lsp-mode evil)
:config (setq lsp-ui-doc-enable t
evil-lookup-func #'lsp-ui-doc-glance
lsp-ui-doc-show-with-cursor nil
lsp-ui-doc-include-signature t
lsp-ui-doc-position 'at-point))
:defer t
:after (:all corfu))
;; LSP BOOSTER
(defun lsp-booster--advice-json-parse (old-fn &rest args)
"Try to parse bytecode instead of json."
(or
@@ -323,39 +195,249 @@
orig-result)))
(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command)
;; TOOLS ---------
(use-package magit
(use-package lsp-mode
:ensure t
:defer t
:hook (;; Replace XXX-mode with concrete major mode (e.g. python-mode)
(lsp-mode . lsp-enable-which-key-integration) ;; Integrate with Which Key
((js-mode ;; Enable LSP for JavaScript
tsx-ts-mode ;; Enable LSP for TSX
typescript-ts-mode ;; Enable LSP for TypeScript
css-ts-mode ;; Enable LSP for CSS
go-ts-mode ;; Enable LSP for Go
js-ts-mode ;; Enable LSP for JavaScript (TS mode)
nix-ts-mode
web-mode) . lsp-deferred)) ;; Enable LSP for Web (HTML)
:commands lsp
:custom
(lsp-keymap-prefix "C-c l") ;; Set the prefix for LSP commands.
(lsp-inlay-hint-enable nil) ;; Usage of inlay hints.
(lsp-completion-provider :none) ;; Disable the default completion provider.
(lsp-session-file (locate-user-emacs-file ".lsp-session")) ;; Specify session file location.
(lsp-log-io nil) ;; Disable IO logging for speed.
(lsp-idle-delay 0.5) ;; Set the delay for LSP to 0 (debouncing).
(lsp-keep-workspace-alive nil) ;; Disable keeping the workspace alive.
;; Core settings
(lsp-enable-xref t) ;; Enable cross-references.
(lsp-auto-configure t) ;; Automatically configure LSP.
(lsp-enable-links nil) ;; Disable links.
(lsp-eldoc-enable-hover t) ;; Enable ElDoc hover.
(lsp-enable-file-watchers nil) ;; Disable file watchers.
(lsp-enable-folding nil) ;; Disable folding.
(lsp-enable-imenu t) ;; Enable Imenu support.
(lsp-enable-indentation nil) ;; Disable indentation.
(lsp-enable-on-type-formatting nil) ;; Disable on-type formatting.
(lsp-enable-suggest-server-download t) ;; Enable server download suggestion.
(lsp-enable-symbol-highlighting t) ;; Enable symbol highlighting.
(lsp-enable-text-document-color t) ;; Enable text document color.
;; Modeline settings
(lsp-modeline-code-actions-enable nil) ;; Keep modeline clean.
(lsp-modeline-diagnostics-enable nil) ;; Use `flymake' instead.
(lsp-modeline-workspace-status-enable t) ;; Display "LSP" in the modeline when enabled.
(lsp-signature-doc-lines 1) ;; Limit echo area to one line.
(lsp-eldoc-render-all t) ;; Render all ElDoc messages.
;; Completion settings
(lsp-completion-enable t) ;; Enable completion.
(lsp-completion-enable-additional-text-edit t) ;; Enable additional text edits for completions.
(lsp-enable-snippet nil) ;; Disable snippets
(lsp-completion-show-kind t) ;; Show kind in completions.
;; Lens settings
(lsp-lens-enable t) ;; Enable lens support.
;; Headerline settings
(lsp-headerline-breadcrumb-enable-symbol-numbers t) ;; Enable symbol numbers in the headerline.
(lsp-headerline-arrow "") ;; Set arrow for headerline.
(lsp-headerline-breadcrumb-enable-diagnostics nil) ;; Disable diagnostics in headerline.
(lsp-headerline-breadcrumb-icons-enable nil) ;; Disable icons in breadcrumb.
;; Semantic settings
(lsp-semantic-tokens-enable nil)
:config
(add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]\\node_modules\\'"))
(use-package nix-ts-mode
:ensure t
:mode "\\.nix\\'")
(use-package eldoc-box
:ensure t
:defer t)
(use-package vterm
:ensure t)
(use-package diff-hl
:defer t
:ensure t
:hook
(find-file . (lambda ()
(global-diff-hl-mode) ;; Enable Diff-HL mode for all files.
(diff-hl-flydiff-mode) ;; Automatically refresh diffs.
(diff-hl-margin-mode))) ;; Show diff indicators in the margin.
:custom
(diff-hl-side 'left))
(use-package multi-vterm
:ensure t)
(use-package undo-tree
(use-package magit
:ensure t
:config
(setq undo-tree-visualizer-timestamps t
undo-tree-visualizer-diff t
undo-limit 800000
undo-strong-limit 12000000
undo-outer-limit 120000000)
(setq undo-tree-history-directory-alist '(("." . "~/.config/emacs/.cache/undo")))
(global-undo-tree-mode))
(setopt magit-format-file-function #'magit-format-file-nerd-icons) ;; Turns on magit nerd-icons
:defer t)
(use-package ledger-mode
(use-package evil
:ensure t
:defer t
:hook
(after-init . evil-mode)
:init
(setq evil-want-integration t) ;; Integrate `evil' with other Emacs features (optional as it's true by default).
(setq evil-want-keybinding nil) ;; Disable default keybinding to set custom ones.
(setq evil-want-C-u-scroll t) ;; Makes C-u scroll
(setq evil-want-C-u-delete t) ;; Makes C-u delete on insert mode
:config
(evil-set-undo-system 'undo-tree) ;; Uses the undo-tree package as the default undo system
(evil-set-leader 'normal (kbd "SPC"))
(evil-set-leader 'visual (kbd "SPC"))
(setq evil-want-fine-undo t))
(use-package evil-collection
:defer t
:ensure t
:custom
((ledger-binary-path "hledger")
(ledger-mode-should-check-version nil)
(ledger-report-auto-width nil)
(ledger-report-links-in-register nil)
(ledger-report-native-highlighting-arguments '("--color=always")))
:mode ("\\.hledger\\'" "\\.ledger\\'" "\\.journal\\'"))
(evil-collection-want-find-usages-bindings t)
:hook
(evil-mode . evil-collection-init))
(use-package evil-surround
:ensure t
:after evil-collection
:config
(global-evil-surround-mode 1))
(use-package evil-matchit
:ensure t
:after evil-collection
:config
(global-evil-matchit-mode 1))
(use-package general
:ensure t
:after (evil evil-collection)
:init
(setq general-override-states '(insert
emacs
hybrid
normal
visual
motion
operator
replace))
:config
(general-evil-setup t)
(general-define-key
:states 'normal
"] d" '(flymake-goto-next-error :wk "Goto next error")
"[ d" '(flymake-goto-prev-error :wk "Goto prev error")
"] c" '(diff-hl-next-hunk :wk "Goto next hunk")
"[ c" '(diff-hl-previous-hunk :wk "Goto prev hunk")
"g r" '(lsp-find-references :wk "Goto references")
"K" '(eldoc-box-help-at-point :wk "Describe"))
(general-create-definer my-leader-def
:states '(normal insert visual motion emacs)
:keymaps 'override
:prefix "SPC"
:global-prefix "C-SPC")
(my-leader-def
"f" '(:ignore t :wk "Find")
"f c" '((lambda () (interactive) (find-file "~/.config/emacs/init.el")) :wk "Edit emacs config")
"f r" '(consult-recent-file :wk "Recent files")
"f f" '(consult-find :wk "Find Files")
"f g" '(consult-ripgrep :wk "Ripgrep search in files")
"f G" '(consult-git-grep :wk "Ripgrep search in files")
"f l" '(consult-line :wk "Find line")
"f i" '(consult-imenu :wk "Imenu buffer locations"))
(my-leader-def
"c" '(:ignore t :wk "Code")
"c a" '(lsp-execute-code-action :wk "Code actions"))
(my-leader-def
"h" '(:ignore t :wk "Help")
"h v" '(describe-variable :wk "Describe variable")
"h f" '(describe-function :wk "Describe function")
"h k" '(describe-key :wk "Describe key"))
(my-leader-def
"p" '(:ignore t :wk "Project")
"p b" '(consult-project-buffer :wk "Project buffers")
"p p" '(project-switch-project :wk "Project switch")
"p f" '(project-find-file :wk "Project find file")
"p g" '(project-find-regexp :wk "Project grep file")
"p k" '(project-kill-buffers :wk "Project kill buffers")
"p d" '(project-dired :wk "Project dired"))
(my-leader-def
"x" '(:ignore t :wk "Flymake")
"x x" '(consult-flymake :wk "Show diagnostics"))
(my-leader-def
"g" '(:ignore t :wk "Git")
"g g" '(magit-status :wk "Magit status")
"g l" '(magit-log-current :wk "Magit log"))
(my-leader-def
"r n" '(lsp-rename :wk "Rename"))
(my-leader-def
"u" '(undo-tree-visualize :wk "Undo-tree")))
(use-package undo-tree
:defer t
:ensure t
:hook
(after-init . global-undo-tree-mode)
:init
(setq undo-tree-visualizer-timestamps t
undo-tree-visualizer-diff t
undo-limit 800000 ;; Limit for undo entries.
undo-strong-limit 12000000 ;; Strong limit for undo entries.
undo-outer-limit 120000000) ;; Outer limit for undo entries.
:config
(setq undo-tree-history-directory-alist '(("." . "~/.config/emacs/.cache/undo"))))
(use-package dotenv-mode
:defer t
:ensure t)
(use-package doom-modeline
:ensure t
:defer t
:custom
(doom-modeline-buffer-file-name-style 'buffer-name) ;; Set the buffer file name style to just the buffer name (without path).
(doom-modeline-project-detection 'project) ;; Enable project detection for displaying the project name.
(doom-modeline-buffer-name t) ;; Show the buffer name in the mode line.
(doom-modeline-vcs-max-length 25) ;; Limit the version control system (VCS) branch name length to 25 characters.
:config
(setq doom-modeline-icon t) ;; Enable icons in the mode line if nerd fonts are used.
:hook
(after-init . doom-modeline-mode))
(use-package nerd-icons
:ensure t
:defer t)
(use-package nerd-icons-dired
:ensure t ;; Ensure the package is installed.
:defer t ;; Load the package only when needed to improve startup time.
:hook
(dired-mode . nerd-icons-dired-mode))
(use-package nerd-icons-completion
:ensure t ;; Ensure the package is installed.
:after (:all nerd-icons marginalia) ;; Load after `nerd-icons' and `marginalia' to ensure proper integration.
:config
(nerd-icons-completion-mode) ;; Activate nerd icons for completion interfaces.
(add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) ;; Setup icons in the marginalia mode for enhanced completion display.
;; PATH STUFF --------
(use-package exec-path-from-shell
:ensure t
:init
@@ -368,7 +450,11 @@
:hook
(after-init . envrc-global-mode))
;; ORG ----------
(use-package modus-themes
:ensure t
:config
(load-theme 'modus-vivendi t))
(use-package org
:ensure nil
:defer t
@@ -378,9 +464,8 @@
(org-hide-emphasis-markers t)
(org-log-into-drawer t)
(org-log-done 'time)
(org-agenda-span 'day)
(org-todo-keywords
'((sequence "TODO(t)" "NEXT(n)" "PROG(p)" "INTR(i)" "WAIT(w)" "SOMEDAY(s)" "|" "DONE(d)" "CANCELLED(c)")))
'((sequence "TODO(t)" "NEXT(n)" "PROG(p)" "WAIT(w)" "SOMEDAY(s)" "|" "DONE(d)" "CANCELLED(c)")))
(org-capture-templates
`(("i" "Inbox" entry (file+headline "todo.org" "Inbox")
"* TODO %?")
@@ -410,180 +495,43 @@
:init
(require 'org-tempo))
(use-package denote
:ensure t
:hook
((dired-mode . denote-dired-mode)
(text-mode . denote-fontify-links-mode))
:bind
(("C-c n n" . denote)
("C-c n r" . denote-rename-file)
("C-c n l" . denote-link)
("C-c n b" . denote-backlinks)
("C-c n d" . denote-dired))
:config
(setq denote-directory (expand-file-name "~/org/note"))
(denote-rename-buffer-mode 1))
(use-package consult-denote
:ensure t
:bind
(("C-c n f" . consult-denote-find)
("C-c n g" . consult-denote-grep))
:config
(consult-denote-mode 1))
(use-package denote-journal
:ensure t
:commands (denote-journal-new-entry
denote-journal-new-or-existing-entry
denote-journal-link-or-create-entry )
:hook (calendar-mode . denote-journal-calendar-mode)
:config
(setq denote-journal-directory
(expand-file-name "journal" denote-directory))
(setq denote-journal-keyword "journal")
(setq denote-journal-title-format 'day-date-month-year))
(use-package org-superstar
:ensure t
:hook
(org-mode . org-superstar-mode))
(use-package org-super-agenda
(use-package org-roam
:ensure t
:custom
(org-super-agenda-groups
'(
(:name "Today"
:time-grid t
:date today
:todo "TODAY"
:scheduled today
:order 1)
(:name "Next Items"
:todo "NEXT"
:order 2)
(:name "Due Today"
:deadline today
:order 3)
(:name "Due Soon"
:deadline future
:order 4)
(:name "Overdue"
:deadline past
:order 5)
(:name "Scheduled Soon"
:scheduled future
:order 6)
(:name "Waiting"
:todo "WAIT"
:order 7)
(:habit t
:order 8)
(:name "Project"
:category "Project"
:order 9)
)))
;; KEYBINDS ---------
(use-package which-key
:ensure nil
(org-roam-directory "~/org")
:bind (("C-c n l" . org-roam-buffer-toggle)
("C-c n f" . org-roam-node-find)
("C-c n i" . org-roam-node-insert))
:config
(which-key-mode))
(org-roam-setup))
(use-package general
:ensure t
(use-package mu4e
:config
(general-evil-setup t)
(setq mu4e-get-mail-command (concat (executable-find "mbsync") " -a"))
(setq mu4e-update-interval 300)
(setq mu4e-change-filenames-when-moving t)
(setq mu4e-attachment-dir "~/Downloads")
(general-define-key
:states 'normal
"] d" '(flycheck-next-error :wk "Goto next error")
"[ d" '(flycheck-previous-error :wk "Goto prev error")
"] c" '(diff-hl-next-hunk :wk "Goto next hunk")
"g r" '(lsp-find-references :wk "Goto references")
"K" '(evil-lookup :wk "Describe"))
;;smtp
(setq send-mail-function 'sendmail-send-it)
(setq sendmail-program (executable-find "msmtp"))
(setq message-sendmail-envelop-from 'header)
(general-create-definer my-leader-def
:states '(normal insert visual motion emacs)
:keymaps 'override
:prefix "SPC"
:global-prefix "C-SPC")
(my-leader-def
"f" '(:ignore t :wk "Find")
"f c" '((lambda () (interactive) (find-file "~/.config/emacs/init.el")) :wk "Edit emacs config")
"f r" '(consult-recent-file :wk "Recent files")
"f f" '(consult-find :wk "Find Files")
"f g" '(consult-ripgrep :wk "Ripgrep search in files")
"f l" '(consult-line :wk "Find line")
"f i" '(consult-imenu :wk "Imenu buffer locations"))
(my-leader-def
"c" '(:ignore t :wk "Code")
"c a" '(lsp-execute-code-action :wk "Code actions"))
(my-leader-def
"h" '(:ignore t :wk "Help")
"h v" '(describe-variable :wk "Describe variable")
"h f" '(describe-function :wk "Describe function")
"h k" '(describe-key :wk "Describe key"))
(my-leader-def
"p" '(:ignore t :wk "Project")
"p b" '(consult-project-buffer :wk "Project buffers")
"p p" '(project-switch-project :wk "Project switch")
"p f" '(project-find-file :wk "Project find file")
"p g" '(project-find-regexp :wk "Project grep file")
"p k" '(project-kill-buffers :wk "Project kill buffers")
"p d" '(project-dired :wk "Project dired"))
(my-leader-def
"x" '(:ignore t :wk "Flymake")
"x x" '(consult-flycheck :wk "Show diagnostics"))
(my-leader-def
"g" '(:ignore t :wk "Git")
"g g" '(magit-status :wk "Magit status")
"g l" '(magit-log-current :wk "Magit log"))
(my-leader-def
"r n" '(lsp-rename :wk "Rename"))
(my-leader-def
"u" '(undo-tree-visualize :wk "Undo-tree")))
(use-package diff-hl
:ensure t
:config
(global-diff-hl-mode))
;; EMAIL -----------
(use-package notmuch
:ensure t
:bind (("C-c m" . notmuch-hello))
:custom
(notmuch-search-oldest-first nil)
(notmuch-saved-searches
'((:name "inbox" :query "tag:inbox")
(:name "unread" :query "tag:unread")
(:name "sent" :query "tag:sent")
(:name "drafts" :query "tag:draft")))
:config
(setq sendmail-program "msmtp")
(setq notmuch-fcc-dirs nil))
(use-package ol-notmuch
:ensure t
:bind
("C-c l" . org-store-link))
;; EPUBS ----------
(use-package nov
:ensure t
:config
(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)))
(provide 'init)
;; contexts
(setq mu4e-contexts
`(,(make-mu4e-context
:name "personal"
:enter-func
(lambda () (mu4e-message "Opening personal"))
:leave-func
(lambda () (mu4e-message "Closing personal"))
:match-func
(lambda (msg)
(when msg
(string-match-p "^/personal" (mu4e-message-field msg :maildir))))
:vars '((user-mail-address . "me@michaelthomson.dev" )
(user-full-name . "Michael Thomson")
(mu4e-drafts-folder . "/personal/Drafts")
(mu4e-refile-folder . "/personal/Archive")
(mu4e-sent-folder . "/personal/Sent")
(mu4e-trash-folder . "/personal/Trash"))))))

View File

@@ -0,0 +1,492 @@
#+PROPERTY: header-args :tangle yes
* My Emacs Config
** Built-in
*** Performance
#+begin_src emacs-lisp
(setq gc-cons-threshold #x40000000)
(setq read-process-output-max (* 1024 1024 4))
#+end_src
*** Emacs
#+begin_src emacs-lisp
(use-package emacs
:ensure nil
:custom ;; Set custom variables to configure Emacs behavior.
(auto-save-default nil) ;; Disable automatic saving of buffers.
(column-number-mode t) ;; Display the column number in the mode line.
(create-lockfiles nil) ;; Prevent the creation of lock files when editing.
(delete-by-moving-to-trash t) ;; Move deleted files to the trash instead of permanently deleting them.
(delete-selection-mode 1) ;; Enable replacing selected text with typed text.
(display-line-numbers-type 'relative) ;; Use relative line numbering in programming modes.
(global-auto-revert-non-file-bUffers t) ;; Automatically refresh non-file buffers.
(history-length 25) ;; Set the length of the command history.
(indent-tabs-mode nil) ;; Disable the use of tabs for indentation (use spaces instead).
(inhibit-startup-message t) ;; Disable the startup message when Emacs launches.
(initial-scratch-message "") ;; Clear the initial message in the *scratch* buffer.
(ispell-dictionary "en_US") ;; Set the default dictionary for spell checking.
(make-backup-files nil) ;; Disable creation of backup files.
(pixel-scroll-precision-mode t) ;; Enable precise pixel scrolling.
(pixel-scroll-precision-use-momentum nil) ;; Disable momentum scrolling for pixel precision.
(ring-bell-function 'ignore) ;; Disable the audible bell.
(split-width-threshold 300) ;; Prevent automatic window splitting if the window width exceeds 300 pixels.
(switch-to-buffer-obey-display-actions t) ;; Make buffer switching respect display actions.
(tab-always-indent 'complete) ;; Make the TAB key complete text instead of just indenting.
(tab-width 4) ;; Set the tab width to 4 spaces.
(treesit-font-lock-level 4) ;; Use advanced font locking for Treesit mode.
(truncate-lines t) ;; Enable line truncation to avoid wrapping long lines.
(use-dialog-box nil) ;; Disable dialog boxes in favor of minibuffer prompts.
(use-short-answers t) ;; Use short answers in prompts for quicker responses (y instead of yes)
(warning-minimum-level :emergency) ;; Set the minimum level of warnings to display.
:hook ;; Add hooks to enable specific features in certain modes.
(prog-mode . display-line-numbers-mode) ;; Enable line numbers in programming modes.
:config
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 100)
(when (eq system-type 'darwin) ;; Check if the system is macOS.
(setq mac-command-modifier 'meta) ;; Set the Command key to act as the Meta key.
(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 130))
;; Save manual customizations to a separate file instead of cluttering `init.el'.
(setq custom-file (locate-user-emacs-file "custom-vars.el")) ;; Specify the custom file path.
(load custom-file 'noerror 'nomessage) ;; Load the custom file quietly, ignoring errors.
:init ;; Initialization settings that apply before the package is loaded.
(tool-bar-mode -1) ;; Disable the tool bar for a cleaner interface.
(menu-bar-mode -1) ;; Disable the menu bar for a more streamlined look.
(when scroll-bar-mode
(scroll-bar-mode -1)) ;; Disable the scroll bar if it is active.
(global-hl-line-mode -1) ;; Disable highlight of the current line
(global-auto-revert-mode 1) ;; Enable global auto-revert mode to keep buffers up to date with their corresponding files.
(recentf-mode 1) ;; Enable tracking of recently opened files.
(savehist-mode 1) ;; Enable saving of command history.
(save-place-mode 1) ;; Enable saving the place in files for easier return.
(winner-mode 1) ;; Enable winner mode to easily undo window configuration changes.
(xterm-mouse-mode 1) ;; Enable mouse support in terminal mode.
(file-name-shadow-mode 1) ;; Enable shadowing of filenames for clarity.
(modify-coding-system-alist 'file "" 'utf-8))
#+end_src
*** Dired
#+begin_src emacs-lisp
(use-package dired
:ensure nil ;; This is built-in, no need to fetch it.
:custom
(dired-listing-switches "-lah --group-directories-first") ;; Display files in a human-readable format and group directories first.
(dired-dwim-target t) ;; Enable "do what I mean" for target directories.
(dired-kill-when-opening-new-dired-buffer t)) ;; Close the previous buffer when opening a new `dired' instance.
#+end_src
*** Eldoc
#+begin_src emacs-lisp
(use-package eldoc
:ensure nil ;; This is built-in, no need to fetch it.
:config
(setq eldoc-idle-delay 0) ;; Automatically fetch doc help
(setq eldoc-echo-area-use-multiline-p nil) ;; We use the "K" floating help instead
;; set to t if you want docs on the echo area
(setq eldoc-echo-area-display-truncation-message nil)
:init
(global-eldoc-mode))
#+end_src
*** Flymake
#+begin_src emacs-lisp
(use-package flymake
:ensure nil ;; This is built-in, no need to fetch it.
:defer t
:hook (prog-mode . flymake-mode)
:custom
(flymake-margin-indicators-string
'((error "" compilation-error) (warning "»" compilation-warning) (note "»" compilation-info))))
#+end_src
*** Which-key
#+begin_src emacs-lisp
(use-package which-key
:ensure nil ;; This is built-in, no need to fetch it.
:defer t ;; Defer loading Which-Key until after init.
:hook
(after-init . which-key-mode)) ;; Enable which-key mode after initialization.
#+end_src
** Packages
*** Vertico
- Provides a vertical selection interface for both buffer and minibuffer completions
#+begin_src emacs-lisp
(use-package vertico
:ensure t
:hook
(after-init . vertico-mode) ;; Enable vertico after Emacs has initialized.
:custom
(vertico-count 10) ;; Number of candidates to display in the completion list.
(vertico-resize nil) ;; Disable resizing of the vertico minibuffer.
(vertico-cycle nil)) ;; Do not cycle through candidates when reaching the end of the list.
#+end_src
*** Orderless
- improved pattern matching on completion, works with vertico
#+begin_src emacs-lisp
(use-package orderless
:ensure t
:defer t ;; Load Orderless on demand.
:after vertico ;; Ensure Vertico is loaded before Orderless.
:init
(setq completion-styles '(orderless basic) ;; Set the completion styles.
completion-category-defaults nil ;; Clear default category settings.
completion-category-overrides '((file (styles partial-completion))))) ;; Customize file completion styles.
#+end_src
*** Marginalia
- adds additional context in completion margins
#+begin_src emacs-lisp
(use-package marginalia
:ensure t
:hook
(after-init . marginalia-mode))
#+end_src
*** Consult
- provides completion and narrowing commands for emacs
#+begin_src emacs-lisp
(use-package consult
:ensure t
:defer t
:init
;; Enhance register preview with thin lines and no mode line.
(advice-add #'register-preview :override #'consult-register-window)
;; Use Consult for xref locations with a preview feature.
(setq xref-show-xrefs-function #'consult-xref
xref-show-definitions-function #'consult-xref))
#+end_src
*** Embark
- Allows for contextual action menu on any completion candidate
#+begin_src emacs-lisp
(use-package embark
:ensure t
:defer t)
#+end_src
*** Embark-Consult
- Creates a bridge between embark and consult, allowing for consult features like previews in embark
#+begin_src emacs-lisp
(use-package embark-consult
:ensure t
:hook
(embark-collect-mode . consult-preview-at-point-mode)) ;; Enable preview in Embark collect mode.
#+end_src
*** Treesit-auto
- Created automatic mode mapping to treesitter modes
#+begin_src emacs-lisp
(use-package treesit-auto
:ensure t
:after emacs
:config
(treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode t))
#+end_src
*** Corfu
- text completion framework for emacs
#+begin_src emacs-lisp
(use-package corfu
:ensure t
:defer t
:custom
(corfu-auto t) ;; Only completes when hitting TAB
(corfu-auto-delay 0) ;; Delay before popup (enable if corfu-auto is t)
(corfu-auto-prefix 1) ;; Trigger completion after typing 1 character
(corfu-quit-no-match t) ;; Quit popup if no match
(corfu-scroll-margin 5) ;; Margin when scrolling completions
(corfu-max-width 50) ;; Maximum width of completion popup
(corfu-min-width 50) ;; Minimum width of completion popup
(corfu-popupinfo-delay 0.5) ;; Delay before showing documentation popup
:config
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)
:init
(global-corfu-mode)
(corfu-popupinfo-mode t))
(use-package nerd-icons-corfu
:ensure t
:defer t
:after (:all corfu))
#+end_src
*** LSP
#+begin_src emacs-lisp
(use-package lsp-mode
:ensure t
:defer t
:hook (;; Replace XXX-mode with concrete major mode (e.g. python-mode)
(lsp-mode . lsp-enable-which-key-integration) ;; Integrate with Which Key
((js-mode ;; Enable LSP for JavaScript
tsx-ts-mode ;; Enable LSP for TSX
typescript-ts-mode ;; Enable LSP for TypeScript
css-mode ;; Enable LSP for CSS
go-ts-mode ;; Enable LSP for Go
js-ts-mode ;; Enable LSP for JavaScript (TS mode)
web-mode) . lsp-deferred)) ;; Enable LSP for Web (HTML)
:commands lsp
:custom
(lsp-keymap-prefix "C-c l") ;; Set the prefix for LSP commands.
(lsp-inlay-hint-enable nil) ;; Usage of inlay hints.
(lsp-completion-provider :none) ;; Disable the default completion provider.
(lsp-session-file (locate-user-emacs-file ".lsp-session")) ;; Specify session file location.
(lsp-log-io nil) ;; Disable IO logging for speed.
(lsp-idle-delay 0.5) ;; Set the delay for LSP to 0 (debouncing).
(lsp-keep-workspace-alive nil) ;; Disable keeping the workspace alive.
;; Core settings
(lsp-enable-xref t) ;; Enable cross-references.
(lsp-auto-configure t) ;; Automatically configure LSP.
(lsp-enable-links nil) ;; Disable links.
(lsp-eldoc-enable-hover t) ;; Enable ElDoc hover.
(lsp-enable-file-watchers nil) ;; Disable file watchers.
(lsp-enable-folding nil) ;; Disable folding.
(lsp-enable-imenu t) ;; Enable Imenu support.
(lsp-enable-indentation nil) ;; Disable indentation.
(lsp-enable-on-type-formatting nil) ;; Disable on-type formatting.
(lsp-enable-suggest-server-download t) ;; Enable server download suggestion.
(lsp-enable-symbol-highlighting t) ;; Enable symbol highlighting.
(lsp-enable-text-document-color t) ;; Enable text document color.
;; Modeline settings
(lsp-modeline-code-actions-enable nil) ;; Keep modeline clean.
(lsp-modeline-diagnostics-enable nil) ;; Use `flymake' instead.
(lsp-modeline-workspace-status-enable t) ;; Display "LSP" in the modeline when enabled.
(lsp-signature-doc-lines 1) ;; Limit echo area to one line.
(lsp-eldoc-render-all t) ;; Render all ElDoc messages.
;; Completion settings
(lsp-completion-enable t) ;; Enable completion.
(lsp-completion-enable-additional-text-edit t) ;; Enable additional text edits for completions.
(lsp-enable-snippet nil) ;; Disable snippets
(lsp-completion-show-kind t) ;; Show kind in completions.
;; Lens settings
(lsp-lens-enable t) ;; Enable lens support.
;; Headerline settings
(lsp-headerline-breadcrumb-enable-symbol-numbers t) ;; Enable symbol numbers in the headerline.
(lsp-headerline-arrow "") ;; Set arrow for headerline.
(lsp-headerline-breadcrumb-enable-diagnostics nil) ;; Disable diagnostics in headerline.
(lsp-headerline-breadcrumb-icons-enable nil) ;; Disable icons in breadcrumb.
;; Semantic settings
(lsp-semantic-tokens-enable nil)) ;; Disable semantic tokens.
#+end_src
*** Eldoc-box
#+begin_src emacs-lisp
(use-package eldoc-box
:ensure t
:defer t)
#+end_src
*** Diff-hl
#+begin_src emacs-lisp
(use-package diff-hl
:defer t
:ensure t
:hook
(find-file . (lambda ()
(global-diff-hl-mode) ;; Enable Diff-HL mode for all files.
(diff-hl-flydiff-mode) ;; Automatically refresh diffs.
(diff-hl-margin-mode))) ;; Show diff indicators in the margin.
:custom
(diff-hl-side 'left) ;; Set the side for diff indicators.
(diff-hl-margin-symbols-alist '((insert . "") ;; Customize symbols for each change type.
(delete . "-")
(change . "")
(unknown . "")
(ignored . "i"))))
#+end_src
*** Magit
#+begin_src emacs-lisp
(use-package magit
:ensure t
:config
(setopt magit-format-file-function #'magit-format-file-nerd-icons) ;; Turns on magit nerd-icons
:defer t)
#+end_src
*** Evil
#+begin_src emacs-lisp
(use-package evil
:ensure t
:defer t
:hook
(after-init . evil-mode)
:init
(setq evil-want-integration t) ;; Integrate `evil' with other Emacs features (optional as it's true by default).
(setq evil-want-keybinding nil) ;; Disable default keybinding to set custom ones.
(setq evil-want-C-u-scroll t) ;; Makes C-u scroll
(setq evil-want-C-u-delete t) ;; Makes C-u delete on insert mode
:config
(evil-set-undo-system 'undo-tree) ;; Uses the undo-tree package as the default undo system
(evil-set-leader 'normal (kbd "SPC"))
(evil-set-leader 'visual (kbd "SPC"))
(setq evil-want-fine-undo t))
(use-package evil-collection
:defer t
:ensure t
:custom
(evil-collection-want-find-usages-bindings t)
:hook
(evil-mode . evil-collection-init))
(use-package evil-surround
:ensure t
:after evil-collection
:config
(global-evil-surround-mode 1))
(use-package evil-matchit
:ensure t
:after evil-collection
:config
(global-evil-matchit-mode 1))
#+end_src
*** General
#+begin_src emacs-lisp
(use-package general
:ensure t
:after (evil evil-collection)
:init
(setq general-override-states '(insert
emacs
hybrid
normal
visual
motion
operator
replace))
:config
(general-evil-setup t)
(general-define-key
:states 'normal
"] d" '(flymake-goto-next-error :wk "Goto next error")
"[ d" '(flymake-goto-prev-error :wk "Goto prev error")
"] c" '(diff-hl-next-hunk :wk "Goto next hunk")
"[ c" '(diff-hl-previous-hunk :wk "Goto prev hunk")
"g r" '(lsp-find-references :wk "Goto references")
"K" '(eldoc-box-help-at-point :wk "Describe"))
(general-create-definer my-leader-def
:states '(normal insert visual motion emacs)
:keymaps 'override
:prefix "SPC"
:global-prefix "C-SPC")
(my-leader-def
"f" '(:ignore t :wk "Find")
"f c" '((lambda () (interactive) (find-file "~/.config/emacs/init.el")) :wk "Edit emacs config")
"f r" '(consult-recent-file :wk "Recent files")
"f f" '(consult-find :wk "Find Files")
"f g" '(consult-ripgrep :wk "Ripgrep search in files")
"f G" '(consult-git-grep :wk "Ripgrep search in files")
"f l" '(consult-line :wk "Find line")
"f i" '(consult-imenu :wk "Imenu buffer locations"))
(my-leader-def
"c" '(:ignore t :wk "Code")
"c a" '(lsp-execute-code-action :wk "Code actions"))
(my-leader-def
"h" '(:ignore t :wk "Help")
"h v" '(describe-variable :wk "Describe variable")
"h f" '(describe-function :wk "Describe function")
"h k" '(describe-key :wk "Describe key"))
(my-leader-def
"p" '(:ignore t :wk "Project")
"p b" '(consult-project-buffer :wk "Project buffers")
"p p" '(project-switch-project :wk "Project switch")
"p f" '(project-find-file :wk "Project find file")
"p g" '(project-find-regexp :wk "Project grep file")
"p k" '(project-kill-buffers :wk "Project kill buffers")
"p d" '(project-dired :wk "Project dired"))
(my-leader-def
"x" '(:ignore t :wk "Flymake")
"x x" '(consult-flymake :wk "Show diagnostics"))
(my-leader-def
"g" '(:ignore t :wk "Git")
"g g" '(magit-status :wk "Magit status")
"g l" '(magit-log-current :wk "Magit log"))
(my-leader-def
"r n" '(lsp-rename :wk "Rename"))
(my-leader-def
"u" '(undo-tree-visualize :wk "Undo-tree")))
#+end_src
*** Undo tree
#+begin_src emacs-lisp
(use-package undo-tree
:defer t
:ensure t
:hook
(after-init . global-undo-tree-mode)
:init
(setq undo-tree-visualizer-timestamps t
undo-tree-visualizer-diff t
undo-limit 800000 ;; Limit for undo entries.
undo-strong-limit 12000000 ;; Strong limit for undo entries.
undo-outer-limit 120000000) ;; Outer limit for undo entries.
:config
(setq undo-tree-history-directory-alist '(("." . "~/.emacs.d/.cache/undo"))))
#+end_src
*** Dotenv mode
#+begin_src emacs-lisp
(use-package dotenv-mode
:defer t
:ensure t)
#+end_src
*** Doom Modeline
#+begin_src emacs-lisp
(use-package doom-modeline
:ensure t
:defer t
:custom
(doom-modeline-buffer-file-name-style 'buffer-name) ;; Set the buffer file name style to just the buffer name (without path).
(doom-modeline-project-detection 'project) ;; Enable project detection for displaying the project name.
(doom-modeline-buffer-name t) ;; Show the buffer name in the mode line.
(doom-modeline-vcs-max-length 25) ;; Limit the version control system (VCS) branch name length to 25 characters.
:config
(setq doom-modeline-icon t) ;; Enable icons in the mode line if nerd fonts are used.
:hook
(after-init . doom-modeline-mode))
#+end_src
*** Nerd icons
#+begin_src emacs-lisp
(use-package nerd-icons
:ensure t
:defer t)
(use-package nerd-icons-dired
:ensure t ;; Ensure the package is installed.
:defer t ;; Load the package only when needed to improve startup time.
:hook
(dired-mode . nerd-icons-dired-mode))
(use-package nerd-icons-completion
:ensure t ;; Ensure the package is installed.
:after (:all nerd-icons marginalia) ;; Load after `nerd-icons' and `marginalia' to ensure proper integration.
:config
(nerd-icons-completion-mode) ;; Activate nerd icons for completion interfaces.
(add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) ;; Setup icons in the marginalia mode for enhanced completion display.
#+end_src
*** Path fixes
#+begin_src emacs-lisp
(use-package exec-path-from-shell
:ensure t
:init
(exec-path-from-shell-initialize))
(use-package envrc
:ensure t
:init
(setq envrc-show-summary-in-minibuffer nil)
:hook
(after-init . envrc-global-mode))
#+end_src
*** Theme
#+begin_src emacs-lisp
(use-package modus-themes
:ensure t
:config
(load-theme 'modus-operandi t))
#+end_src

View File

@@ -5,6 +5,29 @@
...
}: {
programs = {
aerc = {
enable = true;
extraConfig = {
ui = {
sort = "-r arrival";
threading-enabled = true;
fuzzy-complete = true;
};
general = {
default-save-path = "~/Downloads";
log-file = "~/.aerc.log";
unsafe-accounts-conf = true;
};
compose = {
address-book-cmd = "notmuch address \"%s\"";
};
filters = {
"text/plain" = "colorize";
"text/calendar" = "calendar";
"text/html" = "html | colorize";
};
};
};
msmtp = {
enable = true;
};
@@ -32,10 +55,11 @@
email = {
accounts.personal = {
primary = true;
address = "michael@michaelthomson.dev";
address = "me@michaelthomson.dev";
realName = "Michael Thomson";
userName = "michael@michaelthomson.dev";
passwordCommand = "rbw get --folder email michael@michaelthomson.dev";
userName = "me@michaelthomson.dev";
# passwordCommand = "rbw get --folder email me@michaelthomson.dev";
passwordCommand = "cat ~/auth/email";
mbsync = {
enable = true;
create = "both";
@@ -61,6 +85,12 @@
notmuch = {
enable = true;
};
aerc = {
enable = true;
# extraAccounts = {
# source = "maildir://~/Maildir/work";
# };
};
};
};
};

View File

@@ -11,9 +11,13 @@
git = {
enable = true;
settings = {
gpg = {
format = "ssh";
};
user = {
name = "Michael Thomson";
email = "michael@michaelthomson.dev";
email = "me@michaelthomson.dev";
signingkey = "~/.ssh/id_rsa.pub";
};
column = {
ui = "auto";

View File

@@ -11,6 +11,9 @@
kompose
kubernetes-helm
envsubst
age
sops
kustomize
];
programs = {

View File

@@ -51,6 +51,8 @@ in {
];
notes = with pkgs; [
zk
tinymist
typst
];
lua = with pkgs; [
lua-language-server
@@ -74,6 +76,7 @@ in {
vscode-langservers-extracted
stylelint-lsp
tailwindcss-language-server
vscode-css-languageserver
];
yaml = with pkgs; [
yaml-language-server
@@ -102,6 +105,7 @@ in {
(nvim-treesitter.withPlugins (
plugins:
nvim-treesitter.allGrammars ++ [kulala-grammer]
))
snacks-nvim
gruvbox-nvim
@@ -122,7 +126,7 @@ in {
optionalPlugins = {
notes = with pkgs.vimPlugins; [
zk-nvim
render-markdown-nvim
typst-preview-nvim
];
go = with pkgs.vimPlugins; [
nvim-dap-go
@@ -219,7 +223,7 @@ in {
};
# anything else to pass and grab in lua with `nixCats.extra`
extra = {
nixdExtras.nixpkgs = ''import ${pkgs.path} {}'';
nixdExtras.nixpkgs = ''import <nixpkgs> { }'';
};
};
};

View File

@@ -206,70 +206,50 @@ require('lze').load {
},
{
"nvim-treesitter",
enabled = nixCats('general') or false,
event = "DeferredUIEnter",
load = function (name)
vim.cmd.packadd(name)
vim.cmd.packadd("nvim-treesitter-textobjects")
end,
after = function (plugin)
require('nvim-treesitter.configs').setup {
highlight = { enable = true, },
indent = { enable = false, },
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<c-space>',
node_incremental = '<c-space>',
scope_incremental = '<c-s>',
node_decremental = '<M-space>',
},
},
textobjects = {
select = {
enable = true,
lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
keymaps = {
-- You can use the capture groups defined in textobjects.scm
['aa'] = '@parameter.outer',
['ia'] = '@parameter.inner',
['af'] = '@function.outer',
['if'] = '@function.inner',
['ac'] = '@class.outer',
['ic'] = '@class.inner',
},
},
move = {
enable = true,
set_jumps = true, -- whether to set jumps in the jumplist
goto_next_start = {
[']m'] = '@function.outer',
[']]'] = '@class.outer',
},
goto_next_end = {
[']M'] = '@function.outer',
[']['] = '@class.outer',
},
goto_previous_start = {
['[m'] = '@function.outer',
['[['] = '@class.outer',
},
goto_previous_end = {
['[M'] = '@function.outer',
['[]'] = '@class.outer',
},
},
swap = {
enable = true,
swap_next = {
['<leader>a'] = '@parameter.inner',
},
swap_previous = {
['<leader>A'] = '@parameter.inner',
},
},
},
}
lazy = false,
after = function(plugin)
---@param buf integer
---@param language string
local function treesitter_try_attach(buf, language)
-- check if parser exists and load it
if not vim.treesitter.language.add(language) then
return
end
-- enables syntax highlighting and other treesitter features
vim.treesitter.start(buf, language)
-- enables treesitter based folds
vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()"
-- enables treesitter based indentation
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end
local available_parsers = require("nvim-treesitter").get_available()
vim.api.nvim_create_autocmd("FileType", {
callback = function(args)
local buf, filetype = args.buf, args.match
local language = vim.treesitter.language.get_lang(filetype)
if not language then
return
end
local installed_parsers = require("nvim-treesitter").get_installed("parsers")
if vim.tbl_contains(installed_parsers, language) then
-- enable the parser if it is installed
treesitter_try_attach(buf, language)
elseif vim.tbl_contains(available_parsers, language) then
-- if a parser is available in `nvim-treesitter` enable it after ensuring it is installed
require("nvim-treesitter").install(language):await(function()
treesitter_try_attach(buf, language)
end)
else
-- try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
treesitter_try_attach(buf, language)
end
end,
})
end,
},
{
@@ -598,6 +578,24 @@ require('lze').load {
})
end
},
{
"obsidian.nvim",
enabled = nixCats('notes') or false,
ft = {"md"},
after = function ()
require("obsidian").setup({
workspaces = {
{
name = "everything",
path = "~/vaults/everything"
},
},
daily_notes = {
folder = "journal"
},
})
end
},
{
"zk-nvim",
enabled = nixCats('notes') or false,
@@ -612,10 +610,15 @@ require('lze').load {
-- Create a new note after asking for its title.
vim.api.nvim_set_keymap("n", "<leader>zn", "<Cmd>ZkNew { title = vim.fn.input('Title: ') }<CR>", opts)
-- Create note from selection
vim.api.nvim_set_keymap("v", "<leader>znt", ":'<,'>ZkNewFromTitleSelection<CR>", opts)
-- Open notes.
vim.api.nvim_set_keymap("n", "<leader>zf", "<Cmd>ZkNotes { sort = { 'modified' } }<CR>", opts)
-- Open notes associated with the selected tags.
vim.api.nvim_set_keymap("n", "<leader>zt", "<Cmd>ZkTags<CR>", opts)
-- show links in note
vim.api.nvim_set_keymap("n", "<leader>zl", "<Cmd>ZkLinks<CR>", opts)
-- Search for the notes matching a given query.
vim.api.nvim_set_keymap("n", "<leader>zg", "<Cmd>ZkNotes { sort = { 'modified' }, match = { vim.fn.input('Search: ') } }<CR>", opts)
@@ -624,11 +627,10 @@ require('lze').load {
end
},
{
"render-markdown.nvim",
"typst-preview.nvim",
enabled = nixCats('notes') or false,
ft = "markdown",
after = function ()
require('render-markdown').setup({})
require('typst-preview').setup({})
end
}
}
@@ -751,6 +753,11 @@ require('lze').load {
},
{
"tailwindcss",
enabled = false,
lsp = {},
},
{
"cssls",
enabled = nixCats('typescript') or false,
lsp = {},
},
@@ -783,6 +790,11 @@ require('lze').load {
-- filetypes = { "go", "gomod", "gowork", "gotmpl" },
},
},
{
"tinymist",
enabled = nixCats("notes") or false,
lsp = {},
},
{
"nixd",
enabled = nixCats('nix') or false,
@@ -793,16 +805,6 @@ require('lze').load {
nixpkgs = {
expr = nixCats.extra("nixdExtras.nixpkgs") or [[import <nixpkgs> {}]],
},
options = {
nixos = {
-- nixdExtras.nixos_options = ''(builtins.getFlake "path:${builtins.toString inputs.self.outPath}").nixosConfigurations.configname.options''
expr = nixCats.extra("nixdExtras.nixos_options")
},
["home-manager"] = {
-- nixdExtras.home_manager_options = ''(builtins.getFlake "path:${builtins.toString inputs.self.outPath}").homeConfigurations.configname.options''
expr = nixCats.extra("nixdExtras.home_manager_options")
}
},
formatting = {
command = { "alejandra" }
},