nixos/pkgsets/emacs/rust.nix

55 lines
1.4 KiB
Nix

{
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 = {
"<tab>" = "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")
'';
};
}