{ config, pkgs, fonts, ... }: { imports = [ ../shell/default.nix ./python/default.nix ./lua/default.nix ./javascript/default.nix ]; services.emacs = { enable = true; package = config.programs.emacs.finalPackage; defaultEditor = true; client.enable = true; socketActivation.enable = true; startWithUserSession = false; }; programs.emacs = { # Clone emacs config from https://git.xenia.me.uk/pixelifytica/emacs.git # git clone https://git.xenia.me.uk/pixelifytica/emacs.git ~/.emacs.d enable = true; package = pkgs.emacs29-pgtk; extraConfig = let fixed-font-family = "${fonts.monospace.name}"; variable-font-family = "${fonts.sansSerif.name}"; font-height = builtins.toString (builtins.floor (builtins.mul fonts.sizes.applications 10)); custom-theme-name = "nix"; custom-theme = pkgs.writeTextFile { name = "custom-emacs-theme"; destination = "/${custom-theme-name}-theme.el"; text = '' (deftheme ${custom-theme-name} "Use Nix customised fonts for main faces") (custom-theme-set-variables '${custom-theme-name} '(menu-bar-mode nil)) (custom-theme-set-faces '${custom-theme-name} '(default ((t (:family "${fixed-font-family}" :height ${font-height})))) '(fixed-pitch ((t (:family "${fixed-font-family}")))) '(fixed-pitch-serif ((t (:family "${fixed-font-family}")))) '(variable-pitch ((t (:family "${variable-font-family}"))))) (provide-theme '${custom-theme-name}) ''; }; custom-theme-hash = builtins.hashFile "sha256" "${custom-theme}/${custom-theme-name}-theme.el"; in '' (add-to-list 'custom-theme-load-path "${custom-theme}") (add-to-list 'custom-safe-themes "${custom-theme-hash}") (load-theme '${custom-theme-name}) ''; extraPackages = epkgs: with epkgs; [ # Tree-sitter grammars, not a real Emacs package treesit-grammars.with-all-grammars # Theme base16-theme # UI all-the-icons nerd-icons nerd-icons-completion nerd-icons-corfu nerd-icons-dired nerd-icons-ibuffer minions ligature page-break-lines helpful which-key ace-window link-hint diff-hl # Completion cape consult consult-eglot consult-flyspell corfu corfu-terminal embark embark-consult marginalia orderless vertico # Templates tempel license-templates gitignore-templates # spell-checking flyspell-correct # password-store pass password-store # IDE treesit-auto flymake-popon flymake-shellcheck flymake-yamllint flymake-eslint apheleia envrc rainbow-delimiters aggressive-indent python-docstring nix-mode lua-mode # Media emms # org-mode org-roam org-noter # org-cite citar citar-embark # org-mode HTML export htmlize # Projects magit forge treemacs treemacs-nerd-icons # Writing markdown-mode pandoc-mode auctex auctex-latexmk latex-preview-pane # Contacts mu4e bbdb ement # RSS feeds elfeed elfeed-org elfeed-tube ]; }; home.packages = with pkgs; [ # Emacs requirements imagemagick languagetool wordnet graphviz # For org-roam graph mp3info # For EMMS # Language-specific requirements sqlite pandoc ghostscript poppler_utils # Customised LaTeX install (texlive.combine {inherit (pkgs.texlive) scheme-medium dvisvgm dvipng wrapfig amsmath ulem hyperref capt-of;}) python3Packages.pygments # Development tools ## Code screenshots silicon ## Linters shellcheck yamllint nodePackages.eslint ## Formatters alejandra shfmt ruff black isort stylua nodePackages.prettier ## Language servers nil # Nix lsp lua-language-server nodePackages.pyright nodePackages.typescript-language-server ]; }