diff --git a/configuration.nix b/configuration.nix index f82feb0a3..7bcad89a7 100644 --- a/configuration.nix +++ b/configuration.nix @@ -79,6 +79,7 @@ isMaximal: { arduino.enable = false; assembly.enable = false; astro.enable = false; + beancount.enable = false; nu.enable = false; csharp.enable = false; julia.enable = false; diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 59f2fb648..72c0ae095 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -58,7 +58,7 @@ following: ```shell - (class: "nixos") cannot be imported into a module + (class: "nixos") cannot be imported into a module evaluation that expects class "darwin". ``` @@ -289,4 +289,12 @@ https://github.com/gorbit99/codewindow.nvim - Fix `vim.assistant.codecompanion-nvim` lazy loading with [blink-cmp] +[gmvar](https://github.com/gmvar): + +[beancount-language-server]: https://github.com/polarmutex/beancount-language-server +[bean-format]: https://github.com/beancount/beancount + +- Add beancount support under `vim.languages.beancount` using + [beancount-language-server] and [bean-format]. + diff --git a/modules/plugins/languages/beancount.nix b/modules/plugins/languages/beancount.nix new file mode 100644 index 000000000..d33fd5a01 --- /dev/null +++ b/modules/plugins/languages/beancount.nix @@ -0,0 +1,126 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.meta) getExe getExe'; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum package; + inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.beancount; + + defaultServers = ["beancount-language-server"]; + servers = { + beancount-language-server = { + rootmarkers = [".git"]; + filetypes = [ + "beancount" + "bean" + ]; + cmd = [ + # Wrap the language server to ensure 'bean-check' and 'bean-format' + # from 'pkgs.beancount' are in the PATH when the server runs. + (getExe ( + pkgs.symlinkJoin { + name = "beancount-language-server-wrapped"; + paths = [pkgs.beancount-language-server]; + meta.mainProgram = "beancount-language-server"; + buildInputs = [pkgs.makeBinaryWrapper]; + postBuild = '' + wrapProgram $out/bin/beancount-language-server \ + --suffix PATH : ${pkgs.beancount}/bin + # suffix add to path to allow users beancount in PATH to take precedence. + ''; + } + )) + ]; + }; + }; + + defaultFormat = "bean-format"; + formats = { + bean-format = { + package = pkgs.beancount; + }; + }; +in { + options.vim.languages.beancount = { + enable = mkEnableOption "Beancount language support"; + + treesitter = { + enable = + mkEnableOption "Beancount treesitter support" + // { + default = config.vim.languages.enableTreesitter; + }; + package = mkGrammarOption pkgs "beancount"; + }; + + lsp = { + enable = + mkEnableOption "Beancount LSP support" + // { + default = config.vim.lsp.enable; + }; + + servers = mkOption { + type = deprecatedSingleOrListOf "vim.languages.beancount.lsp.servers" (enum (attrNames servers)); + default = defaultServers; + description = "Beancount LSP server to use."; + }; + }; + + format = { + enable = + mkEnableOption "Beancount formatting" + // { + default = config.vim.languages.enableFormat; + }; + + type = mkOption { + type = enum (attrNames formats); + default = defaultFormat; + description = "Beancount formatter to use"; + }; + + package = mkOption { + type = package; + default = formats.${cfg.format.type}.package; + description = "Beancount formatter 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.servers = + mapListToAttrs (n: { + name = n; + value = servers.${n}; + }) + cfg.lsp.servers; + }) + + (mkIf cfg.format.enable { + vim.formatter.conform-nvim = { + enable = true; + setupOpts = { + formatters_by_ft.beancount = [cfg.format.type]; + formatters.${cfg.format.type} = { + command = getExe' cfg.format.package cfg.format.type; + }; + }; + }; + }) + ]); +} diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index cb105b8d0..fed5f2696 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -7,6 +7,7 @@ in { ./asm.nix ./astro.nix ./bash.nix + ./beancount.nix ./cue.nix ./dart.nix ./clang.nix