From 60b061bb976f9cdad4b61dfae5830795edbd18a2 Mon Sep 17 00:00:00 2001 From: Michael Thomson Date: Fri, 26 Sep 2025 21:38:33 -0400 Subject: [PATCH] update --- flake.lock | 38 ++ flake.nix | 93 +-- hosts/macbook/configuration.nix | 4 - hosts/macbook/home.nix | 16 - modules/home-manager/emacs/default.nix | 52 +- modules/home-manager/emacs/emacs/init.el | 790 ----------------------- modules/home-manager/emacs/init.el | 473 ++++++++++++++ modules/home-manager/kitty.nix | 83 --- modules/nixos/emacs/default.nix | 2 +- 9 files changed, 593 insertions(+), 958 deletions(-) delete mode 100644 modules/home-manager/emacs/emacs/init.el create mode 100644 modules/home-manager/emacs/init.el diff --git a/flake.lock b/flake.lock index 0a8cc2e..ebc17db 100644 --- a/flake.lock +++ b/flake.lock @@ -100,6 +100,27 @@ "type": "github" } }, + "emacs-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1758907459, + "narHash": "sha256-sioGEyOZ1qNALT0khO3S574IRWMleVaKQ/VrejCBXkk=", + "owner": "nix-community", + "repo": "emacs-overlay", + "rev": "804e75fd1406faceeddd75014bf463dbf5140063", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "emacs-overlay", + "type": "github" + } + }, "firefox-gnome-theme": { "flake": false, "locked": { @@ -703,6 +724,22 @@ "type": "github" } }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1758791193, + "narHash": "sha256-F8WmEwFoHsnix7rt290R0rFXNJiMbClMZyIC/e+HYf0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "25e53aa156d47bad5082ff7618f5feb1f5e02d01", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_2": { "locked": { "lastModified": 1758277210, @@ -855,6 +892,7 @@ }, "root": { "inputs": { + "emacs-overlay": "emacs-overlay", "home-manager": "home-manager", "hyprland": "hyprland", "hyprland-plugins": "hyprland-plugins", diff --git a/flake.nix b/flake.nix index 5d6d31c..b0fccba 100644 --- a/flake.nix +++ b/flake.nix @@ -27,60 +27,65 @@ }; nixos-wsl.url = "github:nix-community/NixOS-WSL/main"; stylix.url = "github:danth/stylix"; + emacs-overlay = { + url = "github:nix-community/emacs-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = inputs @ { - nixpkgs, - nix-darwin, - nix-on-droid, - nixos-wsl, - ... - }: { - nixosConfigurations = { - desktop = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - specialArgs = {inherit inputs;}; - modules = [ - ./hosts/desktop/configuration.nix - ]; - }; - thinkpad = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - specialArgs = {inherit inputs;}; - modules = [ - ./hosts/thinkpad/configuration.nix - ]; - }; - macvm = nixpkgs.lib.nixosSystem { - system = "aarch64-linux"; - specialArgs = {inherit inputs;}; - modules = [ - ./hosts/macvm/configuration.nix - ]; - }; - wsl = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - specialArgs = {inherit inputs;}; - modules = [ - nixos-wsl.nixosModules.default - ./hosts/wsl/configuration.nix - ]; - }; - }; + nixpkgs, + nix-darwin, + nix-on-droid, + nixos-wsl, + ... + }: + { + nixosConfigurations = { + desktop = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = {inherit inputs;}; + modules = [ + ./hosts/desktop/configuration.nix + ]; + }; + thinkpad = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = {inherit inputs;}; + modules = [ + ./hosts/thinkpad/configuration.nix + ]; + }; + macvm = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + specialArgs = {inherit inputs;}; + modules = [ + ./hosts/macvm/configuration.nix + ]; + }; + wsl = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + specialArgs = {inherit inputs;}; + modules = [ + nixos-wsl.nixosModules.default + ./hosts/wsl/configuration.nix + ]; + }; + }; - darwinConfigurations = { + darwinConfigurations = { macbook = nix-darwin.lib.darwinSystem { - specialArgs = {inherit inputs;}; - modules = [ + specialArgs = {inherit inputs;}; + modules = [ ./hosts/macbook/configuration.nix - ]; + ]; }; - }; + }; - nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { + nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { pkgs = import nixpkgs { system = "aarch64-linux"; }; extraSpecialArgs = {inherit inputs;}; modules = [ ./hosts/android/configuration.nix ]; - }; + }; }; } diff --git a/hosts/macbook/configuration.nix b/hosts/macbook/configuration.nix index 5a87c82..0d1ceed 100644 --- a/hosts/macbook/configuration.nix +++ b/hosts/macbook/configuration.nix @@ -54,10 +54,6 @@ }; }; - nixpkgs.config.packageOverrides = pkgs: { - emacs = pkgs.emacs.override { withNativeCompilation = false; }; - }; - system.stateVersion = 5; # fix for this: https://github.com/LnL7/nix-darwin/issues/1346 diff --git a/hosts/macbook/home.nix b/hosts/macbook/home.nix index bf25e41..1e54b26 100644 --- a/hosts/macbook/home.nix +++ b/hosts/macbook/home.nix @@ -29,28 +29,12 @@ home.homeDirectory = "/Users/mthomson"; home.stateVersion = "23.11"; - home.sessionVariables = { - ZK_NOTEBOOK_DIR = "\${HOME}/zk"; - }; - - programs = { - zk = { - enable = true; - settings = { - notebook = { - dir = "~/zk"; - }; - }; - }; - }; - home.packages = with pkgs; [ hidden-bar presenterm (azure-cli.withExtensions [ azure-cli.extensions.containerapp ]) - scrcpy nh ]; diff --git a/modules/home-manager/emacs/default.nix b/modules/home-manager/emacs/default.nix index 06a6f1e..6457458 100644 --- a/modules/home-manager/emacs/default.nix +++ b/modules/home-manager/emacs/default.nix @@ -1,37 +1,49 @@ { pkgs, config, + inputs, ... -}: { +}: +let + myPkgs = import pkgs.path { + inherit (pkgs) system; + overlays = [ inputs.emacs-overlay.overlays.default ]; + }; +in +{ home.packages = with pkgs; [ - # emacs - tree-sitter - fd - ripgrep - typescript-language-server - typescript - vscode-langservers-extracted - nodejs - # mathpix-snipping-tool + emacs-lsp-booster + tree-sitter + fd + ripgrep + typescript-language-server + typescript + vscode-langservers-extracted + nodejs + nixd + cmake libtool glibtool graphviz - libvterm ]; programs.emacs = { enable = true; - extraPackages = epkgs: [ - epkgs.mu4e - epkgs.pdf-tools - epkgs.vterm - ]; + package = myPkgs.emacsWithPackagesFromUsePackage { + config = ./init.el; + defaultInitFile = false; + extraEmacsPackages = epkgs: with epkgs; [ + mu4e + pdf-tools + vterm + treesit-grammars.with-all-grammars + ]; + }; }; - #services.emacs.enable = true; - home.file.".config/emacs" = { - source = ./emacs; - recursive = true; + services.emacs.enable = true; + home.file.".config/emacs/init.el" = { + source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/dev/personal/nixos/modules/home-manager/emacs/init.el"; }; } diff --git a/modules/home-manager/emacs/emacs/init.el b/modules/home-manager/emacs/emacs/init.el deleted file mode 100644 index 8f7810d..0000000 --- a/modules/home-manager/emacs/emacs/init.el +++ /dev/null @@ -1,790 +0,0 @@ -;; performance enhancements -(setq gc-cons-threshold #x40000000) - -(setq read-process-output-max (* 1024 1024 4)) - -;; disable package.el on startup -(setq package-enable-at-startup nil) -;; bootstrap `straight.el` -(defvar bootstrap-version) -(let ((bootstrap-file - (expand-file-name - "straight/repos/straight.el/bootstrap.el" - (or (bound-and-true-p straight-base-dir) - user-emacs-directory))) - (bootstrap-version 7)) - (unless (file-exists-p bootstrap-file) - (with-current-buffer - (url-retrieve-synchronously - "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el" - 'silent 'inhibit-cookies) - (goto-char (point-max)) - (eval-print-last-sexp))) - (load bootstrap-file nil 'nomessage)) -(straight-use-package 'use-package) - -;; add MELPA -(require 'package) -(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) - -(straight-use-package 'org) - -;; 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) - (tab-always-indent t) - (tab-width 4) - ;; (treesit-font-lock-level 4) - (truncate-lines t) - (use-dialog-box nil) - (use-short-answers t) - ;;(warning-minimum-level :emergency) - - :hook - (prog-mode . display-line-numbers-mode) - - :config - (defun skip-these-buffers (_window buffer _bury-or-kill) - "Function for `switch-to-prev-buffer-skip'." - (string-match "\\*[^*]+\\*" (buffer-name buffer))) - (setq switch-to-prev-buffer-skip 'skip-these-buffers) - - (set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 100) - - (setq custom-file (locate-user-emacs-file "custom-vars.el")) - (load custom-file 'noerror 'nomessage) - - :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)) - -(use-package doom-themes - :ensure t - :straight t - :custom - ;; Global settings (defaults) - (doom-themes-enable-bold t) ; if nil, bold is universally disabled - (doom-themes-enable-italic t) ; if nil, italics is universally disabled - :config - (load-theme 'modus-operandi t) - - ;; Enable flashing mode-line on errors - (doom-themes-visual-bell-config) - ;; Corrects (and improves) org-mode's native fontification. - (doom-themes-org-config)) - -(use-package eldoc - :ensure nil - :init - (global-eldoc-mode)) - -(use-package flymake - :ensure nil - :defer t - :hook (prog-mode . flymake-mode)) - -(use-package org - :ensure nil - :defer t - :custom - (org-return-follows-link t) - (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)"))) - (org-capture-templates - `(("i" "Inbox" entry (file+headline "todo.org" "Inbox") - ,(concat "* TODO %?\n" - "%U")) - ("j" "Journal" entry (file denote-journal-path-to-new-or-existing-entry) - "* %U %?\n%i\n%a" - :kill-buffer t - :empty-lines 1) - ("@" "Inbox [email]" entry (file+headline "todo.org" "Inbox") - ,(concat "* TODO Process \"%a\" %?\n" - "%U")))) - (org-refile-use-outline-path 'file) - (org-outline-path-complete-in-steps nil) - (org-refile-targets '((nil :maxlevel . 9) - (org-agenda-files :maxlevel . 9))) - (org-agenda-skip-scheduled-if-done t) - (org-agenda-skip-deadline-if-done t) - (org-agenda-include-deadlines t) - (org-agenda-include-diary t) - (org-agenda-block-separator nil) - (org-agenda-compact-blocks t) - (org-agenda-start-with-log-mode t) - :config - (setq org-directory "~/org") - (setq org-agenda-files (list "todo.org")) - :hook - (org-mode . org-indent-mode) - :init - (require 'org-tempo)) - -(use-package org-modern - :ensure t - :straight t - :hook - (org-mode . global-org-modern-mode) - :custom - (org-modern-keyword nil) - (org-modern-checkbox nil) - (org-modern-table nil)) - -(use-package toc-org - :ensure t - :straight t - :hook (org-mode . toc-org-mode)) - -(use-package denote - :ensure t - :straight 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 - :straight 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 - :straight 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 -;; :straight t -;; :hook -;; (org-mode . org-superstar-mode)) - -(use-package org-super-agenda - :ensure t - :straight 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) - ))) - -(use-package which-key - :ensure nil - :defer t - :hook - (after-init . which-key-mode)) - -(use-package nerd-icons - :ensure t - :straight t - :defer t) - -(use-package nerd-icons-dired - :ensure t - :straight t - :defer t - :hook - (dired-mode . nerd-icons-dired-mode)) - -(use-package doom-modeline - :ensure t - :config - (display-battery-mode t) - (display-time-mode t) - :init (doom-modeline-mode 1)) - -(use-package evil - :ensure t - :straight t - :defer t - :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"))) - -(use-package evil-collection - :defer t - :straight t - :ensure t - :custom - (evil-collection-want-find-usages-bindings t) - :hook - (evil-mode . evil-collection-init)) - -(use-package evil-surround - :ensure t - :straight t - :after evil-collection - :config - (global-evil-surround-mode 1)) - -(use-package evil-matchit - :ensure t - :straight t - :after evil-collection - :config - (global-evil-matchit-mode 1)) - -(use-package undo-tree - :defer t - :ensure t - :straight t - :hook - (after-init . global-undo-tree-mode) - :init - (setq undo-tree-visualizer-timestamps t - undo-tree-visualizer-diff t - undo-limit 800000 - undo-strong-limit 12000000 - undo-outer-limit 120000000) - :config - (setq undo-tree-history-directory-alist '(("." . "~/.config/emacs/.cache/undo")))) - -(use-package general - :ensure t - :straight t - :config - (defun mthomson/lsp-describe-and-jump () - "Show hover documentation and jump to *lsp-help* buffer." - (interactive) - (lsp-describe-thing-at-point) - (let ((help-buffer "*lsp-help*")) - (when (get-buffer help-buffer) - (switch-to-buffer-other-window help-buffer)))) - (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") - "K" '(mthomson/lsp-describe-and-jump :wk "Describe")) - - (general-define-key - :states 'normal - :predicate 'lsp-mode - "g r" '(lsp-find-references :wk "Go to references") - "g d" '(lsp-find-definition :wk "Go to definition") - "g D" '(lsp-find-declaration :wk "Go to declaration") - "g I" '(lsp-find-implementation :wk "Go to implementation") - "g t" '(lsp-find-type-definition :wk "Go to type definition") - "K" '(mthomson/lsp-describe-and-jump :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 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 - "u" '(undo-tree-visualize :wk "Undo-tree"))) - -(use-package vertico - :ensure t - :straight t - :hook - (after-init . vertico-mode)) - -(use-package orderless - :ensure t - :straight t - :custom - (completion-styles '(orderless partial-completion basic)) - (completion-category-defaults nil) - (completion-category-overrides '((file (styles partial-completion))))) - -(use-package marginalia - :ensure t - :straight t - :hook - (after-init . marginalia-mode)) - -(use-package consult - :ensure t - :straight t - :defer t) - -(use-package embark - :ensure t - :straight t - :defer t) - -(use-package embark-consult - :ensure t - :straight t - :hook - (embark-collect-mode . consult-preview-at-point-mode)) - -(use-package treesit-auto - :ensure t - :straight t - :after emacs - :custom - (treesit-auto-install 'prompt) - :config - (treesit-auto-add-to-auto-mode-alist 'all) - (global-treesit-auto-mode) - :init - (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))) - -(use-package corfu - :ensure t - :straight t - :custom - (corfu-auto t) - (corfu-cycle t) - (corfu-auto-prefix 2) - (corfu-popupinfo-mode t) - (corfu-popupinfo-delay 0.5) - (corfu-on-exact-match nil) - (completion-ignore-case t) - :init - (global-corfu-mode)) - -(use-package nerd-icons-corfu - :ensure t - :straight t - :after corfu - :init (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) - -(use-package cape - :ensure t - :straight t - :after corfu - :bind ("C-c p" . cape-prefix-map) - :init - (add-hook 'completion-at-point-functions #'cape-dabbrev) - (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)) - -;; (use-package company -;; :ensure t -;; :straight t -;; :defer t -;; :custom -;; (company-tooltip-align-annotations t) -;; (company-minimum-prefix-length 1) -;; (company-idle-delay 0.2) -;; :hook -;; (after-init . global-company-mode)) - -(use-package lsp-mode - :ensure t - :straight t - :defer t - :hook ( - (bash-ts-mode . lsp) - (typescript-ts-mode . lsp) - (tsx-ts-mode . lsp) - (js-mode . lsp) - (js-ts-mode . lsp) - (css-ts-mode . lsp) - (c-ts-mode . lsp) - (c++-ts-mode . lsp) - (lsp-mode . lsp-enable-which-key-integration) - (lsp-completion-mode . my/lsp-mode-setup-completion)) - :commands lsp - :init - (defun my/lsp-mode-setup-completion () - (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) - '(flex))) ;; Configure flex - :custom - (lsp-keymap-prefix "C-c l") ;; Set the prefix for LSP commands. - (lsp-inlay-hint-enable t) ;; Enable 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) ;; 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 t) ;; Enable 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 nil) ;; Disable 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 t) ;; 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. - -;; lsp-booster -(defun lsp-booster--advice-json-parse (old-fn &rest args) - "Try to parse bytecode instead of json." - (or - (when (equal (following-char) ?#) - (let ((bytecode (read (current-buffer)))) - (when (byte-code-function-p bytecode) - (funcall bytecode)))) - (apply old-fn args))) -(advice-add (if (progn (require 'json) - (fboundp 'json-parse-buffer)) - 'json-parse-buffer - 'json-read) - :around - #'lsp-booster--advice-json-parse) - -(defun lsp-booster--advice-final-command (old-fn cmd &optional test?) - "Prepend emacs-lsp-booster command to lsp CMD." - (let ((orig-result (funcall old-fn cmd test?))) - (if (and (not test?) ;; for check lsp-server-present? - (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper - lsp-use-plists - (not (functionp 'json-rpc-connection)) ;; native json-rpc - (executable-find "emacs-lsp-booster")) - (progn - (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH) - (setcar orig-result command-from-exec-path)) - (message "Using emacs-lsp-booster for %s!" orig-result) - (cons "emacs-lsp-booster" orig-result)) - orig-result))) -(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) - -;; (use-package yasnippet -;; :ensure t -;; :straight t) - -;; (use-package yasnippet-snippets -;; :ensure t -;; :straight t -;; :hook (prog-mode . yas-minor-mode)) - -;; Configure Tempel -(use-package tempel - :ensure t - :straight t - :bind (("M-+" . tempel-complete) - ("M-*" . tempel-insert)) - :init - (defun tempel-setup-capf () - (setq-local completion-at-point-functions - (cons #'tempel-expand - completion-at-point-functions))) - (add-hook 'conf-mode-hook 'tempel-setup-capf) - (add-hook 'prog-mode-hook 'tempel-setup-capf) - (add-hook 'text-mode-hook 'tempel-setup-capf) - (add-hook 'prog-mode-hook #'tempel-abbrev-mode) - (global-tempel-abbrev-mode)) - -(use-package tempel-collection - :ensure t - :straight t) - -(use-package exec-path-from-shell - :ensure t - :straight t - :init - (exec-path-from-shell-initialize)) - -;; (use-package direnv -;; :ensure t -;; :straight t -;; :config -;; (direnv-mode)) - -(use-package envrc - :ensure t - :straight t - :init - (setq envrc-show-summary-in-minibuffer nil) - :hook - (after-init . envrc-global-mode)) - -;; (use-package add-node-modules-path -;; :ensure t -;; :straight t -;; :defer t -;; :custom -;; (eval-after-load 'typescript-ts-mode -;; '(add-hook 'typescript-ts-mode-hook #'add-node-modules-path)) -;; (eval-after-load 'tsx-ts-mode -;; '(add-hook 'tsx-ts-mode-hook #'add-node-modules-path)) -;; (eval-after-load 'typescriptreact-mode -;; '(add-hook 'typescriptreact-mode-hook #'add-node-modules-path)) -;; (eval-after-load 'js-mode -;; '(add-hook 'js-mode-hook #'add-node-modules-path))) - -(use-package pulsar - :defer t - :straight t - :ensure t - :hook - (after-init . pulsar-global-mode) - :config - (setq pulsar-pulse t) - (setq pulsar-delay 0.025) - (setq pulsar-iterations 10) - (setq pulsar-face 'evil-ex-lazy-highlight) - - (add-to-list 'pulsar-pulse-functions 'evil-scroll-down) - (add-to-list 'pulsar-pulse-functions 'flymake-goto-next-error) - (add-to-list 'pulsar-pulse-functions 'flymake-goto-prev-error) - (add-to-list 'pulsar-pulse-functions 'evil-yank) - (add-to-list 'pulsar-pulse-functions 'evil-yank-line) - (add-to-list 'pulsar-pulse-functions 'evil-delete) - (add-to-list 'pulsar-pulse-functions 'evil-delete-line) - (add-to-list 'pulsar-pulse-functions 'evil-jump-item) - (add-to-list 'pulsar-pulse-functions 'diff-hl-next-hunk) - (add-to-list 'pulsar-pulse-functions 'diff-hl-previous-hunk)) - -(use-package magit - :ensure t - :straight t - :defer t) - -(use-package diff-hl - :ensure t - :straight t - :config - (global-diff-hl-mode)) - -;; Mu4e -(use-package mu4e - :config - ;; mbsync - ;;(setq mu4e-mu-binary "mu") - (setq mu4e-get-mail-command (concat (executable-find "mbsync") " -a")) - (setq mu4e--get-mail-password-regexp "^Master Password: $") - (setq mu4e-update-interval 300) - (setq mu4e-change-filenames-when-moving t) - (setq mu4e-attachment-dir "~/Downloads") - - ;;smtp - (setq send-mail-function 'sendmail-send-it) - (setq sendmail-program (executable-find "msmtp")) - (setq message-sendmail-envelop-from 'header) - - ;; 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 . "michael@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")))))) - -(use-package notmuch - :ensure t - :straight 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"))) - :init - (add-hook 'message-send-hook (lambda () - (let ((from (message-fetch-field "From"))) - (if (string-match-p (regexp-quote "michael@michaelthomson.dev") from) - (progn - (setq sendmail-program "msmtp") - (setq message-sendmail-extra-arguments nil)) - (progn - (setq sendmail-program "gmi") - (setq message-sendmail-extra-arguments '("send" "--quiet" "-t" "-C" "~/Maildir/work"))))))) - :config - (setq notmuch-fcc-dirs nil)) - -(use-package ol-notmuch - :ensure t - :straight t - :bind - ("C-c l" . org-store-link)) - -;; epubs -(use-package nov - :ensure t - :straight t) - -;; docker -(use-package docker - :ensure t - :straight t - :bind ("C-c d" . docker)) - -(use-package alert - :ensure t - :straight t - :commands (alert) - :init - (setq alert-default-style 'notifier)) - -(use-package vterm - :ensure t - :straight t) - -(use-package nix-mode - :ensure t - :straight t - :mode "\\.nix\\'") - - -;; RSS -(use-package elfeed - :ensure t - :straight t - :custom - (elfeed-feeds - '(("https://hnrss.org/frontpage" hn) - ("https://lwn.net/headlines/rss" lwn)))) - -(provide 'init) -;;; init.el ends here diff --git a/modules/home-manager/emacs/init.el b/modules/home-manager/emacs/init.el new file mode 100644 index 0000000..04c5754 --- /dev/null +++ b/modules/home-manager/emacs/init.el @@ -0,0 +1,473 @@ +;; performance enhancements +(setq gc-cons-threshold #x40000000) + +(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) + (tab-width 4) + (treesit-font-lock-level 4) + (truncate-lines t) + (use-dialog-box nil) + (use-short-answers t) + + ;; 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) + + :config + (set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :height 120) + + :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)) + +;; THEMES AND MODELINE ---------- +(use-package modus-themes + :ensure t + :config + (load-theme 'modus-vivendi 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)) + +;; EVIL MODE ---------- +(use-package evil + :ensure t + :defer t + :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"))) + +(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)) + +(use-package orderless + :ensure t + :config + (setq completion-styles '(orderless basic)) + (setq completion-category-overrides '((file (styles partial-completion)))) + (setq completion-category-defaults nil) + (setq completion-pcm-leading-wildcard t)) + +(use-package marginalia + :ensure t + :config + (marginalia-mode)) + +(use-package consult + :ensure t) + +(use-package embark + :ensure t) + +(use-package embark-consult + :ensure t + :hook + (embark-collect-mode . consult-preview-at-point-mode)) + +(use-package corfu + :ensure t + :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-auto t) + (setq corfu-auto-prefix 2) + (setq corfu-popupinfo-delay 0.5) + (global-corfu-mode) + (corfu-history-mode) + (corfu-popupinfo-mode)) + +(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 tempel + :ensure t + :custom + (defun tempel-setup-capf () + (setq-local completion-at-point-functions + (cons #'tempel-expand + completion-at-point-functions))) + (add-hook 'conf-mode-hook 'tempel-setup-capf) + (add-hook 'prog-mode-hook 'tempel-setup-capf) + (add-hook 'text-mode-hook 'tempel-setup-capf)) + +(use-package tempel-collection + :ensure t) + +(use-package eldoc + :ensure nil + :init + (global-eldoc-mode)) + +;; LINTING ------------ +(use-package flycheck + :ensure t + :config + (global-flycheck-mode)) + +(use-package consult-flycheck + :ensure t) + +(use-package flycheck-eglot + :ensure t + :after (flycheck eglot) + :config + (global-flycheck-eglot-mode 1)) + +;; 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\\'") + +;; LSP --------- +(use-package eglot + :ensure t + :defer t + :hook ((nix-ts-mode . eglot-ensure) + (go-ts-mode . eglot-ensure) + (typescript-ts-mode . eglot-ensure))) + +(use-package eglot-booster + :ensure t + :after eglot + :config + (eglot-booster-mode)) + +(use-package markdown-mode + :ensure t) + +;; TOOLS --------- +(use-package magit + :ensure t + :defer t) + +(use-package vterm + :ensure t) + +(use-package undo-tree + :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)) + + +;; PATH STUFF -------- +(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)) + +;; ORG ---------- +(use-package org + :ensure nil + :defer t + :custom + (org-tags-column 0) + (org-return-follows-link t) + (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)"))) + (org-capture-templates + `(("i" "Inbox" entry (file+headline "todo.org" "Inbox") + ,(concat "* TODO %?\n" + "%U")) + ("j" "Journal" entry (file denote-journal-path-to-new-or-existing-entry) + "* %U %?\n%i\n%a" + :kill-buffer t + :empty-lines 1) + ("@" "Inbox [email]" entry (file+headline "todo.org" "Inbox") + ,(concat "* TODO Process \"%a\" %?\n" + "%U")))) + (org-refile-use-outline-path 'file) + (org-outline-path-complete-in-steps nil) + (org-refile-targets '((nil :maxlevel . 9) + (org-agenda-files :maxlevel . 9))) + (org-agenda-skip-scheduled-if-done t) + (org-agenda-skip-deadline-if-done t) + (org-agenda-include-deadlines t) + (org-agenda-include-diary t) + (org-agenda-block-separator nil) + (org-agenda-compact-blocks t) + (org-agenda-start-with-log-mode t) + :config + (setq org-directory "~/org") + (setq org-agenda-files (list "todo.org")) + :hook + (org-mode . org-indent-mode) + :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 + :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 + :config + (which-key-mode)) + +(use-package general + :ensure t + :config + (general-evil-setup t) + + (general-define-key + :states 'normal + "] d" '(next-error :wk "Goto next error") + "[ d" '(previous-error :wk "Goto prev error") + "] c" '(diff-hl-next-hunk :wk "Goto next hunk") + "[ c" '(diff-hl-previous-hunk :wk "Goto prev hunk") + "K" '(eldoc :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 l" '(consult-line :wk "Find line") + "f i" '(consult-imenu :wk "Imenu buffer locations")) + + (my-leader-def + "c" '(:ignore t :wk "Code") + "c a" '(eglot-code-actions :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 + "u" '(undo-tree-visualize :wk "Undo-tree"))) + +(use-package diff-hl + :ensure t + :config + (global-diff-hl-mode)) + +(provide 'init) +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(custom-safe-themes + '("77f281064ea1c8b14938866e21c4e51e4168e05db98863bd7430f1352cab294a" + default))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) diff --git a/modules/home-manager/kitty.nix b/modules/home-manager/kitty.nix index d04daee..37f620e 100644 --- a/modules/home-manager/kitty.nix +++ b/modules/home-manager/kitty.nix @@ -22,90 +22,7 @@ # "--single-instance" # ]; settings = { - # background_opacity = "0.9"; - # background_blur = 5; hide_window_decorations = "titlebar-only"; }; - # extraConfig = '' - # # vim:ft=kitty - # - # ## name: Gruber-dark - # ## author: ring0-rootkit - # ## license: MIT - # ## upstream: https://github.com/ring0-rootkit/gruber-darker-kitty/blob/main/gruber.conf - # - # - # - # # The basic colors - # foreground #e4e4e4 - # background #181818 - # selection_foreground #181818 - # selection_background #F5F5F5 - # - # # Cursor colors - # cursor #FFDD33 - # cursor_text_color #000000 - # - # # URL underline color when hovering with mouse - # url_color #FF4F58 - # - # # Kitty window border colors - # active_border_color #96A6C8 - # inactive_border_color #565F73 - # bell_border_color #C73C3F - # - # # OS Window titlebar colors - # wayland_titlebar_color #181818 - # macos_titlebar_color #181818 - # - # # Tab bar colors - # active_tab_foreground #101010 - # active_tab_background #F43841 - # inactive_tab_foreground #E4E4E4 - # inactive_tab_background #282828 - # tab_bar_background #101010 - # - # # Colors for marks (marked text in the terminal) - # mark1_foreground #181818 - # mark1_background #96A6C8 - # mark2_foreground #181818 - # mark2_background #F43841 - # mark3_foreground #181818 - # mark3_background #73D936 - # - # # The 16 terminal colors - # - # # black - # color0 #101010 - # color8 #453D41 - # - # # red - # color1 #F43841 - # color9 #F43841 - # - # # green - # color2 #73D936 - # color10 #73D936 - # - # # yellow - # color3 #FFDD33 - # color11 #FFDD33 - # - # # blue - # color4 #96A6C8 - # color12 #96A6C8 - # - # # magenta - # color5 #9E95C7 - # color13 #9E95C7 - # - # # cyan - # color6 #95A99F - # color14 #95A99F - # - # # white - # color7 #E4E4E4 - # color15 #FFFFFF - # ''; }; } diff --git a/modules/nixos/emacs/default.nix b/modules/nixos/emacs/default.nix index 12337c7..212a97a 100644 --- a/modules/nixos/emacs/default.nix +++ b/modules/nixos/emacs/default.nix @@ -22,7 +22,7 @@ (pkgs.emacsWithPackagesFromUsePackage { config = ./init.el; - defaultInitFile = true; + defaultInitFile = false; extraEmacsPackages = epkgs: [ epkgs.mu4e