I started using NixOS again some time ago. The fact that NixOS doesn’t use Filesystem Hierarchy Standard is sometimes a big source of pain and complications. One non-obvious thing for beginners is how to compile a C program.
One C program that is very useful and must be compiled locally is emacs-libvterm C module, providing a visual terminal for Emacs. There are several good reasons to use emacs-libvterm:
- It’s sometimes useful to run visual terminal programs.
- Many command line programs don’t work well with line terminals.
- If a command line program uses its own command line interface, it’s occasionally useful to take advantage of it. Additionally, Eshell command line editing doesn’t work with programs that enter their own command line interfaces.
- External, non-Emacs, terminal emulators work well but their capabilities are quite limited and they are not integrated with Emacs.
- Built-in Emacs visual terminal emulators (term, ansi-term) don’t work very well and are unusable with many applications and utilities.
emacs-libvterm solves all the problems. It works, it can use all the Emacs editing capabilities and it is integrated with Emacs. On standard systems, emacs-libvterm compiles its module automatically, as long as libvterm development package is installed. But it’s more difficult on NixOS.
The first problem is how to compile a C program on NixOS. As far as I understand it, nix-shell
environment must be used. The second problem is that libvterm
package in NixOS contains something old and apparently unmaintained and libvterm-neovim
must be used instead. It took me quite long to realize it, I wasted a lot of time investigating problems related to libvterm
and possibly other broken NixOS packages. Which was a problem of category 1, my ignorance, combined with a problem of category 2, broken obsolete packages in the distribution.
So how to compile Emacs vterm module on NixOS? Assuming gcc
and gnumake
packages are already installed on the system, it’s needed to create the following shell.nix
file:
with import <nixpkgs> {}; stdenv.mkDerivation { name = "emacsenv"; nativeBuildInputs = [ cmake ]; buildInputs = [ libvterm-neovim ]; }
Then nix-shell
is run in the same directory. When Emacs is started in the given nix-shell environment, emacs-libvtem compiles and installs fine.
Leave a Reply