Home Explore Blog Models CI



nixpkgs

2nd chunk of `nixos/modules/services/editors/emacs.md`
27b5cca4597e7ef549c3e970e6527c8774cfe0c85b978cf10000000100000fd9
::: {.example #ex-emacsNix}
### Nix expression to build Emacs with packages (`emacs.nix`)

```nix
/*
  This is a nix expression to build Emacs and some Emacs packages I like
  from source on any distribution where Nix is installed. This will install
  all the dependencies from the nixpkgs repository and build the binary files
  without interfering with the host distribution.

  To build the project, type the following from the current directory:

  $ nix-build emacs.nix

  To run the newly compiled executable:

  $ ./result/bin/emacs
*/

# The first non-comment line in this file indicates that
# the whole file represents a function.
{
  pkgs ? import <nixpkgs> { },
}:

let
  # The let expression below defines a myEmacs binding pointing to the
  # current stable version of Emacs. This binding is here to separate
  # the choice of the Emacs binary from the specification of the
  # required packages.
  myEmacs = pkgs.emacs;
  # This generates an emacsWithPackages function. It takes a single
  # argument: a function from a package set to a list of packages
  # (the packages that will be available in Emacs).
  emacsWithPackages = (pkgs.emacsPackagesFor myEmacs).emacsWithPackages;
  # The rest of the file specifies the list of packages to install. In the
  # example, two packages (magit and zerodark-theme) are taken from
  # MELPA stable.
in
emacsWithPackages (
  epkgs:
  (with epkgs.melpaStablePackages; [
    magit # ; Integrate git <C-x g>
    zerodark-theme # ; Nicolas' theme
  ])
  # Two packages (undo-tree and zoom-frm) are taken from MELPA.
  ++ (with epkgs.melpaPackages; [
    undo-tree # ; <C-x u> to show the undo tree
    zoom-frm # ; increase/decrease font size for all buffers %lt;C-x C-+>
  ])
  # Three packages are taken from GNU ELPA.
  ++ (with epkgs.elpaPackages; [
    auctex # ; LaTeX mode
    beacon # ; highlight my cursor when scrolling
    nameless # ; hide current package name everywhere in elisp code
  ])
  # notmuch is taken from a nixpkgs derivation which contains an Emacs mode.
  ++ [
    pkgs.notmuch # From main packages set
  ]
)
```
:::

The result of this configuration will be an {command}`emacs`
command which launches Emacs with all of your chosen packages in the
{var}`load-path`.

You can check that it works by executing this in a terminal:
```ShellSession
$ nix-build emacs.nix
$ ./result/bin/emacs -q
```
and then typing `M-x package-initialize`. Check that you
can use all the packages you want in this Emacs instance. For example, try
switching to the zerodark theme through `M-x load-theme <RET> zerodark <RET> y`.

::: {.tip}
A few popular extensions worth checking out are: auctex, company,
edit-server, flycheck, helm, iedit, magit, multiple-cursors, projectile,
and yasnippet.
:::

The list of available packages in the various ELPA repositories can be seen
with the following commands:
::: {.example #module-services-emacs-querying-packages}
### Querying Emacs packages

```
nix-env -f "<nixpkgs>" -qaP -A emacs.pkgs.elpaPackages
nix-env -f "<nixpkgs>" -qaP -A emacs.pkgs.melpaPackages
nix-env -f "<nixpkgs>" -qaP -A emacs.pkgs.melpaStablePackages
nix-env -f "<nixpkgs>" -qaP -A emacs.pkgs.orgPackages
```
:::

If you are on NixOS, you can install this particular Emacs for all users by
putting the `emacs.nix` file in `/etc/nixos` and adding it to the list of
system packages (see [](#sec-declarative-package-mgmt)). Simply modify your
file {file}`configuration.nix` to make it contain:
::: {.example #module-services-emacs-configuration-nix}
### Custom Emacs in `configuration.nix`

```nix
{
  environment.systemPackages = [
    # [...]
    (import ./emacs.nix { inherit pkgs; })
  ];
}
```
:::

In this case, the next {command}`nixos-rebuild switch` will take
care of adding your {command}`emacs` to the {var}`PATH`
environment variable (see [](#sec-changing-config)).

<!-- fixme: i think the following is better done with config.nix
https://nixos.org/nixpkgs/manual/#sec-modify-via-packageOverrides
-->

If you are not on NixOS or want to install this particular Emacs only for

Title: Declarative Emacs Package Management with Nix Expressions
Summary
This chunk provides a detailed Nix expression (`emacs.nix`) demonstrating how to declaratively build Emacs with a custom selection of packages from various repositories, including MELPA Stable, MELPA, GNU ELPA, and Nixpkgs itself. It explains how to define the Emacs binary and then specify desired packages, illustrating with examples like `magit`, `zerodark-theme`, and `auctex`. The text outlines how to build and test this custom Emacs instance, query available Emacs packages in Nixpkgs, and integrate this configuration for system-wide installation on NixOS by modifying `configuration.nix`.