diff --git a/plugins/lsp/conform-nvim.nix b/plugins/lsp/conform-nvim.nix new file mode 100644 index 0000000000..d1e2044963 --- /dev/null +++ b/plugins/lsp/conform-nvim.nix @@ -0,0 +1,119 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; let + cfg = config.plugins.conform-nvim; + helpers = import ../helpers.nix {inherit lib;}; +in { + options.plugins.conform-nvim = + helpers.extraOptionsOptions + // { + enable = mkEnableOption "conform-nvim"; + + package = helpers.mkPackageOption "conform-nvim" pkgs.vimPlugins.conform-nvim; + + formattersByFt = + helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) + "see documentation" + '' + ```nix + # Map of filetype to formatters + formattersByFt = + { + lua = [ "stylua" ]; + # Conform will run multiple formatters sequentially + python = [ "isort" "black" ]; + # Use a sub-list to run only the first available formatter + javascript = [ [ "prettierd" "prettier" ] ]; + # Use the "*" filetype to run formatters on all filetypes. + "*" = [ "codespell" ]; + # Use the "_" filetype to run formatters on filetypes that don't + # have other formatters configured. + "_" = [ "trim_whitespace" ]; + }; + ``` + ''; + + formatOnSave = + helpers.defaultNullOpts.mkNullable (types.submodule { + options = { + lspFallback = mkOption { + type = types.bool; + default = true; + description = "See :help conform.format for details."; + }; + timeoutMs = mkOption { + type = types.int; + default = 500; + description = "See :help conform.format for details."; + }; + }; + }) + "see documentation" + '' + If this is set, Conform will run the formatter on save. + It will pass the table to conform.format(). + This can also be a function that returns the table. + See :help conform.format for details. + ''; + + formatAfterSave = + helpers.defaultNullOpts.mkNullable (types.submodule { + options = { + lspFallback = mkOption { + type = types.bool; + default = true; + description = "See :help conform.format for details."; + }; + }; + }) + "see documentation" + '' + If this is set, Conform will run the formatter asynchronously after save. + It will pass the table to conform.format(). + This can also be a function that returns the table. + ''; + + logLevel = + helpers.defaultNullOpts.mkEnumFirstDefault + ["ERROR" "DEBUG" "INFO" "TRACE" "WARN" "OFF"] + "Set the log level. Use `:ConformInfo` to see the location of the log file."; + + notifyOnError = + helpers.defaultNullOpts.mkBool true + "Conform will notify you when a formatter errors"; + + formatters = + helpers.defaultNullOpts.mkNullable (types.attrsOf types.anything) + "see documentation" + "Custom formatters and changes to built-in formatters"; + }; + + config = let + setupOptions = with cfg; + { + formatters_by_ft = formattersByFt; + format_on_save = helpers.ifNonNull' formatOnSave { + lsp_fallback = formatOnSave.lspFallback; + timeout_ms = formatOnSave.timeoutMs; + }; + format_after_save = helpers.ifNonNull' formatOnSave { + lsp_fallback = formatOnSave.lspFallback; + }; + log_level = helpers.ifNonNull' logLevel (helpers.mkRaw "vim.log.levels.${logLevel}"); + notify_on_error = notifyOnError; + inherit formatters; + } + // cfg.extraOptions; + in + mkIf cfg.enable { + extraPlugins = [cfg.package]; + + extraConfigLua = '' + require("conform").setup(${helpers.toLuaObject setupOptions}) + ''; + }; +} diff --git a/plugins/lsp/conform.nix b/plugins/lsp/conform.nix deleted file mode 100644 index b50ae821fe..0000000000 --- a/plugins/lsp/conform.nix +++ /dev/null @@ -1,90 +0,0 @@ -{ - pkgs, - config, - lib, - ... -}: -with lib; let - cfg = config.plugins.conform; - helpers = import ../helpers.nix {inherit lib;}; -in { - options.plugins.conform = - helpers.extraOptionsOptions - // { - enable = mkEnableOption "conform.nvim"; - - package = helpers.mkPackageOption "conform.nvim" pkgs.vimPlugins.conform-nvim; - - # Map of filetype to formatters - formattersByFt = - helpers.defaultNullOpts.mkNullable types.attrs - "see documentation" - '' - Map of filetype to formatters - lua = { "stylua" }, - Conform will run multiple formatters sequentially - python = { "isort", "black" }, - Use a sub-list to run only the first available formatter - javascript = { { "prettierd", "prettier" } }, - Use the "*" filetype to run formatters on all filetypes. - ["*"] = { "codespell" }, - Use the "_" filetype to run formatters on filetypes that don't - have other formatters configured. - ["_"] = { "trim_whitespace" }, - ''; - # If this is set, Conform will run the formatter on save. - # It will pass the table to conform.format(). - # This can also be a function that returns the table. - # See :help conform.format for details. - formatOnSave = { - lspFallback = - helpers.defaultNullOpts.mkBool true - "See :help conform.format for details."; - timeoutMs = - helpers.defaultNullOpts.mkNullable (types.int) 1000 - "See :help conform.format for details."; - }; - - # If this is set, Conform will run the formatter asynchronously after save. - # It will pass the table to conform.format(). - # This can also be a function that returns the table. - formatAfterSave = { - lspFallback = - helpers.defaultNullOpts.mkBool true - "See :help conform.format for details."; - }; - - # Set the log level. Use `:ConformInfo` to see the location of the log file. - logLevel = - helpers.defaultNullOpts.mkNullable - types.str - "vim.log.levels.ERROR" - " See :h log_levels "; - - # Conform will notify you when a formatter errors - notifyOnError = - helpers.defaultNullOpts.mkBool true - "Conform will notify you when a formatter errors"; - - # Custom formatters and changes to built-in formatters - formatters = - helpers.defaultNullOpts.mkNullable types.attrs - "see documentation" - "Custom formatters and changes to built-in formatters"; - }; - - config = let - setupOptions = with cfg; - { - inherit formattersByFt; - } - // cfg.extraOptions; - in - mkIf cfg.enable { - extraPlugins = [cfg.package]; - - extraConfigLua = '' - require("conform").setup(${helpers.toLuaObject setupOptions}) - ''; - }; -} diff --git a/tests/test-sources/plugins/lsp/conform-nvim.nix b/tests/test-sources/plugins/lsp/conform-nvim.nix new file mode 100644 index 0000000000..5c137d553b --- /dev/null +++ b/tests/test-sources/plugins/lsp/conform-nvim.nix @@ -0,0 +1,61 @@ +{ + empty = { + plugins.conform-nvim.enable = true; + }; + + default = { + plugins.conform-nvim = { + enable = true; + formattersByFt = { + lua = ["stylua"]; + python = ["isort" "black"]; + javascript = [["prettierd" "prettier"]]; + "*" = ["codespell"]; + "_" = ["trimWhitespace"]; + }; + formatOnSave = { + lspFallback = true; + timeoutMs = 500; + }; + formatAfterSave = { + lspFallback = true; + }; + logLevel = "ERROR"; + notifyOnError = true; + formatters = { + myFormatter = { + command = "myCmd"; + args = ["--stdin-from-filename" "$FILENAME"]; + rangeArgs = '' + function(ctx) + return { "--line-start", ctx.range.start[1], "--line-end", ctx.range["end"][1] } + end; + ''; + stdin = true; + cwd = '' + require("conform.util").rootFile({ ".editorconfig", "package.json" }); + ''; + requireCwd = true; + condition = '' + function(ctx) + return vim.fs.basename(ctx.filename) ~= "README.md" + end; + ''; + exitCodes = [0 1]; + env = { + VAR = "value"; + }; + "inherit" = true; + prependArgs = ["--use-tabs"]; + }; + otherFormatter = '' + function(bufnr) + return { + command = "myCmd"; + } + end; + ''; + }; + }; + }; +} diff --git a/tests/test-sources/plugins/lsp/conform.nix b/tests/test-sources/plugins/lsp/conform.nix deleted file mode 100644 index 9bbb38143c..0000000000 --- a/tests/test-sources/plugins/lsp/conform.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ - empty = { - plugins.conform.enable = true; - }; - - example = { - plugins.conform = { - enable = true; - formatters_by_ft = { - "lua" = ["stylua"]; - "python" = ["isort" "black"]; - "javascript" = [["prettierd" "prettier"]]; - }; - }; - }; -}