diff --git a/flake.lock b/flake.lock index f28c382c..20ef6ee7 100644 --- a/flake.lock +++ b/flake.lock @@ -115,6 +115,27 @@ "type": "github" } }, + "emacs-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1732759838, + "narHash": "sha256-bBghlNpHztnrUb1o7BAinp+rrWZMpaVNPrxnefhk1LY=", + "owner": "nix-community", + "repo": "emacs-overlay", + "rev": "f704f6f113bef121c7e38f807e3397f7dbe1aee0", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "emacs-overlay", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -683,6 +704,22 @@ } }, "nixpkgs-stable": { + "locked": { + "lastModified": 1732632634, + "narHash": "sha256-+G7n/ZD635aN0sEXQLynU7pWMd3PKDM7yBIXvYmjABQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6f6076c37180ea3a916f84928cf3a714c5207a30", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable_2": { "locked": { "lastModified": 1730741070, "narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=", @@ -698,7 +735,7 @@ "type": "github" } }, - "nixpkgs-stable_2": { + "nixpkgs-stable_3": { "locked": { "lastModified": 1731797254, "narHash": "sha256-df3dJApLPhd11AlueuoN0Q4fHo/hagP75LlM5K1sz9g=", @@ -807,7 +844,7 @@ "hyprland", "nixpkgs" ], - "nixpkgs-stable": "nixpkgs-stable" + "nixpkgs-stable": "nixpkgs-stable_2" }, "locked": { "lastModified": 1731363552, @@ -826,6 +863,7 @@ "root": { "inputs": { "blocklist-hosts": "blocklist-hosts", + "emacs-overlay": "emacs-overlay", "home-manager-stable": "home-manager-stable", "home-manager-unstable": "home-manager-unstable", "hyprgrass": "hyprgrass", @@ -834,7 +872,7 @@ "hyprlock": "hyprlock", "nix-on-droid": "nix-on-droid", "nixpkgs": "nixpkgs", - "nixpkgs-stable": "nixpkgs-stable_2", + "nixpkgs-stable": "nixpkgs-stable_3", "nvchad": "nvchad", "rust-overlay": "rust-overlay", "stylix": "stylix" diff --git a/flake.nix b/flake.nix index f69a80f7..041911ce 100644 --- a/flake.nix +++ b/flake.nix @@ -72,7 +72,9 @@ allowUnfree = true; allowUnfreePredicate = (_: true); }; - overlays = [ inputs.rust-overlay.overlays.default ]; + overlays = [ inputs.rust-overlay.overlays.default + inputs.emacs-overlay.overlays.default + ]; })); pkgs-stable = import inputs.nixpkgs-stable { @@ -232,6 +234,11 @@ stylix.url = "github:danth/stylix"; + emacs-overlay = { + url = "github:nix-community/emacs-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + rust-overlay.url = "github:oxalica/rust-overlay"; blocklist-hosts = { diff --git a/profiles/work/home.nix b/profiles/work/home.nix index 644477cb..e36af41b 100644 --- a/profiles/work/home.nix +++ b/profiles/work/home.nix @@ -13,6 +13,7 @@ ../../user/shell/sh.nix # My zsh and bash config ../../user/shell/cli-collection.nix # Useful CLI apps ../../user/app/nvim/nvim.nix # My doom emacs config + ../../user/app/emacs # Emacs config that I'm currently rebuilding ../../user/app/ranger/ranger.nix # My ranger file manager config ../../user/app/git/git.nix # My git config ../../user/app/keepass/keepass.nix # My password manager diff --git a/user/app/emacs/default.nix b/user/app/emacs/default.nix new file mode 100644 index 00000000..c510c01a --- /dev/null +++ b/user/app/emacs/default.nix @@ -0,0 +1,26 @@ +{ config, pkgs, ... }: +{ + home.packages = [ + (pkgs.emacsWithPackagesFromUsePackage { + config = ./init.el; + package = pkgs.emacs-pgtk; + alwaysEnsure = true; + extraEmacsPackages = epkgs: with epkgs; [ + command-log-mode + vertico hotfuzz + evil evil-collection evil-snipe evil-owl evil-vimish-fold + doom-modeline + nerd-icons nerd-icons-dired nerd-icons-corfu + nerd-icons-ibuffer nerd-icons-completion + yasnippet + projectile treemacs + magit magit-file-icons + vterm + gdscript-mode + nix-mode + python python-mode + ]; + }) + ]; + home.file.".config/emacs/init.el".source = ./init.el; +} diff --git a/user/app/emacs/init.el b/user/app/emacs/init.el new file mode 100644 index 00000000..29143f28 --- /dev/null +++ b/user/app/emacs/init.el @@ -0,0 +1,100 @@ +(set-face-attribute 'default nil :height 150) ; Bigger text +(set-face-attribute 'default nil :family "Intel One Mono") ; Font +(setq inhibit-startup-message t) + +(scroll-bar-mode -1) ; Disable visible scrollbar +(tool-bar-mode -1) ; Disable the toolbar +(tooltip-mode -1) ; Disable tooltips +(set-fringe-mode 10) ; Give some breathing room + +(menu-bar-mode -1) ; Disable the menu bar + +(load-theme 'wombat) + +(set-frame-parameter nil 'alpha-background 85) +(add-to-list 'default-frame-alist '(alpha-background . 85)) + +;; Make ESC quit prompts +(global-set-key (kbd "") 'keyboard-escape-quit) + +(setq scroll-preserve-screen-position t) +(setq scroll-conservatively 101) + +(require 'use-package) +(setq use-package-always-ensure t) + +(use-package command-log-mode) + +;; Enable vertico +(use-package vertico + :custom + (vertico-scroll-margin 0) ;; Different scroll margin + (vertico-count 20) ;; Show more candidates + (vertico-resize nil) ;; Grow and shrink the Vertico minibuffer + (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' + :init + (vertico-mode)) + +(use-package hotfuzz + :config + (setq completion-styles '(flex hotfuzz))) + +;; Enable vim +(use-package evil + :config + (evil-set-leader nil (kbd "C-SPC")) + (evil-set-leader 'normal (kbd "SPC")) + (evil-set-leader 'motion (kbd "SPC")) + (evil-mode 1)) + +(use-package evil-collection + :init + (setq evil-want-keybinding nil) + (evil-collection-init)) + +(evil-define-key 'normal 'global (kbd ".") 'find-file) +(evil-define-key 'normal 'global (kbd "bi") 'ibuffer) +(evil-define-key 'normal 'global (kbd "bn") 'next-buffer) +(evil-define-key 'normal 'global (kbd "bp") 'previous-buffer) +(evil-define-key 'normal 'global (kbd "pp") 'projectile-switch-project) +(evil-define-key 'normal 'global (kbd "pf") 'projectile-find-file) +(evil-define-key 'normal 'global (kbd "pa") 'projectile-add-known-project) +(evil-define-key 'normal 'global (kbd "gg") 'magit-status) +(evil-define-key 'normal 'global (kbd "hv") 'describe-variable) +(evil-define-key 'normal 'global (kbd "hf") 'describe-function) +(evil-define-key 'normal 'global (kbd "hk") 'describe-key) +(evil-define-key 'normal 'global (kbd "hF") 'describe-face) +(evil-define-key 'normal 'global (kbd "ws") 'evil-window-split) +(evil-define-key 'normal 'global (kbd "wv") 'evil-window-vsplit) +(evil-define-key 'normal 'global (kbd "wd") 'evil-window-delete) +(evil-define-key 'normal 'global (kbd "wj") 'evil-window-down) +(evil-define-key 'normal 'global (kbd "wk") 'evil-window-up) +(evil-define-key 'normal 'global (kbd "wh") 'evil-window-left) +(evil-define-key 'normal 'global (kbd "wl") 'evil-window-right) + +(global-set-key (kbd "C-j") 'evil-window-down) +(global-set-key (kbd "C-k") 'evil-window-up) +(global-set-key (kbd "C-h") 'evil-window-left) +(global-set-key (kbd "C-l") 'evil-window-right) + +(setq magit-bury-buffer-function 'magit-restore-window-configuration) +(setq magit-display-buffer-function + (lambda (buffer) + (display-buffer + buffer (if (and (derived-mode-p 'magit-mode) + (memq (with-current-buffer buffer major-mode) + '(magit-process-mode + magit-revision-mode + magit-diff-mode + magit-stash-mode + magit-status-mode))) + nil + '(display-buffer-same-window))))) + +(use-package nerd-icons + :ensure t) + +(use-package doom-modeline + :ensure t + :init (doom-modeline-mode 1) + :custom ((doom-modeline-height 15)))