From 052c95b4c78cd8448dd95f690cd11aa928c0ecfb Mon Sep 17 00:00:00 2001 From: Michael Thomson Date: Wed, 24 Sep 2025 07:39:22 -0400 Subject: [PATCH] emacs --- flake.lock | 302 +++++-------- modules/nixos/emacs/default.nix | 42 ++ modules/nixos/emacs/init.el | 739 ++++++++++++++++++++++++++++++++ 3 files changed, 877 insertions(+), 206 deletions(-) create mode 100644 modules/nixos/emacs/default.nix create mode 100644 modules/nixos/emacs/init.el diff --git a/flake.lock b/flake.lock index 24429a3..0a8cc2e 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ ] }, "locked": { - "lastModified": 1750372185, - "narHash": "sha256-lVBKxd9dsZOH1fA6kSE5WNnt8e+09fN+NL/Q3BjTWHY=", + "lastModified": 1755946532, + "narHash": "sha256-POePremlUY5GyA1zfbtic6XLxDaQcqHN6l+bIxdT5gc=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "7cef49d261cbbe537e8cb662485e76d29ac4cbca", + "rev": "81584dae2df6ac79f6b6dae0ecb7705e95129ada", "type": "github" }, "original": { @@ -38,11 +38,11 @@ "fromYaml": "fromYaml" }, "locked": { - "lastModified": 1746562888, - "narHash": "sha256-YgNJQyB5dQiwavdDFBMNKk1wyS77AtdgDk/VtU6wEaI=", + "lastModified": 1755819240, + "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=", "owner": "SenchoPens", "repo": "base16.nix", - "rev": "806a1777a5db2a1ef9d5d6f493ef2381047f2b89", + "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6", "type": "github" }, "original": { @@ -70,11 +70,11 @@ "base16-helix": { "flake": false, "locked": { - "lastModified": 1748408240, - "narHash": "sha256-9M2b1rMyMzJK0eusea0x3lyh3mu5nMeEDSc4RZkGm+g=", + "lastModified": 1752979451, + "narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=", "owner": "tinted-theming", "repo": "base16-helix", - "rev": "6c711ab1a9db6f51e2f6887cc3345530b33e152e", + "rev": "27cf1e66e50abc622fb76a3019012dc07c678fac", "type": "github" }, "original": { @@ -103,11 +103,11 @@ "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1748383148, - "narHash": "sha256-pGvD/RGuuPf/4oogsfeRaeMm6ipUIznI2QSILKjKzeA=", + "lastModified": 1756083905, + "narHash": "sha256-UqYGTBgI5ypGh0Kf6zZjom/vABg7HQocB4gmxzl12uo=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "4eb2714fbed2b80e234312611a947d6cb7d70caf", + "rev": "b655eaf16d4cbec9c3472f62eee285d4b419a808", "type": "github" }, "original": { @@ -119,11 +119,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -148,21 +148,6 @@ "type": "github" } }, - "flake-compat_3": { - "locked": { - "lastModified": 1747046372, - "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -171,11 +156,11 @@ ] }, "locked": { - "lastModified": 1743550720, - "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", + "lastModified": 1756770412, + "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "rev": "4524271976b625a4a605beefd893f270620fd751", "type": "github" }, "original": { @@ -200,32 +185,6 @@ "type": "github" } }, - "git-hooks": { - "inputs": { - "flake-compat": [ - "stylix", - "flake-compat" - ], - "gitignore": "gitignore_2", - "nixpkgs": [ - "stylix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1747372754, - "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, "gitignore": { "inputs": { "nixpkgs": [ @@ -248,41 +207,19 @@ "type": "github" } }, - "gitignore_2": { - "inputs": { - "nixpkgs": [ - "stylix", - "git-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "gnome-shell": { "flake": false, "locked": { - "lastModified": 1744584021, - "narHash": "sha256-0RJ4mJzf+klKF4Fuoc8VN8dpQQtZnKksFmR2jhWE1Ew=", + "lastModified": 1748186689, + "narHash": "sha256-UaD7Y9f8iuLBMGHXeJlRu6U1Ggw5B9JnkFs3enZlap0=", "owner": "GNOME", "repo": "gnome-shell", - "rev": "52c517c8f6c199a1d6f5118fae500ef69ea845ae", + "rev": "8c88f917db0f1f0d80fa55206c863d3746fa18d0", "type": "github" }, "original": { "owner": "GNOME", - "ref": "48.1", + "ref": "48.2", "repo": "gnome-shell", "type": "github" } @@ -294,32 +231,11 @@ ] }, "locked": { - "lastModified": 1750798083, - "narHash": "sha256-DTCCcp6WCFaYXWKFRA6fiI2zlvOLCf5Vwx8+/0R8Wc4=", + "lastModified": 1758648381, + "narHash": "sha256-/rp5KlIAH3OxRxS3jbyEAz5gK9l2vvHNEK+TVOjvYJ0=", "owner": "nix-community", "repo": "home-manager", - "rev": "ff31a4677c1a8ae506aa7e003a3dba08cb203f82", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "home-manager_2": { - "inputs": { - "nixpkgs": [ - "stylix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1748737919, - "narHash": "sha256-5kvBbLYdp+n7Ftanjcs6Nv+UO6sBhelp6MIGJ9nWmjQ=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "5675a9686851d9626560052a032c4e14e533c1fa", + "rev": "5468c92a2350ca76e15ee6617a083c0e6ce7ade7", "type": "github" }, "original": { @@ -344,11 +260,11 @@ ] }, "locked": { - "lastModified": 1749155331, - "narHash": "sha256-XR9fsI0zwLiFWfqi/pdS/VD+YNorKb3XIykgTg4l1nA=", + "lastModified": 1753964049, + "narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=", "owner": "hyprwm", "repo": "hyprcursor", - "rev": "45fcc10b4c282746d93ec406a740c43b48b4ef80", + "rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5", "type": "github" }, "original": { @@ -373,11 +289,11 @@ ] }, "locked": { - "lastModified": 1750371717, - "narHash": "sha256-cNP+bVq8m5x2Rl6MTjwfQLCdwbVmKvTH7yqVc1SpiJM=", + "lastModified": 1758192433, + "narHash": "sha256-CR6RnqEJSTiFgA6KQY4TTLUWbZ8RBnb+hxQqesuQNzQ=", "owner": "hyprwm", "repo": "hyprgraphics", - "rev": "15c6f8f3a567fec9a0f732cd310a7ff456deef88", + "rev": "c44e749dd611521dee940d00f7c444ee0ae4cfb7", "type": "github" }, "original": { @@ -402,11 +318,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1750848152, - "narHash": "sha256-m7DxFbU9YgPxFlQ6iH6zDreXT3IfUVxZZAdkdvN9yz8=", + "lastModified": 1758649857, + "narHash": "sha256-w0TD4u1PmIHtUCH98uHpVGKm9ITZnuShM2ei+/yIVDQ=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "f4f090e4b2f9f0bba5408cbd135d2fff1990be1d", + "rev": "31bd9ec41705a606bb074facca114ea79b62a63a", "type": "github" }, "original": { @@ -432,11 +348,11 @@ ] }, "locked": { - "lastModified": 1750799801, - "narHash": "sha256-Oqn6gHIVfgkzzuigwNk9UZbgKdyzAzU/JoywB6z1O+M=", + "lastModified": 1758650429, + "narHash": "sha256-tQLvuUu/8p9yEerYz+mcsSW7VNd7Z4vuSd4LGF8Y38w=", "owner": "hyprwm", "repo": "hyprland-plugins", - "rev": "c1fdf38bfcd716130ce022cf21a1fca7582482d1", + "rev": "1e3fa62428728bdc2d040f65afe98de1ae01c6b5", "type": "github" }, "original": { @@ -525,11 +441,11 @@ ] }, "locked": { - "lastModified": 1750371812, - "narHash": "sha256-D868K1dVEACw17elVxRgXC6hOxY+54wIEjURztDWLk8=", + "lastModified": 1757694755, + "narHash": "sha256-j+w5QUUr2QT/jkxgVKecGYV8J7fpzXCMgzEEr6LG9ug=", "owner": "hyprwm", "repo": "hyprland-qtutils", - "rev": "b13c7481e37856f322177010bdf75fccacd1adc8", + "rev": "5ffdfc13ed03df1dae5084468d935f0a3f2c9a4c", "type": "github" }, "original": { @@ -554,11 +470,11 @@ ] }, "locked": { - "lastModified": 1750371198, - "narHash": "sha256-/iuJ1paQOBoSLqHflRNNGyroqfF/yvPNurxzcCT0cAE=", + "lastModified": 1756810301, + "narHash": "sha256-wgZ3VW4VVtjK5dr0EiK9zKdJ/SOqGIBXVG85C3LVxQA=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "cee01452bca58d6cadb3224e21e370de8bc20f0b", + "rev": "3d63fb4a42c819f198deabd18c0c2c1ded1de931", "type": "github" }, "original": { @@ -579,11 +495,11 @@ ] }, "locked": { - "lastModified": 1750371096, - "narHash": "sha256-JB1IeJ41y7kWc/dPGV6RMcCUM0Xj2NEK26A2Ap7EM9c=", + "lastModified": 1756117388, + "narHash": "sha256-oRDel6pNl/T2tI+nc/USU9ZP9w08dxtl7hiZxa0C/Wc=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "38f3a211657ce82a1123bf19402199b67a410f08", + "rev": "b2ae3204845f5f2f79b4703b441252d8ad2ecfd0", "type": "github" }, "original": { @@ -604,11 +520,11 @@ ] }, "locked": { - "lastModified": 1750371869, - "narHash": "sha256-lGk4gLjgZQ/rndUkzmPYcgbHr8gKU5u71vyrjnwfpB4=", + "lastModified": 1755184602, + "narHash": "sha256-RCBQN8xuADB0LEgaKbfRqwm6CdyopE1xIEhNc67FAbw=", "owner": "hyprwm", "repo": "hyprwayland-scanner", - "rev": "aa38edd6e3e277ae6a97ea83a69261a5c3aab9fd", + "rev": "b3b0f1f40ae09d4447c20608e5a4faf8bf3c492d", "type": "github" }, "original": { @@ -624,11 +540,11 @@ ] }, "locked": { - "lastModified": 1750618568, - "narHash": "sha256-w9EG5FOXrjXGfbqCcQg9x1lMnTwzNDW5BMXp8ddy15E=", + "lastModified": 1758447883, + "narHash": "sha256-yGA6MV0E4JSEXqLTb4ZZkmdJZcoQ8HUzihRRX12Bvpg=", "owner": "LnL7", "repo": "nix-darwin", - "rev": "1dd19f19e4b53a1fd2e8e738a08dd5fe635ec7e5", + "rev": "25381509d5c91bbf3c30e23abc6d8476d2143cd1", "type": "github" }, "original": { @@ -690,11 +606,11 @@ }, "nixCats": { "locked": { - "lastModified": 1750385661, - "narHash": "sha256-JpIEf5IrOzMTjowkxB6kgh4AK3Dp9i/T9G4w2ZiKMgQ=", + "lastModified": 1758545673, + "narHash": "sha256-MMcEImF7vHqImzrdRlSFCbzGq0ebi/5eSYwypNGr+AA=", "owner": "BirdeeHub", "repo": "nixCats-nvim", - "rev": "04379fef2fbd4c9d8f4c9a6203cef135ab0b1acd", + "rev": "91f9a4b4605cc3aed835e180eb58a5bd73236407", "type": "github" }, "original": { @@ -705,11 +621,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1750837715, - "narHash": "sha256-2m1ceZjbmgrJCZ2PuQZaK4in3gcg3o6rZ7WK6dr5vAA=", + "lastModified": 1757943327, + "narHash": "sha256-w6cDExPBqbq7fTLo4dZ1ozDGeq3yV6dSN4n/sAaS6OM=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "98236410ea0fe204d0447149537a924fb71a6d4f", + "rev": "67a709cfe5d0643dafd798b0b613ed579de8be05", "type": "github" }, "original": { @@ -725,11 +641,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1749574455, - "narHash": "sha256-fm2/8KPOYvvIAnNVtjDlTt/My00lIbZQ+LMrfQIWVzs=", + "lastModified": 1758545267, + "narHash": "sha256-/qTq2MHOOy+QB6Znz0k2TmomUzq8FsYN6NGhdpW7BQw=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "917af390377c573932d84b5e31dd9f2c1b5c0f09", + "rev": "a36f84cc858bc139e175c17f64fe699d2dacb755", "type": "github" }, "original": { @@ -741,11 +657,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1750365781, - "narHash": "sha256-XE/lFNhz5lsriMm/yjXkvSZz5DfvKJLUjsS6pP8EC50=", + "lastModified": 1758198701, + "narHash": "sha256-7To75JlpekfUmdkUZewnT6MoBANS0XVypW6kjUOXQwc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "08f22084e6085d19bcfb4be30d1ca76ecb96fe54", + "rev": "0147c2f1d54b30b5dd6d4a8c8542e8d7edf93b5d", "type": "github" }, "original": { @@ -789,27 +705,27 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1749173751, - "narHash": "sha256-ENY3y3v6S9ZmLDDLI3LUT8MXmfXg/fSt2eA4GCnMVCE=", + "lastModified": 1758277210, + "narHash": "sha256-iCGWf/LTy+aY0zFu8q12lK8KuZp7yvdhStehhyX1v8w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ed29f002b6d6e5e7e32590deb065c34a31dc3e91", + "rev": "8eaee110344796db060382e15d3af0a9fc396e0e", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-24.11", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_3": { "locked": { - "lastModified": 1750741721, - "narHash": "sha256-Z0djmTa1YmnGMfE9jEe05oO4zggjDmxOGKwt844bUhE=", + "lastModified": 1758427187, + "narHash": "sha256-pHpxZ/IyCwoTQPtFIAG2QaxuSm8jWzrzBGjwQZIttJc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "4b1164c3215f018c4442463a27689d973cffd750", + "rev": "554be6495561ff07b6c724047bdd7e0716aa7b46", "type": "github" }, "original": { @@ -821,11 +737,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1748460289, - "narHash": "sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg=", + "lastModified": 1756819007, + "narHash": "sha256-12V64nKG/O/guxSYnr5/nq1EfqwJCdD2+cIGmhz3nrE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "96ec055edbe5ee227f28cdbc3f1ddf1df5965102", + "rev": "aaff8c16d7fc04991cac6245bee1baa31f72b1e1", "type": "github" }, "original": { @@ -898,15 +814,14 @@ "nixpkgs": [ "stylix", "nixpkgs" - ], - "treefmt-nix": "treefmt-nix" + ] }, "locked": { - "lastModified": 1748730660, - "narHash": "sha256-5LKmRYKdPuhm8j5GFe3AfrJL8dd8o57BQ34AGjJl1R0=", + "lastModified": 1756961635, + "narHash": "sha256-hETvQcILTg5kChjYNns1fD5ELdsYB/VVgVmBtqKQj9A=", "owner": "nix-community", "repo": "NUR", - "rev": "2c0bc52fe14681e9ef60e3553888c4f086e46ecb", + "rev": "6ca27b2654ac55e3f6e0ca434c1b4589ae22b370", "type": "github" }, "original": { @@ -925,11 +840,11 @@ ] }, "locked": { - "lastModified": 1749636823, - "narHash": "sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4=", + "lastModified": 1758108966, + "narHash": "sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "623c56286de5a3193aa38891a6991b28f9bab056", + "rev": "54df955a695a84cd47d4a43e08e1feaf90b1fd9b", "type": "github" }, "original": { @@ -975,11 +890,8 @@ "base16-helix": "base16-helix", "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", - "flake-compat": "flake-compat_3", "flake-parts": "flake-parts", - "git-hooks": "git-hooks", "gnome-shell": "gnome-shell", - "home-manager": "home-manager_2", "nixpkgs": "nixpkgs_4", "nur": "nur", "systems": "systems_2", @@ -990,11 +902,11 @@ "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1750862951, - "narHash": "sha256-oUhnj0mzeSAX3IFaWn6LKLbmuFeNd7ulIAkxf0Jc07A=", + "lastModified": 1758612110, + "narHash": "sha256-iwADWo5aARai4TKBylPwBkg73gUTPjfrsLGr9Vrfa8g=", "owner": "danth", "repo": "stylix", - "rev": "37b8c5f68086f36a109074c3fedebbbf8c20ecda", + "rev": "ef025b8de39802b05ed3f42d2045fd7324174f42", "type": "github" }, "original": { @@ -1069,11 +981,11 @@ "tinted-schemes": { "flake": false, "locked": { - "lastModified": 1748180480, - "narHash": "sha256-7n0XiZiEHl2zRhDwZd/g+p38xwEoWtT0/aESwTMXWG4=", + "lastModified": 1754779259, + "narHash": "sha256-8KG2lXGaXLUE0F/JVwLQe7kOVm21IDfNEo0gfga5P4M=", "owner": "tinted-theming", "repo": "schemes", - "rev": "87d652edd26f5c0c99deda5ae13dfb8ece2ffe31", + "rev": "097d751b9e3c8b97ce158e7d141e5a292545b502", "type": "github" }, "original": { @@ -1085,11 +997,11 @@ "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1748740859, - "narHash": "sha256-OEM12bg7F4N5WjZOcV7FHJbqRI6jtCqL6u8FtPrlZz4=", + "lastModified": 1754788770, + "narHash": "sha256-LAu5nBr7pM/jD9jwFc6/kyFY4h7Us4bZz7dvVvehuwo=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "57d5f9683ff9a3b590643beeaf0364da819aedda", + "rev": "fb2175accef8935f6955503ec9dd3c973eec385c", "type": "github" }, "original": { @@ -1101,11 +1013,11 @@ "tinted-zed": { "flake": false, "locked": { - "lastModified": 1725758778, - "narHash": "sha256-8P1b6mJWyYcu36WRlSVbuj575QWIFZALZMTg5ID/sM4=", + "lastModified": 1755613540, + "narHash": "sha256-zBFrrTxHLDMDX/OYxkCwGGbAhPXLi8FrnLhYLsSOKeY=", "owner": "tinted-theming", "repo": "base16-zed", - "rev": "122c9e5c0e6f27211361a04fae92df97940eccf9", + "rev": "937bada16cd3200bdbd3a2f5776fc3b686d5cba0", "type": "github" }, "original": { @@ -1114,28 +1026,6 @@ "type": "github" } }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "stylix", - "nur", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1733222881, - "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "49717b5af6f80172275d47a418c9719a31a78b53", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, "xdph": { "inputs": { "hyprland-protocols": [ @@ -1164,11 +1054,11 @@ ] }, "locked": { - "lastModified": 1750372504, - "narHash": "sha256-VBeZb1oqZM1cqCAZnFz/WyYhO8aF/ImagI7WWg/Z3Og=", + "lastModified": 1755354946, + "narHash": "sha256-zdov5f/GcoLQc9qYIS1dUTqtJMeDqmBmo59PAxze6e4=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "400308fc4f9d12e0a93e483c2e7a649e12af1a92", + "rev": "a10726d6a8d0ef1a0c645378f983b6278c42eaa0", "type": "github" }, "original": { diff --git a/modules/nixos/emacs/default.nix b/modules/nixos/emacs/default.nix new file mode 100644 index 0000000..12337c7 --- /dev/null +++ b/modules/nixos/emacs/default.nix @@ -0,0 +1,42 @@ +{ pkgs, ... }: + +{ + services.emacs = { + enable = true; + package = pkgs.emacs-unstable; + }; + + nixpkgs.overlays = [ + (import (builtins.fetchTarball { + url = "https://github.com/nix-community/emacs-overlay/archive/master.tar.gz"; + sha256 = "10vnpcmqv0n6jk6hq5lkblslim5fvxv6cwjl9wvi1r0r0ig529i1"; + })) + ]; + + environment.systemPackages = [ + pkgs.cmake + pkgs.cmake + pkgs.libtool + pkgs.glibtool + pkgs.graphviz + (pkgs.emacsWithPackagesFromUsePackage { + config = ./init.el; + + defaultInitFile = true; + + extraEmacsPackages = epkgs: [ + epkgs.mu4e + epkgs.pdf-tools + epkgs.vterm + + pkgs.tree-sitter + pkgs.fd + pkgs.ripgrep + pkgs.typescript-language-server + pkgs.typescript + pkgs.vscode-langservers-extracted + pkgs.nodejs + ]; + }) + ]; +} diff --git a/modules/nixos/emacs/init.el b/modules/nixos/emacs/init.el new file mode 100644 index 0000000..809e546 --- /dev/null +++ b/modules/nixos/emacs/init.el @@ -0,0 +1,739 @@ +;; 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 + :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 + :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 + :hook (org-mode . toc-org-mode)) + +(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) + ))) + +(use-package which-key + :ensure nil + :defer t + :hook + (after-init . which-key-mode)) + +(use-package nerd-icons + :ensure t + :defer t) + +(use-package nerd-icons-dired + :ensure 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 + :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 + :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)) + +(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 + undo-strong-limit 12000000 + undo-outer-limit 120000000) + :config + (setq undo-tree-history-directory-alist '(("." . "~/.config/emacs/.cache/undo")))) + +(use-package general + :ensure 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 + :hook + (after-init . vertico-mode)) + +(use-package orderless + :ensure t + :custom + (completion-styles '(orderless partial-completion basic)) + (completion-category-defaults nil) + (completion-category-overrides '((file (styles partial-completion))))) + +(use-package marginalia + :ensure t + :hook + (after-init . marginalia-mode)) + +(use-package consult + :ensure t + :defer t) + +(use-package embark + :ensure t + :defer t) + +(use-package embark-consult + :ensure t + :hook + (embark-collect-mode . consult-preview-at-point-mode)) + +(use-package treesit-auto + :ensure 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 + :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 + :after corfu + :init (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) + +(use-package cape + :ensure 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 +;; :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 + :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 + :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) + +(use-package exec-path-from-shell + :ensure t + :init + (exec-path-from-shell-initialize)) + +;; (use-package direnv +;; :ensure t +;; :config +;; (direnv-mode)) + +(use-package envrc + :ensure t + :init + (setq envrc-show-summary-in-minibuffer nil) + :hook + (after-init . envrc-global-mode)) + +;; (use-package add-node-modules-path +;; :ensure 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 + :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 + :defer t) + +(use-package diff-hl + :ensure 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 + :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 + :bind + ("C-c l" . org-store-link)) + +;; epubs +(use-package nov + :ensure t) + +;; docker +(use-package docker + :ensure t + :bind ("C-c d" . docker)) + +(use-package vterm + :ensure t) + +(use-package nix-mode + :ensure t + :mode "\\.nix\\'") + + +;; RSS +(use-package elfeed + :ensure t + :custom + (elfeed-feeds + '(("https://hnrss.org/frontpage" hn) + ("https://lwn.net/headlines/rss" lwn)))) + +(provide 'init) +;;; init.el ends here