From 9f8b7edbf6d2c842c361c863aba633f1d7a17d72 Mon Sep 17 00:00:00 2001 From: Marlon Rosenberg Date: Mon, 24 Mar 2025 22:25:01 +0100 Subject: [PATCH 1/5] languages/fsharp: init --- docs/manual/configuring/languages.md | 1 + docs/release-notes/rl-0.8.md | 4 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/fsharp.nix | 108 ++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 modules/plugins/languages/fsharp.nix diff --git a/docs/manual/configuring/languages.md b/docs/manual/configuring/languages.md index 74714365..252163fb 100644 --- a/docs/manual/configuring/languages.md +++ b/docs/manual/configuring/languages.md @@ -19,6 +19,7 @@ formatting to diagnostics. The following languages have sections under the - Go: [vim.languages.go.enable](#opt-vim.languages.go.enable) - Lua: [vim.languages.lua.enable](#opt-vim.languages.lua.enable) - PHP: [vim.languages.php.enable](#opt-vim.languages.php.enable) +- F#: [vim.languages.fsharp.enable](#opt-vim.languages.fsharp.enable) Adding support for more languages, and improving support for existing ones are great places where you can contribute with a PR. diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 5e09bb35..afb5ccd3 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -276,3 +276,7 @@ [rice-cracker-dev](https://github.com/rice-cracker-dev): - `eslint_d` now checks for configuration files to load. + +[Sc3l3t0n](https://github.com/Sc3l3t0n) + +- Add F# support under `vim.languages.fsharp`. diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 20acfb6c..c3312135 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -10,6 +10,7 @@ in { ./clang.nix ./css.nix ./elixir.nix + ./fsharp.nix ./gleam.nix ./go.nix ./hcl.nix diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix new file mode 100644 index 00000000..2b80bf11 --- /dev/null +++ b/modules/plugins/languages/fsharp.nix @@ -0,0 +1,108 @@ +{ + lib, + pkgs, + config, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.types) either listOf package str enum; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.lists) isList; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.lua) expToLua; + + defaultServer = "fsautocomplete"; + servers = { + fsautocomplete = { + package = pkgs.fsautocomplete; + internalFormatter = false; + lspConfig = '' + lspconfig.fsautocomplete.setup { + capabilities = capabilities; + on_attach = default_on_attach; + cmd = ${ + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else "{'${cfg.lsp.package}/bin/fsautocomplete'}" + }, + } + ''; + }; + }; + + defaultFormat = "fantomas"; + formats = { + fantomas = { + package = pkgs.fantomas; + nullConfig = '' + table.insert( + ls_sources, + null_ls.builtins.formatting.fantomas.with({ + command = "${cfg.format.package}/bin/fantomas", + }) + ) + ''; + }; + }; + + cfg = config.vim.languages.fsharp; +in { + options = { + vim.languages.fsharp = { + enable = mkEnableOption "F# language support"; + + treesitter = { + enable = mkEnableOption "F# treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "fsharp"; + }; + + lsp = { + enable = mkEnableOption "F# LSP support" // {default = config.vim.languages.enableLSP;}; + server = mkOption { + description = "F# LSP server to use"; + type = enum (attrNames servers); + default = defaultServer; + }; + + package = mkOption { + description = "F# LSP server package, or the command to run as a list of strings"; + type = either package (listOf str); + default = servers.${cfg.lsp.server}.package; + }; + }; + format = { + enable = mkEnableOption "F# formatting" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + description = "F# formatter to use"; + type = enum (attrNames formats); + default = defaultFormat; + }; + + package = mkOption { + description = "F# formatter package"; + type = package; + default = formats.${cfg.format.type}.package; + }; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + + (mkIf cfg.lsp.enable { + vim.lsp.lspconfig.enable = true; + vim.lsp.lspconfig.sources.fsharp-lsp = servers.${cfg.lsp.server}.lspConfig; + }) + + (mkIf cfg.format.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources.fsharp-format = formats.${cfg.format.type}.nullConfig; + }) + ]); +} From d6a310252fd307acf90d2171368ee6e1b05b3950 Mon Sep 17 00:00:00 2001 From: Marlon Rosenberg Date: Tue, 25 Mar 2025 19:42:50 +0000 Subject: [PATCH 2/5] languages/fsharp: resolve comments --- configuration.nix | 1 + modules/plugins/languages/fsharp.nix | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/configuration.nix b/configuration.nix index a243c970..78dad9c7 100644 --- a/configuration.nix +++ b/configuration.nix @@ -82,6 +82,7 @@ isMaximal: { elixir.enable = false; haskell.enable = false; ruby.enable = false; + fsharp.enable = false; tailwind.enable = false; svelte.enable = false; diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix index 2b80bf11..ee728060 100644 --- a/modules/plugins/languages/fsharp.nix +++ b/modules/plugins/languages/fsharp.nix @@ -60,14 +60,14 @@ in { lsp = { enable = mkEnableOption "F# LSP support" // {default = config.vim.languages.enableLSP;}; server = mkOption { - description = "F# LSP server to use"; type = enum (attrNames servers); + description = "F# LSP server to use"; default = defaultServer; }; package = mkOption { - description = "F# LSP server package, or the command to run as a list of strings"; type = either package (listOf str); + description = "F# LSP server package, or the command to run as a list of strings"; default = servers.${cfg.lsp.server}.package; }; }; @@ -75,14 +75,14 @@ in { enable = mkEnableOption "F# formatting" // {default = config.vim.languages.enableFormat;}; type = mkOption { - description = "F# formatter to use"; type = enum (attrNames formats); + description = "F# formatter to use"; default = defaultFormat; }; package = mkOption { - description = "F# formatter package"; type = package; + description = "F# formatter package"; default = formats.${cfg.format.type}.package; }; }; From 2aa187999618ad94a1ea701a46d80dff21c9d871 Mon Sep 17 00:00:00 2001 From: raf Date: Tue, 25 Mar 2025 21:40:13 +0000 Subject: [PATCH 3/5] Update rl-0.8.md --- docs/release-notes/rl-0.8.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index afb5ccd3..7f6c6ffe 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -277,6 +277,6 @@ - `eslint_d` now checks for configuration files to load. -[Sc3l3t0n](https://github.com/Sc3l3t0n) +[Sc3l3t0n](https://github.com/Sc3l3t0n): - Add F# support under `vim.languages.fsharp`. From d92b3f37143a73e6f6b1fffc753fc1b898bc2c87 Mon Sep 17 00:00:00 2001 From: Marlon Rosenberg Date: Tue, 25 Mar 2025 22:16:20 +0000 Subject: [PATCH 4/5] correct ordering --- modules/plugins/languages/fsharp.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix index ee728060..6ae1a5b1 100644 --- a/modules/plugins/languages/fsharp.nix +++ b/modules/plugins/languages/fsharp.nix @@ -61,14 +61,14 @@ in { enable = mkEnableOption "F# LSP support" // {default = config.vim.languages.enableLSP;}; server = mkOption { type = enum (attrNames servers); - description = "F# LSP server to use"; default = defaultServer; + description = "F# LSP server to use"; }; package = mkOption { type = either package (listOf str); - description = "F# LSP server package, or the command to run as a list of strings"; default = servers.${cfg.lsp.server}.package; + description = "F# LSP server package, or the command to run as a list of strings"; }; }; format = { @@ -76,14 +76,14 @@ in { type = mkOption { type = enum (attrNames formats); - description = "F# formatter to use"; default = defaultFormat; + description = "F# formatter to use"; }; package = mkOption { type = package; - description = "F# formatter package"; default = formats.${cfg.format.type}.package; + description = "F# formatter package"; }; }; }; From 43843da2300fa2eba2dc880cfb30ff964a1311de Mon Sep 17 00:00:00 2001 From: Marlon Rosenberg Date: Tue, 25 Mar 2025 22:28:08 +0000 Subject: [PATCH 5/5] add example to lsp package --- modules/plugins/languages/fsharp.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/plugins/languages/fsharp.nix b/modules/plugins/languages/fsharp.nix index 6ae1a5b1..86c08d39 100644 --- a/modules/plugins/languages/fsharp.nix +++ b/modules/plugins/languages/fsharp.nix @@ -68,6 +68,7 @@ in { package = mkOption { type = either package (listOf str); default = servers.${cfg.lsp.server}.package; + example = ''[lib.getExe pkgs.fsautocomplete "--state-directory" "~/.cache/fsautocomplete"]''; description = "F# LSP server package, or the command to run as a list of strings"; }; };