diff --git a/flake.lock b/flake.lock index 7f91bcdf..90e7bdd1 100644 --- a/flake.lock +++ b/flake.lock @@ -84,29 +84,13 @@ "type": "github" } }, - "nur": { - "locked": { - "lastModified": 1615967307, - "narHash": "sha256-B4IEO1XOY1ZDrB3leXPdjFgIFboaP5p8zPqR+focmNE=", - "owner": "nix-community", - "repo": "NUR", - "rev": "777e1e28ed519a4b358f9196fc46c08845303763", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "NUR", - "type": "github" - } - }, "root": { "inputs": { "emacs-overlay": "emacs-overlay", "flake-utils": "flake-utils", "home-manager": "home-manager", "nixpkgs": "nixpkgs", - "nixpkgsFor0AD": "nixpkgsFor0AD", - "nur": "nur" + "nixpkgsFor0AD": "nixpkgsFor0AD" } } }, diff --git a/flake.nix b/flake.nix index eaefa71f..3f7c1a9a 100644 --- a/flake.nix +++ b/flake.nix @@ -10,10 +10,9 @@ }; nixpkgs.url = "github:chvp/nixpkgs/master"; nixpkgsFor0AD.url = "github:chvp/nixpkgs/0ad0.24"; - nur.url = "github:nix-community/NUR"; }; - outputs = { self, emacs-overlay, nixpkgs, nixpkgsFor0AD, nur, home-manager, flake-utils }: + outputs = { self, emacs-overlay, nixpkgs, nixpkgsFor0AD, home-manager, flake-utils }: let version-suffix = nixpkgs.rev or (builtins.toString nixpkgs.lastModified); pkgsFor = system: import nixpkgs { @@ -34,8 +33,7 @@ nix.nixPath = [ "nixpkgs=/etc/nixpkgs" ]; }) ({ pkgs, ... }: { - nixpkgs.overlays = [ nur.overlay emacs-overlay.overlay ]; - home-manager.sharedModules = [ pkgs.nur.repos.rycee.hmModules.emacs-init ]; + nixpkgs.overlays = [ emacs-overlay.overlay ]; }) (./. + "/machines/${hostname}") ]; diff --git a/modules/emacs.nix b/modules/emacs.nix index 439528f3..20f6b7ae 100644 --- a/modules/emacs.nix +++ b/modules/emacs.nix @@ -12,129 +12,17 @@ home-manager.users.charlotte = { ... }: { programs.emacs = { enable = true; - package = pkgs.emacsPgtkGcc; - init = { - enable = true; - prelude = '' - (when window-system - (set-frame-font "Fira Code 9")) - (electric-pair-mode) - (global-display-line-numbers-mode) - - (defun emoji-fonts () - (set-fontset-font t 'symbol "Noto Color Emoji") - (set-fontset-font t 'symbol "Symbola" nil 'append)) - (if (daemonp) - (add-hook 'server-after-make-frame-hook #'emoji-fonts) - (emoji-fonts)) - - ;; Disable default evil keybindings, since evil-collection is a superset - ;; See https://github.com/emacs-evil/evil-collection/issues/60 - (setq evil-want-keybinding nil) - ''; - recommendedGcSettings = true; - usePackageVerbose = true; - usePackage = { - better-defaults.enable = true; - company = { - enable = true; - diminish = [ "company-mode" ]; - config = "(global-company-mode)"; - }; - evil = { - enable = true; - config = '' - (evil-mode 1) - ''; - }; - evil-collection = { - enable = true; - after = [ "evil" ]; - }; - fira-code-mode = { - enable = true; - config = "(when window-system (global-fira-code-mode))"; - }; - flycheck = { - enable = true; - diminish = [ "flycheck-mode" ]; - config = "(global-flycheck-mode)"; - }; - general = { - enable = true; - after = [ "evil" "which-key" ]; - config = '' - (general-evil-setup) - ''; - }; - ledger-mode = { - enable = true; - mode = [ ''"\\.journal\\'"'' ]; - config = '' - (setq ledger-binary-path "hledger" - ledger-highlight-xact-under-point nil - ledger-post-account-alignment-column 4 - ledger-post-amount-alignment-at :decimal - ledger-post-amount-alignment-column 59 - ledger-post-auto-align t) - ''; - }; - lsp-mode = { - enable = true; - command = [ "lsp" ]; - }; - magit = { - enable = true; - }; - markdown-mode = { - enable = true; - command = [ "markdown-mode" "gfm-mode" ]; - mode = [ - ''("README\\.md\\'" . gfm-mode)'' - ''("\\.md\\'" . markdown-mode)'' - ''("\\.markdown\\'" . markdown-mode)'' - ]; - }; - modus-themes = { - enable = true; - config = '' - (setq modus-themes-bold-constructs t - modus-themes-syntax 'alt-syntax-yellow-comments - modus-themes-promts 'intense-accented - modus-themes-mode-line 'borderless - modus-themes-region 'bg-only) - (modus-themes-load-themes) - (modus-themes-load-operandi) - ''; - }; - nix.enable = true; - nix-mode = { - enable = true; - mode = [ ''"\\.nix\\'"'' ]; - }; - python-mode = { - enable = true; - mode = [ ''"\\.py\\'"'' ]; - }; - ruby-mode = { - enable = true; - mode = [ - ''("\\.\\(?:cap\\|gemspec\\|irbrc\\|gemrc\\|rake\\|rb\\|ru\\|thor\\)\\'" . ruby-mode)'' - ''("\\(?:Brewfile\\|Capfile\\|Gemfile\\(?:\\.[a-zA-Z0-9._-]+\\)?\\|[rR]akefile\\)\\'" . ruby-mode)'' - ]; - }; - web-mode = { - enable = true; - mode = [ ''"\\.html\\.erb\\'"'' ]; - }; - which-key = { - enable = true; - diminish = [ "which-key-mode" ]; - config = "(which-key-mode)"; - }; - }; + package = pkgs.emacsWithPackagesFromUsePackage { + config = ./emacs/init.el; + package = pkgs.emacsPgtkGcc; + alwaysEnsure = true; + extraEmacsPackages = epkgs: [ epkgs.diminish ]; }; }; + home.file = { + ".emacs.d/early-init.el".source = ./emacs/early-init.el; + ".emacs.d/init.el".source = ./emacs/init.el; + }; }; }; } diff --git a/modules/emacs/early-init.el b/modules/emacs/early-init.el new file mode 100644 index 00000000..60ed3d3c --- /dev/null +++ b/modules/emacs/early-init.el @@ -0,0 +1,42 @@ +;;; early-init --- My emacs early init file +;;; Commentary: +;;; Code: +(defun hm/reduce-gc () + "Reduce the frequency of garbage collection." + (setq gc-cons-threshold most-positive-fixnum + gc-cons-percentage 0.6)) + +(defun hm/restore-gc () + "Restore the frequency of garbage collection." + (setq gc-cons-threshold 16777216 + gc-cons-percentage 0.1)) + +;; Make GC more rare during init, while minibuffer is active, and +;; when shutting down. In the latter two cases we try doing the +;; reduction early in the hook. +(hm/reduce-gc) +(add-hook 'minibuffer-setup-hook #'hm/reduce-gc -50) +(add-hook 'kill-emacs-hook #'hm/reduce-gc -50) + +;; But make it more regular after startup and after closing minibuffer. +(add-hook 'emacs-startup-hook #'hm/restore-gc) +(add-hook 'minibuffer-exit-hook #'hm/restore-gc) + +;; Avoid unnecessary regexp matching while loading .el files. +(defvar hm/file-name-handler-alist file-name-handler-alist) +(setq file-name-handler-alist nil) + +(defun hm/restore-file-name-handler-alist () + "Restore the 'file-name-handler-alist' variable." + (setq file-name-handler-alist hm/file-name-handler-alist) + (makunbound 'hm/file-name-handler-alist)) + +(add-hook 'emacs-startup-hook #'hm/restore-file-name-handler-alist) + +(setq package-enable-at-startup nil) + +;; Avoid expensive frame resizing. Inspired by Doom Emacs. +(setq frame-inhibit-implied-resize t) + +(provide 'early-init) +;;; early-init.el ends here diff --git a/modules/emacs/init.el b/modules/emacs/init.el new file mode 100644 index 00000000..2a62fe3d --- /dev/null +++ b/modules/emacs/init.el @@ -0,0 +1,133 @@ +;;; init --- My emacs init file +;;; Commentary: +;;; Code: +(eval-when-compile + (require 'use-package) + (require 'use-package-ensure) + (setq use-package-verbose t) + (setq use-package-always-ensure t)) + +;; For :diminish in (use-package). +(require 'diminish) + +(use-package better-defaults) + +(use-package company + :diminish (company-mode) + :config (global-company-mode) + ) + +(use-package evil + ;; Disable default evil keybindings, since evil-collection is a superset + ;; See https://github.com/emacs-evil/evil-collection/issues/60 + :custom (evil-want-keybinding nil) + :config (evil-mode 1) + ) + +(use-package evil-collection + :after (evil) + ) + +(use-package fira-code-mode + :config (when window-system (global-fira-code-mode)) + ) + +(use-package flycheck + :diminish (flycheck-mode) + :config (global-flycheck-mode) + ) + +(use-package general + :after (evil which-key) + :config + (general-evil-setup) + + (general-mmap + :prefix "SPC" + "" nil ;; space is next character by default + "b" '(:ignore t :which-key "buffer") + "bd" '(kill-this-buffer :which-key "kill") + + "f" '(:ignore t :which-key "file") + "ff" '(find-file :which-key "find") + "fs" '(save-buffer :which-key "save") + + "m" '(:ignore t :which-key "mode") + + "w" '(:ignore t :which-key "window") + "wv" '(split-window-vertically :which-key "split vertical") + "ws" '(split-window-horizontally :which-key "split horizontal") + "wd" '(delete-window :which-key "delete") + + "q" '(:ignore t :which-key "quit") + "qq" '(save-buffers-kill-emacs :which-key "quit")) + ) + +(use-package ledger-mode + :mode "\\.journal\\'" + :custom + (ledger-binary-path "hledger") + (ledger-highlight-xact-under-point nil) + (ledger-post-account-alignment-column 4) + (ledger-post-amount-alignment-at :decimal) + (ledger-post-amount-alignment-column 59) + (ledger-post-auto-align t) + ) + +(use-package lsp-mode + :commands (lsp) + ) + +(use-package magit) + +(use-package markdown-mode + :commands (markdown-mode gfm-mode) + :mode ("README\\.md\\'" . gfm-mode) + :mode ("\\.md\\'" . markdown-mode) + :mode ("\\.markdown\\'" . markdown-mode) + ) + +(use-package modus-themes + :config + (setq modus-themes-bold-constructs t + modus-themes-syntax 'alt-syntax-yellow-comments + modus-themes-promts 'intense-accented + modus-themes-mode-line 'borderless + modus-themes-region 'bg-only) + (modus-themes-load-themes) + (modus-themes-load-operandi) + ) + +(use-package nix-mode + :mode "\\.nix\\'" + ) + +(use-package python-mode + :mode "\\.py\\'" + ) + +(use-package web-mode + :mode "\\.html\\.erb\\'") + +(use-package which-key + :diminish (which-key-mode) + :config (which-key-mode) + ) + +(setq inhibit-startup-screen t) + +(when window-system + (set-frame-font "Fira Code 9")) +(electric-pair-mode) +(global-display-line-numbers-mode) + +(defun emoji-fonts () + "Setup emoji font priorities." + (set-fontset-font t 'symbol "Noto Color Emoji") + (set-fontset-font t 'symbol "Symbola" nil 'append)) +(if (daemonp) + (add-hook 'server-after-make-frame-hook #'emoji-fonts) + (emoji-fonts)) + +(provide 'init) +;;; init.el ends here