如何让Neovim中的csharp-ls语言服务器识别项目根目录?
如何让Neovim中的csharp-ls语言服务器识别项目根目录?
看起来你遇到的问题是csharp-ls没正确定位到项目的根目录,我之前配置的时候也踩过这个坑,给你几个实用的解决思路:
核心解决方法:替换root_markers为root_dir函数
你的配置里用了root_markers,但在Neovim的LSP配置逻辑中,直接使用这个字段有时候无法触发正确的向上查找逻辑。更可靠的方式是自定义一个root_dir函数,主动帮csharp-ls定位到包含.sln或.csproj的目录。
把你原来的csharp-ls配置改成下面这样:
vim.lsp.config('csharp-ls', { cmd = { 'csharp-ls' }, filetypes = { 'cs' }, root_dir = function(fname) -- 从当前文件所在目录向上查找 .sln 或 .csproj 文件 local project_file = vim.fs.find( {'*.sln', '*.csproj'}, { upward = true, path = vim.fs.dirname(fname) } )[1] -- 如果找到项目文件,返回它所在的目录作为根目录;否则用当前工作目录 return project_file and vim.fs.dirname(project_file) or vim.fn.getcwd() end, })
为什么原来的配置不生效?
Neovim早期版本里的root_markers配置项有时候不会被csharp-ls正确解析,尤其是当服务器本身需要明确的目录路径,而不是仅仅标记文件后缀的时候。自定义root_dir函数相当于直接告诉服务器:“去找到这些项目文件,它们所在的文件夹就是根目录”,逻辑更直接可靠。
额外检查项
- 配置修改后,完全重启Neovim(不要只刷新配置),然后重新打开
Program.cs - 用
:LspInfo命令查看服务器状态,确认Root directory字段已经显示为你的项目文件夹路径 - 如果你是从子目录启动的Neovim,上面的函数也会自动向上查找项目文件,不用担心启动路径的问题
内容来源于stack exchange
相关产品推荐
相关产品推荐

