From b38da6ffd988737bb26f66472274055274678efd Mon Sep 17 00:00:00 2001 From: gmvar Date: Thu, 21 Aug 2025 16:20:58 -0700 Subject: [PATCH] languages/beancount: init Create the `vim.languages.beancount` module using `bean-format` and `beancount-language-server`. --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 3 + modules/plugins/languages/beancount.nix | 122 ++++++++++++++++++++++++ modules/plugins/languages/default.nix | 1 + 4 files changed, 127 insertions(+) create mode 100644 modules/plugins/languages/beancount.nix diff --git a/configuration.nix b/configuration.nix index 750862af..74995b61 100644 --- a/configuration.nix +++ b/configuration.nix @@ -75,6 +75,7 @@ isMaximal: { # Language modules that are not as common. assembly.enable = false; astro.enable = false; + beancount.enable = false; nu.enable = false; csharp.enable = false; julia.enable = false; diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 83839245..63745adb 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -538,8 +538,11 @@ [gmvar](https://github.com/gmvar): [harper-ls]: https://github.com/Automattic/harper +[beancount-language-server]: https://github.com/polarmutex/beancount-language-server +[bean-format]: https://github.com/beancount/beancount - Add [harper-ls] to the `vim.lsp` module. +- Add beancount support under `vim.languages.beancount` using [beancount-language-server] and [bean-format]. [derethil](https://github.com/derethil): diff --git a/modules/plugins/languages/beancount.nix b/modules/plugins/languages/beancount.nix new file mode 100644 index 00000000..e1265357 --- /dev/null +++ b/modules/plugins/languages/beancount.nix @@ -0,0 +1,122 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.meta) getExe'; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.lists) isList; + inherit (lib.types) anything attrsOf either enum listOf package str; + inherit (lib.nvim.types) mkGrammarOption; + + cfg = config.vim.languages.beancount; + + defaultServer = "beancount-language-server"; + servers = { + beancount-language-server = { + rootmarkers = [".git"]; + filetypes = ["beancount" "bean"]; + init_options = cfg.lsp.initOptions; + cmd = + if (isList cfg.lsp.package) + then cfg.lsp.package + else [(getExe' cfg.lsp.package cfg.lsp.server)]; + }; + }; + + 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;}; + + server = mkOption { + type = enum (attrNames servers); + default = defaultServer; + description = '' + Beancount LSP server to use. + + ::: {.note} + 'beancount-language-server' requires 'bean-check' and 'bean-format'. + Both are provided by 'pkgs.beancount'. These binaries must be in + your PATH or in 'vim.extraPackages'. There are no additional checks + to verify if this requirement is met. + ::: + ''; + }; + + package = mkOption { + type = either package (listOf str); + default = pkgs.beancount-language-server; + example = literalExpression ''[lib.getExe pkgs.beancount-language-server]''; + description = "Beancount LSP package, or the command to run as a list of strings"; + }; + + initOptions = mkOption { + type = attrsOf anything; + default = {}; + example = { + journal_file = "/path/to/main.beancount"; + formatting = { + prefix_width = 30; + currency_column = 60; + number_currency_spacing = 1; + }; + }; + description = "Init options to pass to beancount-language-server"; + }; + }; + + 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.${cfg.lsp.server} = servers.${cfg.lsp.server}; + }) + + (mkIf cfg.format.enable { + vim.formatter.conform-nvim = { + enable = true; + setupOpts.formatters_by_ft.beancount = [cfg.format.type]; + setupOpts.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 fd45758f..cb2af59e 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -6,6 +6,7 @@ in { ./asm.nix ./astro.nix ./bash.nix + ./beancount.nix ./cue.nix ./dart.nix ./clang.nix