From c76ec1f33a9b81216430d8e0408e201a2a9d0ed6 Mon Sep 17 00:00:00 2001 From: Venkatesan Ravi Date: Sun, 6 Apr 2025 09:44:42 +0000 Subject: [PATCH] languages/fish: init --- docs/release-notes/rl-0.8.md | 1 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/fish.nix | 95 +++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 modules/plugins/languages/fish.nix diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 32460969..177ac16f 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -303,6 +303,7 @@ - Disable mini.indentscope for applicable filetypes. - Fix fzf-lua having a hard dependency on fzf. - Enable inlay hints support - `config.vim.lsp.inlayHints`. +- Add Fish language support under `vim.languages.fish`. [tebuevd](https://github.com/tebuevd): diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index c3312135..ae47c5a4 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -10,6 +10,7 @@ in { ./clang.nix ./css.nix ./elixir.nix + ./fish.nix ./fsharp.nix ./gleam.nix ./go.nix diff --git a/modules/plugins/languages/fish.nix b/modules/plugins/languages/fish.nix new file mode 100644 index 00000000..08953f76 --- /dev/null +++ b/modules/plugins/languages/fish.nix @@ -0,0 +1,95 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.meta) getExe; + inherit (lib.lists) isList; + inherit (lib.types) bool either enum listOf package str; + inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.types) mkGrammarOption; + + cfg = config.vim.languages.fish; + + defaultFormat = "fish_indent"; + + formats = { + fish_indent = { + cmd = "${pkgs.fish}/bin/fish_indent"; + }; + }; +in { + options.vim.languages.fish = { + enable = mkEnableOption "Fish language support"; + + format = { + enable = mkOption { + type = bool; + default = config.vim.languages.enableFormat; + description = "Enable Fish formatting"; + }; + + type = mkOption { + type = enum (attrNames formats); + default = defaultFormat; + description = "Fish formatter to use"; + }; + + cmd = mkOption { + type = str; + default = formats.${cfg.format.type}.cmd; + description = "Path to fish formatter executable"; + }; + }; + + lsp = { + enable = mkEnableOption "Fish LSP support via fish-lsp" // {default = config.vim.languages.enableLSP;}; + + package = mkOption { + description = "fish-lsp package, or the command to run as a list of strings"; + type = either package (listOf str); + default = pkgs.fish-lsp; + }; + }; + + treesitter = { + enable = mkEnableOption "Fish Treesitter support" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "fish"; + }; + }; + + config = mkMerge [ + (mkIf cfg.format.enable { + vim.formatter.conform-nvim = { + enable = true; + setupOpts.formatters_by_ft.fish = [cfg.format.type]; + setupOpts.formatters.${cfg.format.type} = {command = cfg.format.cmd;}; + }; + }) + + (mkIf (cfg.enable && cfg.lsp.enable) { + vim.lsp.lspconfig.enable = true; + vim.lsp.lspconfig.sources.fish-lsp = let + cmd = + if isList cfg.lsp.package + then expToLua cfg.lsp.package + else toLuaObject ["${getExe cfg.lsp.package}" "start"]; + in '' + lspconfig.fish_lsp.setup { + capabilities = capabilities; + on_attach = default_on_attach; + cmd = ${cmd}; + } + ''; + }) + + (mkIf cfg.treesitter.enable { + vim.treesitter.enable = true; + vim.treesitter.grammars = [cfg.treesitter.package]; + }) + ]; +}