From 831a8d6e0b354718e0a3456d7abf8613070ab83b Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Thu, 7 May 2026 21:31:20 +0200 Subject: [PATCH] lang/haskell: don't install hls --- modules/plugins/languages/haskell.nix | 33 +++++++----- modules/plugins/lsp/presets/default.nix | 1 + modules/plugins/lsp/presets/haskell-tools.nix | 54 ++++++++++--------- 3 files changed, 48 insertions(+), 40 deletions(-) diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index b392bcee..2b4ca2a7 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -4,14 +4,14 @@ pkgs, ... }: let - inherit (builtins) isList attrNames; - inherit (lib.types) either package enum listOf str; + inherit (builtins) isList; + inherit (lib.attrsets) genAttrs; + inherit (lib.types) either package listOf str; inherit (lib.options) mkEnableOption mkOption literalExpression; inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption; + inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption enumWithRename; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.lua) toLuaObject; - inherit (lib.nvim.custom) enumWithRename; inherit (pkgs) haskellPackages; cfg = config.vim.languages.haskell; @@ -43,7 +43,7 @@ in { type = listOf ( enumWithRename "vim.languages.haskell.lsp.servers" - (attrNames servers) + servers {hls = "haskell-tools";} ); default = defaultServers; @@ -53,9 +53,10 @@ in { > [!NOTE] > - > HLS is extremely picky about your GHC version - most likely you'll - > have to install your specific HLS version in a devShell that matches - > your GHC version. + > Since HLS is very picky about the GHC version, we do not provide + > a default HLS. You'll have to install your own. It is recommended + > to install `haskell-language-server` in a devShell, along with the + > GHC version you need. ''; }; }; @@ -90,6 +91,15 @@ in { }; }) + (mkIf cfg.lsp.enable { + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: { + filetypes = ["haskell" "lhaskell"]; + }); + }; + }) + (mkIf cfg.dap.enable { vim.languages.haskell.extensions.haskell-tools-nvim = { enable = true; @@ -107,12 +117,7 @@ in { (mkIf cfg.extensions.haskell-tools-nvim.enable { vim = { startPlugins = ["haskell-tools-nvim"]; - luaConfigRC.haskell-tools-nvim = - entryAfter - ["lsp-servers"] - '' - vim.g.haskell_tools = ${cfg.extensions.haskell-tools-nvim.setupOpts} - ''; + globals.haskell_tools = cfg.extensions.haskell-tools-nvim.setupOpts; }; }) ]); diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index f5f71c35..26906799 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -21,6 +21,7 @@ ./glsl_analyzer.nix ./gopls.nix ./harper.nix + ./haskell-tools.nix ./helm-ls.nix ./intelephense.nix ./jdt-language-server.nix diff --git a/modules/plugins/lsp/presets/haskell-tools.nix b/modules/plugins/lsp/presets/haskell-tools.nix index e94abb0f..63365035 100644 --- a/modules/plugins/lsp/presets/haskell-tools.nix +++ b/modules/plugins/lsp/presets/haskell-tools.nix @@ -1,47 +1,49 @@ { config, lib, - pkgs, ... }: let - inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; inherit (lib.nvim.types) mkLspPresetEnableOption; inherit (lib.generators) mkLuaInline; cfg = config.vim.lsp.presets.haskell-tools; - haskell-toolsPackage = pkgs.haskellPackages.haskell-language-server; in { options.vim.lsp.presets.haskell-tools = { enable = mkLspPresetEnableOption "haskell-tools-nvim" "Haskell" ["haskell"]; }; config = mkIf cfg.enable { - vim.lsp.servers.haskell-tools = { - # The plugin will handle startup - enable = false; - # TODO: does this actually work? - cmd = [(getExe' haskell-toolsPackage "haskell-language-server-wrapper")]; - on_attach = mkLuaInline '' - function(client, bufnr) - local ht = require("haskell-tools") - local opts = { noremap = true, silent = true, buffer = bufnr } - vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) - vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) - vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) - vim.keymap.set('n', 'rr', ht.repl.toggle, opts) - vim.keymap.set('n', 'rf', function() - ht.repl.toggle(vim.api.nvim_buf_get_name(0)) - end, opts) - vim.keymap.set('n', 'rq', ht.repl.quit, opts) - end - ''; - settings = { - haskell = { - formattingProvider = "ormolu"; - cabalFormattingProvider = "cabal-fmt"; + vim = { + lsp.servers.haskell-tools = { + # The plugin will handle startup + enable = false; + # NOTE: pkgs.haskell-language-server does not expose the haskell-language-server program + on_attach = mkLuaInline '' + function(client, bufnr) + local ht = require("haskell-tools") + local opts = { noremap = true, silent = true, buffer = bufnr } + vim.keymap.set('n', 'cl', vim.lsp.codelens.run, opts) + vim.keymap.set('n', 'hs', ht.hoogle.hoogle_signature, opts) + vim.keymap.set('n', 'ea', ht.lsp.buf_eval_all, opts) + vim.keymap.set('n', 'rr', ht.repl.toggle, opts) + vim.keymap.set('n', 'rf', function() + ht.repl.toggle(vim.api.nvim_buf_get_name(0)) + end, opts) + vim.keymap.set('n', 'rq', ht.repl.quit, opts) + end + ''; + settings = { + haskell = { + formattingProvider = "ormolu"; + cabalFormattingProvider = "cabal-fmt"; + }; }; }; + + languages.haskell.extensions.haskell-tools-nvim = { + enable = true; + }; }; }; }