diff --git a/emacs.nix b/emacs.nix index 3dad08b24..913f8de7e 100644 --- a/emacs.nix +++ b/emacs.nix @@ -1,163 +1,22 @@ # Derivation for Emacs pre-configured with packages that I need. +# +# TODO: Fix sly (again) { pkgs }: -with pkgs.unstable; with emacsPackagesNg; +with pkgs; with emacsPackagesNg; let emacsWithPackages = (emacsPackagesNgGen emacs).emacsWithPackages; -# The nix-mode in the official repositories is old and annoying to -# work with, pin it to something newer instead: -nix-mode = emacsPackagesNg.melpaBuild { - pname = "nix-mode"; - version = "20180306"; - - src = fetchFromGitHub { - owner = "NixOS"; - repo = "nix-mode"; - rev = "0ac0271f6c8acdbfddfdbb1211a1972ae562ec17"; - sha256 = "157vy4xkvaqd76km47sh41wykbjmfrzvg40jxgppnalq9pjxfinp"; - }; - - recipeFile = writeText "nix-mode-recipe" '' - (nix-mode :repo "NixOS/nix-mode" :fetcher github - :files (:defaults (:exclude "nix-mode-mmm.el"))) - ''; -}; - -jsonrpc = emacsPackagesNg.elpaBuild rec { - pname = "jsonrpc"; - version = "1.0.0"; - - src = fetchurl { - url = "https://elpa.gnu.org/packages/jsonrpc-${version}.el"; - sha256 = "06lmmn7j2ilkvwibbpgnd8p6d63fjjnxd2ma8f4jw6vrz1f7lwvs"; - }; -}; - -eglot = emacsPackagesNg.melpaBuild rec { - pname = "eglot"; - version = "1.1"; - - src = fetchurl { - url = "https://elpa.gnu.org/packages/eglot-${version}.tar"; - sha256 = "01h4wh87lrd9l50y20gjjkgg760v8ixvbcb3q8jykl29989zw62y"; - }; - - packageRequires = [ jsonrpc ]; -}; - -# ivy has not been updated in unstable for a while: -ivySource = fetchFromGitHub { - owner = "abo-abo"; - repo = "swiper"; - rev = "6f2939485d33e9b28022d3b6912a50669dcdd596"; - sha256 = "1f2i6hkcbiqdw7fr9vabsm32a0gy647llzki6b97yv8vwa0klh2q"; -}; - -withIvySources = pname: recipe: emacsPackagesNg.melpaBuild { - inherit pname; - version = "20180616"; - recipeFile = builtins.toFile "${pname}-recipe" recipe; - src = ivySource; -}; - -newIvy.ivy = withIvySources "ivy" '' -(ivy :files (:defaults - (:exclude "swiper.el" "counsel.el" "ivy-hydra.el") - "doc/ivy-help.org")) -''; - -newIvy.counsel = withIvySources "counsel" '' -(counsel :files ("counsel.el")) -''; - -newIvy.swiper = withIvySources "swiper" '' -(swiper :files ("swiper.el")) -''; - -newIvy.ivy-pass = melpaBuild { - pname = "ivy-pass"; - version = "20170812"; - src = fetchFromGitHub { - owner = "ecraven"; - repo = "ivy-pass"; - rev = "5b523de1151f2109fdd6a8114d0af12eef83d3c5"; - sha256 = "18crb4zh2pjf0cmv3b913m9vfng27girjwfqc3mk7vqd1r5a49yk"; - }; -}; - -counsel-notmuch = melpaBuild { - pname = "counsel-notmuch"; - version = "20171223"; - - packageRequires = [ - newIvy.ivy - pkgs.notmuch - ]; - - src = fetchFromGitHub { - owner = "fuxialexander"; - repo = "counsel-notmuch"; - rev = "ac1aaead81c6860d7b8324cc1c00bcd52de5e9ca"; - sha256 = "19frcrz6bx7d7v1hkg0xv7zmbk2sydlsdzn1s96cqzjk1illchkz"; - }; -}; - -# prescient & ivy-prescient provide better filtering in ivy/counsel, -# but they are not in nixpkgs yet: -prescientSource = fetchFromGitHub { - owner = "raxod502"; - repo = "prescient.el"; - rev = "27c94636489d5b062970a0f7e9041ca186b6b659"; - sha256 = "05jk8cms48dhpbaimmx3akmnq32fgbc0q4dja7lvpvssmq398cn7"; -}; - -prescient = emacsPackagesNg.melpaBuild { - pname = "prescient"; - version = "1.0"; - src = prescientSource; - - recipeFile = writeText "prescient-recipe" '' - (prescient :files ("prescient.el")) - ''; -}; - -ivy-prescient = emacsPackagesNg.melpaBuild { - pname = "ivy-prescient"; - version = "1.0"; - src = prescientSource; - packageRequires = [ prescient newIvy.ivy ]; - - recipeFile = writeText "ivy-prescient-recipe" '' - (ivy-prescient :files ("ivy-prescient.el")) - ''; -}; - -sly = emacsPackagesNg.melpaBuild { - pname = "sly"; - version = "20180613"; - packageRequires = [ elpaPackages.company ]; - - src = fetchFromGitHub { - owner = "joaotavora"; - repo = "sly"; - rev = "a05b45f1564a86a9d49707c9c570da6c3a56b6e5"; - sha256 = "1c9xzppxlnak1px0dv0ljpp4izfj4377lncvrcb1jaiyh8z8ry48"; - }; - - recipeFile = writeText "sly-recipe" '' - (sly :files ("*.el" - ("lib" "lib/*") - ("contrib" "contrib/*"))) - ''; -}; - # As the EXWM-README points out, XELB should be built from source if # EXWM is. xelb = melpaBuild { pname = "xelb"; ename = "xelb"; version = "0.15"; + recipe = builtins.toFile "recipe" '' + (xelb :fetcher github + :repo "ch11ng/xelb") + ''; packageRequires = [ cl-generic emacs ]; @@ -175,6 +34,10 @@ exwm = melpaBuild { pname = "exwm"; ename = "exwm"; version = "0.19"; + recipe = builtins.toFile "recipe" '' + (exwm :fetcher github + :repo "ch11ng/exwm") + ''; packageRequires = [ xelb ]; @@ -201,21 +64,28 @@ in emacsWithPackages(epkgs: # MELPA packages: (with epkgs.melpaPackages; [ - alchemist browse-kill-ring cargo + counsel + counsel-notmuch dash dash-functional dockerfile-mode edit-server + eglot elixir-mode erlang + exwm go-mode gruber-darker-theme haskell-mode ht hydra idle-highlight-mode + intero + ivy + ivy-pass + ivy-prescient jq-mode kotlin-mode magit @@ -224,15 +94,20 @@ in emacsWithPackages(epkgs: multi-term multiple-cursors nginx-mode + nix-mode paredit password-store pg + pkgs.notmuch + prescient rainbow-delimiters restclient rust-mode s + # sly smartparens string-edit + swiper telephone-line terraform-mode toml-mode @@ -243,14 +118,6 @@ in emacsWithPackages(epkgs: yaml-mode ]) ++ - # Stable packages - (with epkgs.melpaStablePackages; [ - intero - ]) ++ - - # Use custom updated ivy packages - (lib.attrValues newIvy) ++ - # Custom packaged Emacs packages: - [ nix-mode eglot prescient ivy-prescient counsel-notmuch pkgs.notmuch sly exwm ] + [ xelb exwm ] )