Haskell Language Server and Coc

Haskell has great IDE support via haskell-language-server (HLS).

Coc.nvim is the recommended extension to get Language Server Protocol (LSP) support for editing Haskell in neovim.

It turns out that home-manager has a module that, unlike the NixOS version, provides a declarative way to install and configure coc.nvim with Haskell support (EDIT: this is language-independent):

  programs.neovim = {
    coc = {
      enable = true;
      settings = {
        languageserver = {
          haskell = {
            command = "haskell-language-server-wrapper";
            args = [ "--lsp" ];
            rootPatterns = [
            filetypes = [ "haskell" "lhaskell" ];


It does work when trying out in the nix-shell of haskell-template.

Declarative plugin config in Nix

The above is neatβ€”no need to hand-write VimScript or Lua just to configure the extension. Can we do the same for other neovim extensions in Nix? A couple of attempts exist: nix-neovim and NixVim.

Links to this page
  • Modular neovim plugin configuration

    In the previous post I hinted about configuring neovim plugins declaratively in Nix. Today, I discovered that this is indeed possible,* in some basic form, in home-manager.

    It is not really declarative, though β€” more like modular. Declarative would be how Coc is configured in home-manager; see Haskell Language Server and Coc. Nevertheless, it is nice to be able to both configure and enable a plugin in the same place. Give the large number of neovim plugins in nixpkgs, it is not realistic to expect all of them to support declarative config anyway.

#neovim #haskell