From 802206bff4bdb534ecb750942c163cf5aef5b6d4 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Wed, 20 May 2026 16:34:15 +0200 Subject: [PATCH] language/haskell: let conform handle cabal formatting --- modules/plugins/languages/haskell.nix | 55 +++++++++---------- .../lsp/presets/haskell-language-server.nix | 15 +---- 2 files changed, 27 insertions(+), 43 deletions(-) diff --git a/modules/plugins/languages/haskell.nix b/modules/plugins/languages/haskell.nix index 366bd3d8..38f2f014 100644 --- a/modules/plugins/languages/haskell.nix +++ b/modules/plugins/languages/haskell.nix @@ -6,10 +6,10 @@ ... }: let inherit (builtins) attrNames; - inherit (lib) genAttrs optional; + inherit (lib) genAttrs; inherit (lib.types) either package enum listOf str nullOr attrsOf anything; inherit (lib.options) mkEnableOption mkOption literalExpression; - inherit (lib.modules) mkIf mkMerge mkDefault; + inherit (lib.modules) mkIf mkMerge; inherit (config.vim.lib) mkMappingOption; inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.binds) addDescriptionsToMappings; @@ -32,10 +32,9 @@ floskell = {command = getExe haskellPackages.floskell;}; }; - defaultCabalFormat = "cabal-fmt"; + defaultCabalFormat = ["cabal-fmt"]; cabalFormats = { - cabal-fmt = haskellPackages.cabal-fmt; - cabal-gild = haskellPackages.cabal-gild; + cabal-fmt = {command = getExe haskellPackages.cabal-fmt;}; }; in { options.vim.languages.haskell = { @@ -77,19 +76,11 @@ in { default = defaultFormat; description = "Haskell formatter to use"; }; - }; - cabalFormat = { - enable = - mkEnableOption "Haskell cabal file formatting via HLS" - // { - default = config.vim.languages.enableFormat; - defaultText = literalExpression "config.vim.languages.enableFormat"; - }; - type = mkOption { - type = enum (attrNames cabalFormats); + cabalFormatters = mkOption { + type = listOf (enum (attrNames cabalFormats)); default = defaultCabalFormat; - description = "Haskell cabal file formatter to use via HLS"; + description = "Cabal file formatter to use"; }; }; @@ -201,20 +192,32 @@ in { formatters_by_ft = { haskell = cfg.format.type; lhaskell = cfg.format.type; + cabal = cfg.format.cabalFormatters; }; - formatters = - mapListToAttrs (name: { - inherit name; - value = formats.${name}; - }) - cfg.format.type; + formatters = mkMerge [ + ( + mapListToAttrs + (name: { + inherit name; + value = formats.${name}; + }) + cfg.format.type + ) + ( + mapListToAttrs + (name: { + inherit name; + value = cabalFormats.${name}; + }) + cfg.format.cabalFormatters + ) + ]; }; }; }) (mkIf cfg.extensions.haskell-tools.enable { vim = { - extraPackages = optional cfg.cabalFormat.enable cabalFormats.${cfg.cabalFormat.type}; startPlugins = ["haskell-tools-nvim"]; globals.haskell_tools = cfg.extensions.haskell-tools.setupOpts; languages.haskell.extensions.haskell-tools.setupOpts = { @@ -239,12 +242,6 @@ in { ${mkBinding mappings.replQuit "function() vim.cmd('Haskell repl quit') end"} end ''; - settings = mkIf cfg.cabalFormat.enable (mkDefault { - haskell = { - cabalFormattingProvider = cfg.cabalFormat.type; - plugin.${cfg.cabalFormat.type}.config.path = getExe cabalFormats.${cfg.cabalFormat.type}; - }; - }); }; }; }; diff --git a/modules/plugins/lsp/presets/haskell-language-server.nix b/modules/plugins/lsp/presets/haskell-language-server.nix index 967b1cd4..f716b718 100644 --- a/modules/plugins/lsp/presets/haskell-language-server.nix +++ b/modules/plugins/lsp/presets/haskell-language-server.nix @@ -4,16 +4,11 @@ pkgs, ... }: let - inherit (lib.meta) getExe getExe'; + inherit (lib.meta) getExe'; inherit (lib.modules) mkIf; inherit (lib.nvim.types) mkLspPresetEnableOption; cfg = config.vim.lsp.presets.haskell-language-server; - cabalFmtCfg = config.vim.languages.haskell.cabalFormat; - cabalFormats = { - cabal-fmt = pkgs.haskellPackages.cabal-fmt; - cabal-gild = pkgs.haskellPackages.cabal-gild; - }; in { options.vim.lsp.presets.haskell-language-server = { enable = mkLspPresetEnableOption "haskell-language-server" "Haskell" []; @@ -32,14 +27,6 @@ in { "--lsp" ]; root_markers = ["hie.yaml" "stack.yaml" "cabal.project" "*.cabal" "package.yaml"]; - settings = mkIf cabalFmtCfg.enable { - haskell = { - cabalFormattingProvider = cabalFmtCfg.type; - # This option is undocumented in the haskell-language-server docs, but it does exist in the plugin API - # https://github.com/haskell/haskell-language-server/blob/f158128ec034bec1667c440262641086bbb4d359/plugins/hls-cabal-fmt-plugin/src/Ide/Plugin/CabalFmt.hs#L51 - plugin.${cabalFmtCfg.type}.config.path = getExe cabalFormats.${cabalFmtCfg.type}; - }; - }; }; }; }