Preface

本文是neovim插件,nvim-lsp-loader的中文文档,将始终跟随最新的master发布和修改。

该插件可以帮助你为不同的项目,从.json或者.lua文件中加载定制化的的language server配置。本质上说,它是对nvim-lspconfigmason.nvim功能的抽象和封装。

如果你仍继续使用nvim-lsp-installer,那么你可以切换到这个分支,但是由于nvim-lsp-installer不会继续活跃的开发,此分支也不会添加任何新功能。

本来我也是将自己的language server配置写入到~/.config/nvim目录下。但这个文件过于巨大,不利于阅读和维护,也不利于定制化,我自己也曾尝试将其拆分为数个小文件,但是由于packer.nvimPR #192尚且处于WIP状态,导致加载拆分后的配置时,出现upvalues错误,遂放弃此方案,并尝试构建了这个可以读取DSL的插件。

插件开发的过程中受到coc.nvimnlsp-settings.nvim的启发,特此表示感谢!

功能概览

使用方法

安装和配置

我本人使用packer.nvim管理neovim的插件和配置。但是该插件理论上也支持paq.nvim或者vim-plug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
-- packer.nvim
use 'neovim/nvim-lspconfig'
use 'williamboman/mason.nvim'
use 'rcarriga/nvim-notify' -- 该依赖项是可选项

use {
'zhang-stephen/nvim-lsp-loader'
after = 'nvim-lspconfig',
config = function()
-- 默认配置如下
require('nvim-lsp-loader').setup({
---@type string | nil 默认配置文件的路径,可以为nil
default_config_path = '~/.config/nvim/languages.json',

---@type boolean 是否支持嵌套的json字段
nested_json_keys = false,

---@type boolean 是否允许自动更新language server
auto_update = false,

---@type table<string>检测项目根目录的范式
root_patterns = { '.git/' },

---@type function | nil language server被附加到buffer时的回调函数,可以为nil
on_attach = nil,

---@type function | nil 用于自定义server能力的函数,可以为nil
make_capabilities = nil,

---@type function | nil 解析server配置的回调函数
---@param name string language server的名字
---@param config table language server的配置
server_config_cb = nil,

---@type string 工作模式,必须为{'user-first', 'user-only', 'default-first', 'default-only'}其中之一
mode = 'user-first',
})
end
}

此插件应该可以支持lazy-loading,但是我尚未测试过。

生成配置

下面是一个用户定义的配置的示例。

注意: .json文件不支持注释,因此在实际配置中不要写注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
{
"languages": {
// language server服务的编程语言,无命名限制;
// 不过如果对同一种语言配置了多个server的情况下(例如在默认配置和项目配置中),语言的命名应该是唯一的
"lua": {
// language server的名字,必须可被nvim-lspconfig接受
"name": "sumneko_lua",
"managed_by": {
// 指示该server是否被mason.nvim管理
// 例如C++ server,ccls或者clangd,可以由包管理器安装,而不是mason.nvim
"mason": true
},
// 该字段将在简单处理后被直接传递给nvim-lspconfig,可以为null
// 面向nvim插件开发者的一个简单示例
// 所有服务器的完整配置可以在以下链接中找到:
// https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
"config": {
"settings": {
"Lua": {
"diagnostics": {
"globals": [
"vim", "packer_plugins"
]
},
"workspace": {
"library": [
"$VIMRUNTIME/lua",
"$VIMRUNTIME/lua/vim/lsp"
],
"maxPreload": 100000,
"preloadFileSize": 10000
},
"telemtry": {
"enable": false
},
"completion": {
"keywordSnippet": "Disable",
"callSnippet": "Disable"
},
"runtime": {
"version": "Lua 5.1"
}
}
},
// 该字段将会被lspconfig.util.pattern覆盖,可以为null
"root_dir": [
".git/",
"stylua.toml"
],
// 该字段将会被解析和覆盖
"cmd": [
// 对于命令本身(列表中的第一个元素):
// 绝对路径不会被修改;
// 如果该server由mason.nvim管理,
// - 第一个元素可以是null,空字符串或者其他任何东西,仅作占位符使用
// - 其他元素视作选项、参数,将直接传递给lspconfig
"sumneko_lua/extension/server/bin/lua-language-server"
]
}
},
// 其他的例子
"json": {
"name": "jsonls",
// 如果需要支持类似的嵌套字段,需要设置nested_json_keys = true
"managed_by.mason": true,
"config": {
"cmd": [
// 将会被正确的可执行文件路径替代
null,
"--stdio"
]
}
},
"c_cpp": {
"name": "clangd",
"managed_by": {
"mason": false
},
"config": {
"cmd": [
// 该命令将被直接传递给nvim-lspconfig,因为该server不受mason.nvim管理
// 所以应该保证此命令可以在$PATH下被找到
"clangd",
"--log=error",
"--background-index",
"--clang-tidy",
"-j=12",
"--enable-config"
],
"root_dir": [
".git/", ".clangd"
],
"single_file_support": true
}
}
}
}

配置是如何被加载的?

执行require('nvim-lsp-loader').setup()时,该插件会尝试检测项目根目录,如果找不到符合root_patterns的目录,则以当前目录作为项目根目录;随后,它会试图读取默认配置文件,和项目根目录下的.nvim/languages.json文件,并根据mode决定如何加载它们:

  • 如果设置为user-first,那么项目根目录下的配置将会覆盖默认配置;若设置为default-first则反之;
  • 如果设置为user-only,那么只加载项目根目录下的配置;若设置为default-only则反之。

然后所有的language server应该被自动配置好了。

代码贡献

该插件采用MIT许可协议,欢迎一切PR,issue或者新奇实用的点子!