241 lines
6.9 KiB
Markdown
241 lines
6.9 KiB
Markdown
<table><tr><th>[readme](../README.md)</th><th>**reference**</th><th>[faq](./faq.md)</th></tr></table>
|
|
|
|
# nix-doom-emacs reference
|
|
|
|
nix-doom-emacs uses [`nix-straight.el`](https://github.com/nix-community/nix-straight.el) under the hood to install dependencies. It's a low level wrapper to integrate Nix with [`straight.el`](https://github.com/radian-software/straight.el). It is maintained by the same people as this project.
|
|
|
|
Currently, `nix-straight.el` only extracts package names and uses [`emacs-overlay`](https://github.com/nix-community/emacs-overlay) to obtain the package sources. This works most of the time but occasionally results in obscure issues with recently updated packages.
|
|
|
|
# Getting Started
|
|
|
|
In all of these methods, you'll need your Doom Emacs configuration. It should contain the following three files:
|
|
`config.el`, `init.el` and `packages.el`. If you don't already have an existing `doom-emacs` configuration, you can use the contents of `test/doom.d` as a template.
|
|
|
|
## Home-Manager
|
|
|
|
### With Flakes
|
|
|
|
`File: flake.nix`
|
|
```nix
|
|
{
|
|
inputs = {
|
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"
|
|
home-manager.url = "github:nix-community/home-manager";
|
|
nix-doom-emacs.url = "github:nix-community/nix-doom-emacs";
|
|
};
|
|
|
|
outputs = {
|
|
self,
|
|
nixpkgs,
|
|
home-manager,
|
|
nix-doom-emacs,
|
|
...
|
|
}: {
|
|
nixosConfigurations.exampleHost = nixpkgs.lib.nixosSystem {
|
|
system = "x86_64-linux";
|
|
modules = [
|
|
home-manager.nixosModules.home-manager
|
|
{
|
|
home-manager.users.exampleUser = { ... }: {
|
|
imports = [ nix-doom-emacs.hmModule ];
|
|
programs.doom-emacs = {
|
|
enable = true;
|
|
doomPrivateDir = ./doom.d; # Directory containing your config.el, init.el
|
|
# and packages.el files
|
|
};
|
|
};
|
|
}
|
|
];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
### Without Flakes
|
|
|
|
```nix
|
|
{ pkgs, ... }:
|
|
|
|
let
|
|
doom-emacs = pkgs.callPackage (builtins.fetchTarball {
|
|
url = https://github.com/nix-community/nix-doom-emacs/archive/master.tar.gz;
|
|
}) {
|
|
doomPrivateDir = ./doom.d; # Directory containing your config.el, init.el
|
|
# and packages.el files
|
|
};
|
|
in {
|
|
home.packages = [ doom-emacs ];
|
|
}
|
|
```
|
|
|
|
|
|
## NixOS
|
|
|
|
`File: flake.nix`
|
|
```nix
|
|
{
|
|
inputs = {
|
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
|
nix-doom-emacs.url = "github:nix-community/nix-doom-emacs";
|
|
};
|
|
|
|
outputs = {
|
|
self,
|
|
nixpkgs,
|
|
nix-doom-emacs,
|
|
...
|
|
}: {
|
|
nixosConfigurations.exampleHost = nixpkgs.lib.nixosSystem {
|
|
system = "x86_64-linux";
|
|
modules = [
|
|
{
|
|
environment.systemPackages =
|
|
let
|
|
doom-emacs = inputs.nix-doom-emacs.packages.${system}.default.override {
|
|
doomPrivateDir = ./doom.d;
|
|
};
|
|
in [
|
|
doom-emacs
|
|
];
|
|
}
|
|
# ...
|
|
];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
You can see all overridable parameters of nix-doom-emacs in [default.nix](../default.nix).
|
|
|
|
## Standalone
|
|
|
|
### Flake
|
|
|
|
```nix
|
|
{
|
|
description = "nix-doom-emacs shell";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
|
nix-doom-emacs.url = "github:nix-community/nix-doom-emacs";
|
|
};
|
|
|
|
outputs = { self, nixpkgs, nix-doom-emacs, ... }:
|
|
let
|
|
system = "x86_64-linux";
|
|
pkgs = import nixpkgs { inherit system; };
|
|
doom-emacs = nix-doom-emacs.packages.${system}.default.override {
|
|
doomPrivateDir = ./doom.d;
|
|
};
|
|
in
|
|
{
|
|
devShells.${system}.default = pkgs.mkShell {
|
|
buildInputs = [ doom-emacs ];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
### Non-Flake
|
|
```nix
|
|
{ pkgs ? import <nixpkgs> { } }:
|
|
|
|
let
|
|
repo = pkgs.fetchFromGitHub {
|
|
owner = "nix-community";
|
|
repo = "nix-doom-emacs";
|
|
rev = "<commit>";
|
|
sha256 = "<hash>";
|
|
};
|
|
nix-doom-emacs = pkgs.callPackage (import repo) {
|
|
doomPrivateDir = ./doom.d;
|
|
};
|
|
in
|
|
pkgs.mkShell {
|
|
buildInputs = [ nix-doom-emacs ];
|
|
}
|
|
```
|
|
|
|
# Setup
|
|
|
|
## Emacs daemon
|
|
|
|
If you use the Home-Manager module, you can enable it via `services.emacs.enable = true;`. The Home-Manager module will do the rest for you.
|
|
|
|
If you're not, and you're using a standalone method (NixOS/nix-darwin without Home-Manager) instead, you'll need:
|
|
|
|
```nix
|
|
services.emacs = {
|
|
enable = true;
|
|
package = inputs.doom-emacs.packages.${system}.doom-emacs.override {
|
|
doomPrivateDir = ./doom.d;
|
|
};
|
|
};
|
|
```
|
|
|
|
You can now run `emacsclient -c` to connect to the daemon.
|
|
|
|
## Custom Emacs derivations (i.e., PGTK, NativeComp)
|
|
|
|
If you're using the Home-Manager module, you can use the `emacsPackage` attribute after applying `emacs-overlay` to your nixpkgs:
|
|
|
|
```nix
|
|
programs.doom-emacs = {
|
|
enable = true;
|
|
doomPrivateDir = ./doom.d;
|
|
emacsPackage = pkgs.emacsPgtkNativeComp;
|
|
}
|
|
```
|
|
|
|
For standalone usage with Flakes:
|
|
|
|
```nix
|
|
let
|
|
# ...
|
|
doom-emacs = nix-doom-emacs.packages.${system}.default.override {
|
|
doomPrivateDir = ./doom.d;
|
|
emacsPackage = pkgs.emacsPgtkNativeComp;
|
|
};
|
|
in {
|
|
# ...
|
|
}
|
|
```
|
|
|
|
And for non-Flakes usage:
|
|
|
|
```nix
|
|
let
|
|
# ...
|
|
nix-doom-emacs = pkgs.callPackage (import repo) {
|
|
doomPrivateDir = ./doom.d;
|
|
emacsPackage = pkgs.emacsPgtkNativeComp
|
|
};
|
|
in {
|
|
# ...
|
|
}
|
|
```
|
|
|
|
## Updating configuration
|
|
|
|
Note that, unlike imperative `Doom Emacs`, we do not have a `doom sync`. Our project builds an Emacs with your Doom configuration embedded in it. `doom sync` just updates packages.
|
|
This doesn't mean that you can't update your packages and configuration, obviously:
|
|
|
|
To update your Doom Emacs config, you simply rebuild your configuration. For example, in NixOS you can use `nixos-rebuild switch` (or `home-manager switch` if you use Home-Manager standalone). nix-doom-emacs will do everything else for you.
|
|
|
|
In an imperative environment, Doom updates can break Emacs with no easy way to roll back.
|
|
nix-doom-emacs moves the moving parts of your Emacs installation into the Nix build sandbox.
|
|
|
|
## Building third-party Emacs packages
|
|
|
|
Though beyond the scope of this document, [`trivialBuild`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/emacs/trivial.nix) is a nixpkgs function to trivially build Emacs packages. You can use it to build e.g. local packages or packages hosted on Git repositories. There is also a family of functions in nixpkgs which are made to build Emacs packages, such as:
|
|
|
|
- [`generic`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/emacs/generic.nix): This is the "base" function which all the other build functions are derived from
|
|
- [`elpaBuild`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/emacs/elpa.nix): For ELPA packages
|
|
- [`melpaBuild`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/emacs/elpa.nix): For MELPA packages
|
|
|
|
To find examples of how they're used, try to [search nixpkgs](https://github.com/NixOS/nixpkgs/search) for usages of them.
|
|
|
|
# Support
|
|
|
|
If you encounter any issues while using nix-doom-emacs, you can find some of us in the [Matrix room](https://matrix.to/#/#doom-emacs:nixos.org).
|