{ config, lib, pkgs, ... }: with lib; let rustEnv = pkgs.symlinkJoin { name = "rustEnv"; paths = config.machine.pkgsets.rustpkgs.pkgwrap; }; in mkIf (elem "emacs::rust" config.machine.pkgs) { programs.emacs.init.usePackage.rust-mode = { enable = true; hook = [ ''(rust-mode . (lambda () (cargo-minor-mode)))'' ] ++ (if (elem "emacs::lsp" config.machine.pkgs) then [''(rust-mode . (lambda () (lsp)))''] else [''(rust-mode . (lambda () (racer-mode)))'']); mode = [ ''("\\.rs\\'" . rust-mode)'' ]; command = [ "rust-mode" ]; bindLocal = optionalAttrs (elem "emacs::company" config.machine.pkgs) { rust-mode-map = { "" = "company-indent-or-complete-common"; };}; config = '' (setq rust-rustfmt-bin "${rustEnv}/bin/rustfmt") (setq rust-format-on-save t) ''; }; programs.emacs.init.usePackage.cargo = { enable = true; defer = true; }; programs.emacs.init.usePackage.racer = { enable = true; defer = true; hook = [ ''(racer-mode . (lambda () (eldoc-mode)))'' ] ++ optional (elem "emacs::company" config.machine.pkgs) ''(racer-mode . (lambda () (company-mode)))''; config = '' (setq racer-rust-src-path "${rustEnv}/lib/rustlib/src/rust/src") (setq racer-cmd "${rustEnv}/bin/racer") ''; }; }