From 149d68b3e815e101d113a497bee5c96452391cdb Mon Sep 17 00:00:00 2001 From: tomasguinzburg Date: Sun, 12 Jan 2025 23:33:26 +0100 Subject: [PATCH] languages/ruby: add ruby support --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 6 + modules/plugins/languages/default.nix | 1 + modules/plugins/languages/ruby.nix | 152 ++++++++++++++++++++++++++ 4 files changed, 160 insertions(+) create mode 100644 modules/plugins/languages/ruby.nix diff --git a/configuration.nix b/configuration.nix index 15f85480..2159edc8 100644 --- a/configuration.nix +++ b/configuration.nix @@ -80,6 +80,7 @@ isMaximal: { ocaml.enable = false; elixir.enable = false; haskell.enable = false; + ruby.enable = false; tailwind.enable = false; svelte.enable = false; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index cfa70cd5..d15c6842 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -57,3 +57,9 @@ [kaktu5](https://github.com/kaktu5): - Add WGSL support under `vim.languages.wgsl`. + +[tomasguinzburg](https://github.com/tomasguinzburg): + +[solargraph]: https://github.com/castwide/solargraph + +- Add Ruby support under `vim.languages.ruby` using [solargraph]. diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index bf9194f2..219e04fb 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -39,6 +39,7 @@ in { ./nu.nix ./odin.nix ./wgsl.nix + ./ruby.nix ]; options.vim.languages = { diff --git a/modules/plugins/languages/ruby.nix b/modules/plugins/languages/ruby.nix new file mode 100644 index 00000000..33f11d5d --- /dev/null +++ b/modules/plugins/languages/ruby.nix @@ -0,0 +1,152 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkEnableOption mkOption; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.nvim.types) mkGrammarOption diagnostics; + inherit (lib.types) either listOf package str enum; + inherit (lib.nvim.languages) diagnosticsToLua; + + cfg = config.vim.languages.ruby; + + defaultServer = "rubyserver"; + servers = { + rubyserver = { + package = pkgs.rubyPackages.solargraph; + lspConfig = '' + lspconfig.solargraph.setup { + capabilities = capabilities, + on_attach = attach_keymaps, + flags = { + debounce_text_changes = 150, + }, + cmd = { "${pkgs.solargraph}/bin/solargraph", "stdio" } + } + ''; + }; + }; + + # testing + + defaultFormat = "rubocop"; + formats = { + rubocop = { + package = pkgs.rubyPackages.rubocop; + nullConfig = '' + local conditional = function(fn) + local utils = require("null-ls.utils").make_conditional_utils() + return fn(utils) + end + + table.insert( + ls_sources, + null_ls.builtins.formatting.rubocop.with({ + command="${pkgs.bundler}/bin/bundle", + args = vim.list_extend( + {"exec", "rubocop", "-a" }, + null_ls.builtins.formatting.rubocop._opts.args + ), + }) + ) + ''; + }; + }; + + defaultDiagnosticsProvider = ["rubocop"]; + diagnosticsProviders = { + rubocop = { + package = pkgs.rubyPackages.rubocop; + nullConfig = pkg: '' + table.insert( + ls_sources, + null_ls.builtins.diagnostics.rubocop.with({ + command = "${lib.getExe pkg}", + }) + ) + ''; + }; + }; +in { + options.vim.languages.ruby = { + enable = mkEnableOption "Ruby language support"; + + treesitter = { + enable = mkEnableOption "Ruby treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "ruby"; + }; + + lsp = { + enable = mkEnableOption "Ruby LSP support" // {default = config.vim.languages.enableLSP;}; + + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; + description = "Ruby LSP server to use"; + }; + + package = mkOption { + type = either package (listOf str); + default = servers.${cfg.lsp.server}.package; + description = "Ruby LSP server package, or the command to run as a list of strings"; + }; + }; + + format = { + enable = mkEnableOption "Ruby formatter support" // {default = config.vim.languages.enableFormat;}; + + type = mkOption { + type = enum (attrNames formats); + default = defaultFormat; + description = "Ruby formatter to use"; + }; + + package = mkOption { + type = package; + default = formats.${cfg.format.type}.package; + description = "Ruby formatter package"; + }; + }; + + extraDiagnostics = { + enable = + mkEnableOption "Ruby extra diagnostics support" + // {default = config.vim.languages.enableExtraDiagnostics;}; + + types = diagnostics { + langDesc = "Ruby"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; + }; + + 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.ruby-lsp = servers.${cfg.lsp.server}.lspConfig; + }) + + (mkIf cfg.format.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources.ruby-format = formats.${cfg.format.type}.nullConfig; + }) + + (mkIf cfg.extraDiagnostics.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources = diagnosticsToLua { + lang = "ruby"; + config = cfg.extraDiagnostics.types; + inherit diagnosticsProviders; + }; + }) + ]); +}