diff --git a/docs/release-notes/rl-0.6.md b/docs/release-notes/rl-0.6.md index 8d74eec..de68373 100644 --- a/docs/release-notes/rl-0.6.md +++ b/docs/release-notes/rl-0.6.md @@ -25,3 +25,7 @@ Release notes for release 0.6 [donnerinoern](https://github.com/donnerinoern): - Added Gruvbox theme + +- Added marksman LSP for Markdown + +- Fixed Markdown-previewer Glow not working and added an option for changing the preview keybind diff --git a/modules/languages/markdown/config.nix b/modules/languages/markdown/config.nix index ba49fb9..7084314 100644 --- a/modules/languages/markdown/config.nix +++ b/modules/languages/markdown/config.nix @@ -4,9 +4,29 @@ lib, ... }: let - inherit (lib) nvim mkIf mkMerge; + inherit (lib) nvim mkIf mkMerge mkBinding isList; cfg = config.vim.languages.markdown; + self = import ./markdown.nix { + inherit lib config pkgs; + }; + mappings = self.options.vim.languages.markdown.glow.mappings; + servers = { + marksman = { + package = pkgs.marksman; + lspConfig = '' + lspconfig.marksman.setup{ + capabilities = capabilities; + on_attach = default_on_attach; + cmd = ${ + if isList cfg.lsp.package + then nvim.lua.expToLua cfg.lsp.package + else ''{"${cfg.lsp.package}/bin/marksman", "server"}'' + }, + } + ''; + }; + }; in { config = mkIf cfg.enable (mkMerge [ (mkIf cfg.treesitter.enable { @@ -18,13 +38,21 @@ in { (mkIf cfg.glow.enable { vim.startPlugins = ["glow-nvim"]; - vim.globals = { - "glow_binary_path" = "${pkgs.glow}/bin"; - }; + vim.maps.normal = mkMerge [ + (mkBinding cfg.glow.mappings.openPreview ":Glow" mappings.openPreview.description) + ]; - vim.configRC.glow = nvim.dag.entryAnywhere '' - autocmd FileType markdown noremap p :Glow + vim.luaConfigRC.glow = nvim.dag.entryAnywhere '' + require('glow').setup({ + glow_path = "${pkgs.glow}/bin/glow" + }); ''; }) + + (mkIf cfg.lsp.enable { + vim.lsp.lspconfig.enable = true; + + vim.lsp.lspconfig.sources.markdown-lsp = servers.${cfg.lsp.server}.lspConfig; + }) ]); } diff --git a/modules/languages/markdown/markdown.nix b/modules/languages/markdown/markdown.nix index 153eae5..7c07667 100644 --- a/modules/languages/markdown/markdown.nix +++ b/modules/languages/markdown/markdown.nix @@ -4,17 +4,40 @@ lib, ... }: let - inherit (lib) mkEnableOption mkOption types nvim; + inherit (builtins) attrNames; + inherit (lib) mkEnableOption mkMappingOption mkOption types nvim isList; cfg = config.vim.languages.markdown; + defaultServer = "marksman"; + servers = { + marksman = { + package = pkgs.marksman; + lspConfig = '' + lspconfig.marksman.setup{ + capabilities = capabilities; + on_attach = default_on_attach; + cmd = ${ + if isList cfg.lsp.package + then nvim.lua.expToLua cfg.lsp.package + else ''{"${cfg.lsp.package}/bin/marksman", "server"}'' + }, + } + ''; + }; + }; in { options.vim.languages.markdown = { enable = mkEnableOption "Markdown markup language support"; - glow.enable = mkOption { - type = types.bool; - default = true; - description = "Enable markdown preview in neovim with glow"; + glow = { + enable = mkOption { + type = types.bool; + default = true; + description = "Enable markdown preview in neovim with glow"; + }; + mappings = { + openPreview = mkMappingOption "Open preview" "p"; + }; }; treesitter = { @@ -26,5 +49,22 @@ in { mdPackage = nvim.types.mkGrammarOption pkgs "markdown"; mdInlinePackage = nvim.types.mkGrammarOption pkgs "markdown-inline"; }; + + lsp = { + enable = mkEnableOption "Enable Markdown LSP support" // {default = config.vim.languages.enableLSP;}; + + server = mkOption { + description = "Markdown LSP server to use"; + type = with types; enum (attrNames servers); + default = defaultServer; + }; + + package = mkOption { + description = "Markdown LSP server package, or the command to run as a list of strings"; + example = ''[lib.getExe pkgs.jdt-language-server " - data " " ~/.cache/jdtls/workspace "]''; + type = with types; either package (listOf str); + default = servers.${cfg.lsp.server}.package; + }; + }; }; }