This commit is contained in:
CaueDosAnjos 2026-02-08 13:47:14 +01:00 committed by GitHub
commit 2413a87606
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 134 additions and 26 deletions

View file

@ -191,4 +191,9 @@ https://github.com/gorbit99/codewindow.nvim
- Fix non-functional `vim.keymaps.*.noremap`. Now, setting it to false is - Fix non-functional `vim.keymaps.*.noremap`. Now, setting it to false is
equivalent to `:lua vim.keymap.set(..., { remap = true })` equivalent to `:lua vim.keymap.set(..., { remap = true })`
[CaueAnjos](https://github.com/caueanjos)
- Rename `roslyn_ls` to `roslyn` (required by roslyn-nvim).
- Add razor support for `roslyn` and `csharp_ls`
<!-- vim: set textwidth=80: --> <!-- vim: set textwidth=80: -->

View file

@ -16,6 +16,36 @@
cfg = config.vim.lsp; cfg = config.vim.lsp;
# NOTE: Used to notify and redirect deprecated lsp servers
mkDeprecated = {
old,
new ? null,
message ? (
if new == null
then "${old} is deprecated."
else "${old} was renamed to ${new}. Please update it accordingly."
),
}: (
lib.warnIf
(cfg.servers.${old}
!= {})
message
{
${old}.enable = false;
}
// (mkIf (new != null) {
${new} = cfg.servers.${old};
})
);
servers =
cfg.servers
# Deprecated lsp servers
// (mkDeprecated {
old = "roslyn_ls";
new = "roslyn";
});
# TODO: lspConfigurations filter on enabledServers instead of cfg.servers? # TODO: lspConfigurations filter on enabledServers instead of cfg.servers?
lspConfigurations = lspConfigurations =
mapAttrsToList ( mapAttrsToList (
@ -23,9 +53,9 @@
vim.lsp.config["${name}"] = ${toLuaObject value} vim.lsp.config["${name}"] = ${toLuaObject value}
'' ''
) )
cfg.servers; servers;
enabledServers = filterAttrs (_: u: u.enable) cfg.servers; enabledServers = filterAttrs (_: u: u.enable) servers;
in { in {
options = { options = {
vim.lsp = { vim.lsp = {

View file

@ -24,10 +24,8 @@
in in
optionalString (key != null) "vim.keymap.set('n', '${key}', ${action}, {buffer=bufnr, noremap=true, silent=true, desc='${desc}'})"; optionalString (key != null) "vim.keymap.set('n', '${key}', ${action}, {buffer=bufnr, noremap=true, silent=true, desc='${desc}'})";
# Omnisharp doesn't have colors in popup docs for some reason, and I've also # NOTE: roslyn is the most feature-rich option, and its Razor integration is better than csharp-ls (which only supports .cshtml).
# seen mentions of it being way slower, so until someone finds missing defaultServers = ["roslyn"];
# functionality, this will be the default.
defaultServers = ["csharp_ls"];
servers = { servers = {
omnisharp = { omnisharp = {
cmd = mkLuaInline '' cmd = mkLuaInline ''
@ -118,8 +116,8 @@
}; };
csharp_ls = { csharp_ls = {
cmd = [(lib.getExe pkgs.csharp-ls)]; cmd = [(lib.getExe pkgs.csharp-ls) "--features" "razor-support"];
filetypes = ["cs"]; filetypes = ["cs" "razor"];
root_dir = mkLuaInline '' root_dir = mkLuaInline ''
function(bufnr, on_dir) function(bufnr, on_dir)
local function find_root_pattern(fname, lua_pattern) local function find_root_pattern(fname, lua_pattern)
@ -137,17 +135,28 @@
}; };
}; };
roslyn_ls = { roslyn = let
pkg = pkgs.vscode-extensions.ms-dotnettools.csharp;
pluginRoot = "${pkg}/share/vscode/extensions/ms-dotnettools.csharp";
exe = "${pluginRoot}/.roslyn/Microsoft.CodeAnalysis.LanguageServer";
razorSourceGenerator = "${pluginRoot}/.razorExtension/Microsoft.CodeAnalysis.LanguageServer";
razorDesignTimePath = "${pluginRoot}/.razorExtension/Targets/Microsoft.NET.Sdk.Razor.DesignTime.targets";
razorExtension = "${pluginRoot}/.razorExtension/Microsoft.VisualStudioCode.RazorExtension.dll";
in {
cmd = mkLuaInline '' cmd = mkLuaInline ''
{ {
${toLuaObject (getExe pkgs.roslyn-ls)}, "dotnet",
'--logLevel=Warning', "${exe}.dll",
'--extensionLogDirectory=' .. vim.fs.dirname(vim.lsp.get_log_path()), "--stdio",
'--stdio', "--logLevel=Information",
"--extensionLogDirectory=" .. vim.fs.dirname(vim.lsp.get_log_path()),
"--razorSourceGenerator=${razorSourceGenerator}",
"--razorDesignTimePath=${razorDesignTimePath}",
"--extension=${razorExtension}",
} }
''; '';
filetypes = ["cs"]; filetypes = ["cs" "razor"];
root_dir = mkLuaInline '' root_dir = mkLuaInline ''
function(bufnr, on_dir) function(bufnr, on_dir)
local function find_root_pattern(fname, lua_pattern) local function find_root_pattern(fname, lua_pattern)
@ -167,22 +176,58 @@
extraServerPlugins = { extraServerPlugins = {
omnisharp = ["omnisharp-extended-lsp-nvim"]; omnisharp = ["omnisharp-extended-lsp-nvim"];
csharp_ls = ["csharpls-extended-lsp-nvim"]; csharp_ls = ["csharpls-extended-lsp-nvim"];
roslyn_ls = []; roslyn = ["roslyn-nvim"];
}; };
cfg = config.vim.languages.csharp; cfg = config.vim.languages.csharp;
in { in {
options = { options = {
vim.languages.csharp = { vim.languages.csharp = {
enable = mkEnableOption "C# language support"; enable = mkEnableOption ''
C# language support.
::: {.note}
This feature will not work if the .NET SDK is not installed.
Both `roslyn` and `csharp_ls` require the .NET SDK 10 to work properly with Razor.
Using the most recent SDK version is strongly recommended.
:::
:::{.tip}
There is a way to avoid always specifying _dotnet-sdk_10_ inside devshells, even when a project targets _dotnet-sdk_8_. You can achieve this by adding the following **Lua** configuration to your **NVF** setup (for example, via `luaConfigRC`):
```lua
vim.lsp.config('roslyn', {
cmd = vim.list_extend(
{ "$${pkgs.lib.getExe (with pkgs.dotnetCorePackages;
combinePackages [
sdk_10_0
sdk_9_0
sdk_8_0
])}" },
vim.list_slice(vim.lsp.config.roslyn.cmd, 2)
)
})
```
This configuration overrides only the first argument of the Roslyn LSP command (the `dotnet` executable), replacing it with a `dotnet` binary built from a combined package that includes SDK versions 10, 9, and 8. Additional SDK versions can be added if needed.
This approach is not a perfect solution. You may encounter issues if your project requires a specific patch version (for example, `8.0.433`) but the combined package only provides an earlier version (such as `8.0.300`). While this usually does not cause major problems, it is something to be aware of when using this setup.
:::
::: {.warning}
At the moment, only `roslyn` provides full Razor support.
`csharp_ls` is limited to `.cshtml` files.
:::
'';
treesitter = { treesitter = {
enable = mkEnableOption "C# treesitter" // {default = config.vim.languages.enableTreesitter;}; enable = mkEnableOption "C# treesitter" // {default = config.vim.languages.enableTreesitter;};
package = mkGrammarOption pkgs "c_sharp"; csPackage = mkGrammarOption pkgs "c_sharp";
razorPackage = mkGrammarOption pkgs "razor";
}; };
lsp = { lsp = {
enable = mkEnableOption "C# LSP support" // {default = config.vim.lsp.enable;}; enable =
mkEnableOption "C# language support" // {default = config.vim.lsp.enable;};
servers = mkOption { servers = mkOption {
description = "C# LSP server to use"; description = "C# LSP server to use";
type = deprecatedSingleOrListOf "vim.language.csharp.lsp.servers" (enum (attrNames servers)); type = deprecatedSingleOrListOf "vim.language.csharp.lsp.servers" (enum (attrNames servers));
@ -195,17 +240,32 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
(mkIf cfg.treesitter.enable { (mkIf cfg.treesitter.enable {
vim.treesitter.enable = true; vim.treesitter.enable = true;
vim.treesitter.grammars = [cfg.treesitter.package]; vim.treesitter.grammars = with cfg.treesitter; [csPackage razorPackage];
}) })
(mkIf cfg.lsp.enable { (mkIf cfg.lsp.enable {
vim.startPlugins = concatMap (server: extraServerPlugins.${server}) cfg.lsp.servers; vim = {
vim.lsp.servers = startPlugins = concatMap (server: extraServerPlugins.${server}) cfg.lsp.servers;
luaConfigRC.razorFileTypes =
/*
lua
*/
''
-- Set unkown file types!
vim.filetype.add {
extension = {
razor = "razor",
cshtml = "razor",
},
}
'';
lsp.servers =
mapListToAttrs (name: { mapListToAttrs (name: {
inherit name; inherit name;
value = servers.${name}; value = servers.${name};
}) })
cfg.lsp.servers; cfg.lsp.servers;
};
}) })
]); ]);
} }

View file

@ -2389,6 +2389,19 @@
"url": "https://github.com/rose-pine/neovim/archive/72a04c4065345b51b56aed4859ea1d884f734097.tar.gz", "url": "https://github.com/rose-pine/neovim/archive/72a04c4065345b51b56aed4859ea1d884f734097.tar.gz",
"hash": "sha256-CAPZaKFR/WcLW/NW9FNG3jJDnNgzLuwJP+I43ppzkpA=" "hash": "sha256-CAPZaKFR/WcLW/NW9FNG3jJDnNgzLuwJP+I43ppzkpA="
}, },
"roslyn-nvim": {
"type": "Git",
"repository": {
"type": "GitHub",
"owner": "seblyng",
"repo": "roslyn.nvim"
},
"branch": "main",
"submodules": false,
"revision": "24f7c91ee5e09c63104deaab68f932620f25c24a",
"url": "https://github.com/seblyng/roslyn.nvim/archive/24f7c91ee5e09c63104deaab68f932620f25c24a.tar.gz",
"hash": "sha256-a/Slmkrz/4P/rfRhPa1W5kGV7joQNTN0Un7bbncCnk0="
},
"rtp-nvim": { "rtp-nvim": {
"type": "Git", "type": "Git",
"repository": { "repository": {