diff --git a/.editorconfig b/.editorconfig index f316f5ab..1f39b72e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,7 +13,6 @@ trim_trailing_whitespace = true indent_style = space indent_size = 2 trim_trailing_whitespace = false -max_line_length = 80 [*.{js,json,nix,yml,yaml,toml}] indent_style = space diff --git a/configuration.nix b/configuration.nix index 5487f441..7be2e5cb 100644 --- a/configuration.nix +++ b/configuration.nix @@ -72,6 +72,7 @@ isMaximal: { extensions.crates-nvim.enable = isMaximal; }; toml.enable = isMaximal; + xml.enable = isMaximal; # Language modules that are not as common. assembly.enable = false; diff --git a/docs/manual/configuring.md b/docs/manual/configuring.md index 9a1b71cf..ce455ea7 100644 --- a/docs/manual/configuring.md +++ b/docs/manual/configuring.md @@ -17,6 +17,7 @@ configuring/custom-package.md configuring/custom-plugins.md configuring/overriding-plugins.md configuring/languages.md +configuring/keybinds.md configuring/dags.md configuring/dag-entries.md configuring/autocmds.md diff --git a/docs/manual/configuring/keybinds.md b/docs/manual/configuring/keybinds.md new file mode 100644 index 00000000..401799c1 --- /dev/null +++ b/docs/manual/configuring/keybinds.md @@ -0,0 +1,38 @@ +# Custom keymaps {#ch-keymaps} + +Some plugin modules provide keymap options for your convenience. If a keymap is +not provided by such module options, you may easily register your own custom +keymaps via {option}`vim.keymaps`. + +```nix +{ + config.vim.keymaps = [ + { + key = "m"; + mode = "n"; + silent = true; + action = ":make"; + } + { + key = "l"; + mode = ["n" "x"]; + silent = true; + action = "cnext"; + } + { + key = "k"; + mode = ["n" "x"]; + + # While `lua` is `true`, `action` is expected to be + # a valid Lua expression. + lua = true; + action = '' + function() + require('foo').do_thing() + print('did thing') + end + ''; + } + ]; +} +``` diff --git a/docs/manual/configuring/languages/lsp.md b/docs/manual/configuring/languages/lsp.md index 2ddc08b5..847924aa 100644 --- a/docs/manual/configuring/languages/lsp.md +++ b/docs/manual/configuring/languages/lsp.md @@ -21,3 +21,43 @@ vim.languages.java = { }; } ``` + +## Custom LSP Servers {#ch-custom-lsp-servers} + +Neovim 0.11, in an effort to improve the out-of-the-box experience of Neovim, +has introduced a new `vim.lsp` API that can be used to register custom LSP +servers with ease. In **nvf**, this translates to the custom `vim.lsp` API that +can be used to register servers that are not present in existing language +modules. + +The {option}`vim.lsp.servers` submodule can be used to modify existing LSP +definitions OR register your own custom LSPs respectively. For example, if you'd +like to avoid having NVF pull the LSP packages you may modify the start command +to use a string, which will cause the LSP API to discover LSP servers from +{env}`PATH`. For example: + +```nix +{lib, ...}: { + vim.lsp.servers = { + # Get `basedpyright-langserver` from PATH, e.g., a dev shell. + basedpyright.cmd = lib.mkForce ["basedpyright-langserver" "--stdio"]; + + # Define a custom LSP entry using `vim.lsp.servers`: + ty = { + cmd = lib.mkDefault [(lib.getExe pkgs.ty) "server"]; + filetypes = ["python"]; + root_markers = [ + ".git" + "pyproject.toml" + "setup.cfg" + "requirements.txt" + "Pipfile" + "pyrightconfig.json" + ]; + + # If your LSP accepts custom settings. See `:help lsp-config` for more details + # on available fields. This is a freeform field. + settings.ty = { /* ... */ }; + }; +} +``` diff --git a/docs/manual/configuring/overriding-plugins.md b/docs/manual/configuring/overriding-plugins.md index 55979ce7..ad681517 100644 --- a/docs/manual/configuring/overriding-plugins.md +++ b/docs/manual/configuring/overriding-plugins.md @@ -14,11 +14,12 @@ vim.pluginOverrides = { rev = ""; hash = ""; }; + # It's also possible to use a flake input lazydev-nvim = inputs.lazydev-nvim; # Or a local path lazydev-nvim = ./lazydev; - # Or a npins pin... etc + # Or a npins pin nvfetcher source, etc. }; ``` diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index cd2247f9..476fce1b 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -132,6 +132,9 @@ - Added [sqruff](https://github.com/quarylabs/sqruff) support to `languages.sql` +- Lazy-load `crates.nvim` plugin when using + `vim.languages.rust.extensions.crates-nvim.enable` + - Added [Pyrefly](https://pyrefly.org/) and [zuban](https://zubanls.com/) support to `languages.python` @@ -152,3 +155,13 @@ - Added [Selenen](https://github.com/kampfkarren/selene) for more diagnostics in `languages.lua`. + +- Added XML syntax highlighting, LSP support and formatting + +[vagahbond](https://github.com/vagahbond): [codewindow.nvim]: +https://github.com/gorbit99/codewindow.nvim + +- Add [codewindow.nvim] plugin in `vim.assistant.codewindow` with `enable` and + `setupOpts` + + diff --git a/flake.lock b/flake.lock index 1081a12c..0a98f689 100644 --- a/flake.lock +++ b/flake.lock @@ -74,16 +74,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768875095, - "narHash": "sha256-dYP3DjiL7oIiiq3H65tGIXXIT1Waiadmv93JS0sS+8A=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ed142ab1b3a092c4d149245d0c4126a5d7ea00b0", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 4a35cf91..ba817494 100644 --- a/flake.nix +++ b/flake.nix @@ -122,7 +122,7 @@ systems.url = "github:nix-systems/default"; ## Basic Inputs - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; flake-parts = { url = "github:hercules-ci/flake-parts"; diff --git a/lib/lua.nix b/lib/lua.nix index bf879031..01c73612 100644 --- a/lib/lua.nix +++ b/lib/lua.nix @@ -49,4 +49,4 @@ in "expToLua" "listToLuaTable" "attrsetToLuaTable" - ] (name: lib.warn "${name} is deprecated use toLuaObject instead" toLuaObject) + ] (name: builtins.throw "${name} is deprecated use toLuaObject instead") diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index bdc396e6..1dad1434 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -51,6 +51,7 @@ in { ./yaml.nix ./ruby.nix ./just.nix + ./xml.nix # This is now a hard deprecation. (mkRenamedOptionModule ["vim" "languages" "enableLSP"] ["vim" "lsp" "enable"]) diff --git a/modules/plugins/languages/rust.nix b/modules/plugins/languages/rust.nix index 3c49d271..ec5a3d81 100644 --- a/modules/plugins/languages/rust.nix +++ b/modules/plugins/languages/rust.nix @@ -11,7 +11,7 @@ inherit (lib.lists) isList; inherit (lib.attrsets) attrNames; inherit (lib.types) bool package str listOf either enum int; - inherit (lib.nvim.lua) expToLua toLuaObject; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.attrsets) mapListToAttrs; inherit (lib.nvim.types) mkGrammarOption mkPluginSetupOption deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAfter entryAnywhere; @@ -169,7 +169,7 @@ in { server = { cmd = ${ if isList cfg.lsp.package - then expToLua cfg.lsp.package + then toLuaObject cfg.lsp.package else ''{"${cfg.lsp.package}/bin/rust-analyzer"}'' }, default_settings = { @@ -228,10 +228,17 @@ in { (mkIf cfg.extensions.crates-nvim.enable { vim = mkMerge [ { - startPlugins = ["crates-nvim"]; - pluginRC.rust-crates = entryAnywhere '' - require("crates").setup(${toLuaObject cfg.extensions.crates-nvim.setupOpts}) - ''; + lazy.plugins.crates-nvim = { + package = "crates-nvim"; + setupModule = "crates"; + setupOpts = cfg.extensions.crates-nvim.setupOpts; + event = [ + { + event = "BufRead"; + pattern = "Cargo.toml"; + } + ]; + }; } ]; }) diff --git a/modules/plugins/languages/xml.nix b/modules/plugins/languages/xml.nix new file mode 100644 index 00000000..351232a9 --- /dev/null +++ b/modules/plugins/languages/xml.nix @@ -0,0 +1,62 @@ +{ + config, + pkgs, + lib, + ... +}: let + inherit (builtins) attrNames; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum listOf; + inherit (lib.nvim.types) mkGrammarOption; + inherit (lib.nvim.attrsets) mapListToAttrs; + + cfg = config.vim.languages.xml; + + defaultServers = ["lemminx"]; + servers = { + lemminx = { + enable = true; + cmd = [ + (getExe pkgs.lemminx) + ]; + filetypes = ["xml"]; + root_markers = [".git"]; + }; + }; +in { + options.vim.languages.xml = { + enable = mkEnableOption "XML language support"; + + treesitter = { + enable = mkEnableOption "XML treesitter" // {default = config.vim.languages.enableTreesitter;}; + package = mkGrammarOption pkgs "xml"; + }; + + lsp = { + enable = mkEnableOption "XML LSP support" // {default = config.vim.lsp.enable;}; + servers = mkOption { + type = listOf (enum (attrNames servers)); + default = defaultServers; + description = "XML LSP server to use"; + }; + }; + }; + + 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 (name: { + inherit name; + value = servers.${name}; + }) + cfg.lsp.servers; + }) + ]); +} diff --git a/modules/plugins/minimap/codewindow/codewindow.nix b/modules/plugins/minimap/codewindow/codewindow.nix index 381e3102..9ad48c9f 100644 --- a/modules/plugins/minimap/codewindow/codewindow.nix +++ b/modules/plugins/minimap/codewindow/codewindow.nix @@ -1,6 +1,7 @@ {lib, ...}: let inherit (lib.options) mkEnableOption; inherit (lib.nvim.binds) mkMappingOption; + inherit (lib.nvim.types) mkPluginSetupOption; in { options.vim.minimap.codewindow = { enable = mkEnableOption "codewindow plugin for minimap view"; @@ -11,5 +12,7 @@ in { toggle = mkMappingOption "Toggle minimap [codewindow]" "mm"; toggleFocus = mkMappingOption "Toggle minimap focus [codewindow]" "mf"; }; + + setupOpts = mkPluginSetupOption "codewindow" {}; }; } diff --git a/modules/plugins/minimap/codewindow/config.nix b/modules/plugins/minimap/codewindow/config.nix index 8a62ee04..020eab7d 100644 --- a/modules/plugins/minimap/codewindow/config.nix +++ b/modules/plugins/minimap/codewindow/config.nix @@ -6,6 +6,7 @@ }: let inherit (lib.modules) mkIf mkMerge; inherit (lib.nvim.dag) entryAnywhere; + inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.binds) addDescriptionsToMappings mkSetLuaBinding pushDownDefault; cfg = config.vim.minimap.codewindow; @@ -32,9 +33,7 @@ in { pluginRC.codewindow = entryAnywhere '' local codewindow = require('codewindow') - codewindow.setup({ - exclude_filetypes = { 'NvimTree', 'orgagenda', 'Alpha'}, - }) + codewindow.setup(${toLuaObject cfg.setupOpts}) ''; }; };