Lsp

Nvim :help 页面,从 生成源代码, 使用 tree-sitter-vimdoc 解析器。


LSP 客户端/框架 LSP
Nvim 支持语言服务器协议 (LSP),这意味着它充当 LSP 服务器的客户端,并包含一个 Lua 框架 vim.lsp 用于构建增强的 LSP 工具。
LSP 通过使用语义全项目分析(不像 ctags)来促进像跳转到定义、查找引用、悬停、补全、重命名、格式化、重构等功能。

快速入门 lsp-quickstart

Nvim 提供了一个 LSP 客户端,但服务器由第三方提供。按照以下步骤来获得 LSP 功能
1. 使用你的包管理器或遵循上游安装说明来安装语言服务器。你可以在此处找到语言服务器:https://microsoft.github.io/language-server-protocol/implementors/servers/
2. 使用 vim.lsp.start() 在打开文件时启动 LSP 服务器(或连接到已有的服务器)。示例
-- Create an event handler for the FileType autocommand
vim.api.nvim_create_autocmd('FileType', {
  -- This handler will fire when the buffer's 'filetype' is "python"
  pattern = 'python',
  callback = function(args)
    vim.lsp.start({
      name = 'my-server-name',
      cmd = {'name-of-language-server-executable', '--option', 'arg1', 'arg2'},
      -- Set the "root directory" to the parent directory of the file in the
      -- current buffer (`args.buf`) that contains either a "setup.py" or a
      -- "pyproject.toml" file. Files that share a root directory will reuse
      -- the connection to the same LSP server.
      root_dir = vim.fs.root(args.buf, {'setup.py', 'pyproject.toml'}),
    })
  end,
})
3. 检查缓冲区是否已连接到服务器
:checkhealth lsp
4. (可选)配置按键映射和自动命令来使用 LSP 功能。 lsp-config
lsp-defaults
当 Nvim LSP 客户端启动时,它会启用诊断 vim.diagnostic(参见 vim.diagnostic.config() 进行自定义)。它还会设置各种默认选项,如下所示,如果 (1) 语言服务器支持该功能,并且 (2) 这些选项为空或由内置运行时 (ftplugin) 文件设置。当 LSP 客户端停止或分离时,这些选项不会被恢复。
'omnifunc' 被设置为 vim.lsp.omnifunc(),使用 i_CTRL-X_CTRL-O 来触发补全。
'tagfunc' 被设置为 vim.lsp.tagfunc()。这使得像跳转到定义、:tjump 和像 CTRL-]CTRL-W_]CTRL-W_} 这样的按键映射能够利用语言服务器。
'formatexpr' 被设置为 vim.lsp.formatexpr(),所以你可以通过 gq 来格式化行,如果语言服务器支持的话。
要选择退出,请使用 gw 而不是 gq,或在 LspAttach 上清除 'formatexpr'
K 被映射到 vim.lsp.buf.hover(),除非 'keywordprg' 被自定义或存在 K 的自定义按键映射。
grr gra grn gri i_CTRL-S 当 Nvim 启动时,会无条件地创建一些按键映射
"grn" 在 Normal 模式下被映射到 vim.lsp.buf.rename()
"gra" 在 Normal 和 Visual 模式下被映射到 vim.lsp.buf.code_action()
"grr" 在 Normal 模式下被映射到 vim.lsp.buf.references()
"gri" 在 Normal 模式下被映射到 vim.lsp.buf.implementation()
"gO" 在 Normal 模式下被映射到 vim.lsp.buf.document_symbol()
CTRL-S 在 Insert 模式下被映射到 vim.lsp.buf.signature_help()
如果不需要,这些按键映射可以通过 vim.keymap.del():unmap 在任何时候删除(另见 gr-default)。
lsp-defaults-disable
要覆盖或删除上述任何默认值,请在 LspAttach 上设置或取消设置选项
vim.api.nvim_create_autocmd('LspAttach', {
  callback = function(args)
    -- Unset 'formatexpr'
    vim.bo[args.buf].formatexpr = nil
    -- Unset 'omnifunc'
    vim.bo[args.buf].omnifunc = nil
    -- Unmap K
    vim.keymap.del('n', 'K', { buffer = args.buf })
  end,
})
lsp-config
要使用其他 LSP 功能,请在 LspAttach 上设置按键映射和其他缓冲区选项。并非所有语言服务器都提供相同的功能。使用功能检查来确保你只使用语言服务器支持的功能。示例
vim.api.nvim_create_autocmd('LspAttach', {
  callback = function(args)
    local client = vim.lsp.get_client_by_id(args.data.client_id)
    if client.supports_method('textDocument/implementation') then
      -- Create a keymap for vim.lsp.buf.implementation
    end
    if client.supports_method('textDocument/completion') then
      -- Enable auto-completion
      vim.lsp.completion.enable(true, client.id, args.buf, {autotrigger = true})
    end
    if client.supports_method('textDocument/formatting') then
      -- Format the current buffer on save
      vim.api.nvim_create_autocmd('BufWritePre', {
        buffer = args.buf,
        callback = function()
          vim.lsp.buf.format({bufnr = args.buf, id = client.id})
        end,
      })
    end
  end,
})
要了解哪些功能可用,你可以在一个启动了 LSP 客户端的缓冲区中运行以下命令
:lua =vim.lsp.get_clients()[1].server_capabilities
默认提供的全部功能列表可以在 lsp-buf 中找到。

常见问题解答 lsp-faq

问:如何强制重新加载 LSP?
答:停止所有客户端,然后重新加载缓冲区。
:lua vim.lsp.stop_client(vim.lsp.get_clients())
:edit
问:为什么补全不起作用?
答:在要使用 LSP 的缓冲区中,检查 'omnifunc' 是否被设置为 "v:lua.vim.lsp.omnifunc"::verbose set omnifunc?
一些其他插件可能会覆盖该选项。为了避免这种情况,你可以在 after-directory ftplugin 中设置该选项,例如 "after/ftplugin/python.vim"。
问:如何同步运行请求(例如在保存文件时格式化)?
答:检查该函数是否有一个 async 参数,并将其值设置为 false。例如代码格式化
" Auto-format *.rs (rust) files prior to saving them
" (async = false is the default for format)
autocmd BufWritePre *.rs lua vim.lsp.buf.format({ async = false })
lsp-vs-treesitter
问:LSP 和 Treesitter 如何比较?
答:LSP 需要一个客户端和语言服务器。语言服务器使用语义分析来理解项目级别的代码。这使语言服务器能够跨文件重命名,在外部库中查找定义等等。
Treesitter 是一个语言解析库,它为增量解析文本和处理错误提供了出色的工具。这使得它非常适合编辑器理解当前文件的内容,以用于语法高亮、简单的跳转到定义、范围分析等等。
LSP 和 Treesitter 都是用于编辑和检查代码的出色工具。

LSP API lsp-api

LSP 核心 API 在 lsp-core 中描述。这些是用于创建和管理客户端的核心函数。
vim.lsp.buf_… 函数对附加到给定缓冲区的所有 LSP 客户端执行操作。 lsp-buf
LSP 请求/响应处理程序以 Lua 函数的形式实现(参见 lsp-handler)。 lsp-method
LSP 规范定义的请求和通知被称为 "LSP 方法"。Nvim LSP 客户端在全局 vim.lsp.handlers 表中提供了默认的处理程序,你可以使用以下命令列出它们
:lua vim.print(vim.tbl_keys(vim.lsp.handlers))
它们也列在下面。请注意,处理程序依赖于服务器支持:如果你的服务器不支持,它们将不会运行。
'callHierarchy/incomingCalls'
'callHierarchy/outgoingCalls'
'textDocument/codeAction'
'textDocument/completion'
'textDocument/declaration'
'textDocument/definition'
'textDocument/diagnostic'
'textDocument/documentHighlight'
'textDocument/documentSymbol'
'textDocument/formatting'
'textDocument/hover'
'textDocument/implementation'
'textDocument/inlayHint'
'textDocument/prepareTypeHierarchy'
'textDocument/publishDiagnostics'
'textDocument/rangeFormatting'
'textDocument/rangesFormatting'
'textDocument/references'
'textDocument/rename'
'textDocument/semanticTokens/full'
'textDocument/semanticTokens/full/delta'
'textDocument/signatureHelp'
'textDocument/typeDefinition*'
'typeHierarchy/subtypes'
'typeHierarchy/supertypes'
'window/logMessage'
'window/showMessage'
'window/showDocument'
'window/showMessageRequest'
'workspace/applyEdit'
'workspace/configuration'
'workspace/executeCommand'
'workspace/inlayHint/refresh'
'workspace/symbol'
'workspace/workspaceFolders'
lsp-handler
LSP 处理程序是处理 Nvim 向服务器发出的请求的 lsp-response 的函数。(通知,与请求相反,是即发即忘:没有响应,因此不能被处理。 lsp-notification
每个响应处理程序都有以下签名
function(err, result, ctx)
参数
{err} (table|nil) 错误信息字典,或如果请求完成则为 nil
{result} (Result|Params|nil) lsp-responseresult 键,或如果请求失败则为 nil
{ctx} (table) 与处理程序关联的调用状态表,包含以下键
{method} (string) lsp-method 名称。
{client_id} (number) vim.lsp.Client 标识符。
{bufnr} (Buffer) 缓冲区句柄。
{params} (table|nil) 请求参数表。
{version} (number) 请求时的文档版本。处理程序可以将此与当前文档版本进行比较,以检查响应是否 "过时"。另见 b:changedtick
返回值
两个值 result, err,其中 err 形状类似于 RPC 错误
{ code, message, data? }
你可以使用 vim.lsp.rpc.rpc_response_error() 来创建此对象。
lsp-handler-resolution
处理程序可以通过以下方式设置(按优先级递增)
在 vim.lsp.handlers 中设置一个字段。 vim.lsp.handlers
vim.lsp.handlers 是一个全局表,它包含 lsp-method 名称到 lsp-handlers 的默认映射。
示例
vim.lsp.handlers['textDocument/publishDiagnostics'] = my_custom_diagnostics_handler
注意: 这只适用于服务器向客户端发出的请求/通知。
vim.lsp.start(){handlers} 参数。这将为特定服务器设置默认的 lsp-handler
示例
vim.lsp.start {
  ..., -- Other configuration omitted.
  handlers = {
    ['textDocument/publishDiagnostics'] = my_custom_server_definition
  },
}
注意: 这只适用于服务器向客户端发出的请求/通知。
vim.lsp.buf_request_all(){handler} 参数。这将为给定的请求设置 lsp-handler,仅此而已。
示例
vim.lsp.buf_request_all(
  0,
  'textDocument/publishDiagnostics',
  my_request_params,
  my_handler
)
vim.lsp.log_levels
日志级别在 vim.log.levels 中定义

VIM.LSP.PROTOCOL vim.lsp.protocol

模块 vim.lsp.protocol 定义了 LSP 规范规定的常量,以及用于创建与协议相关的对象的辅助函数。 https://github.com/microsoft/language-server-protocol/raw/gh-pages/_specifications/specification-3-14.md
例如 vim.lsp.protocol.ErrorCodes 允许通过编号或名称进行反向查找
vim.lsp.protocol.TextDocumentSyncKind.Full == 1
vim.lsp.protocol.TextDocumentSyncKind[1] == "Full"

LSP 高亮 lsp-highlight

引用高亮
旨在由 vim.lsp.buf.document_highlight() 使用的高亮组。
hl-LspReferenceText
用于突出显示 "文本" 引用的 LspReferenceText hl-LspReferenceRead
用于突出显示 "读取" 引用的 LspReferenceRead hl-LspReferenceWrite
用于突出显示 "写入" 引用的 LspReferenceWrite hl-LspInlayHint
用于突出显示内联提示的 LspInlayHint
lsp-codelens 功能相关的突出显示组。
hl-LspCodeLens
LspCodeLens 用于对 codelens 的虚拟文本进行颜色设置。参见 nvim_buf_set_extmark()
LspCodeLensSeparator hl-LspCodeLensSeparator
用于为两个或多个代码透镜之间的分隔符着色。
vim.lsp.handlers.signature_help() 相关的突出显示组。
hl-LspSignatureActiveParameter
LspSignatureActiveParameter 用于突出显示签名帮助中的活动参数。 请参阅 vim.lsp.handlers.signature_help()

LSP 语义高亮 lsp-semantic-highlight

如果可用,LSP 客户端使用 lsp-semantic_tokens 突出显示代码,这是 LSP 服务器提供有关源代码信息的另一种方式。 请注意,这与 treesitter 语法高亮是相辅相成的; 语义高亮不会取代语法高亮。
服务器通常会为源代码中的每个标识符提供一个令牌。 令牌将具有一个 type,例如“function”或“variable”,以及 0 个或多个 modifier,例如“readonly”或“deprecated”。 标准类型和修饰符在此处描述: https://microsoft.github.io/language-server-protocol/specification/#textDocument_semanticTokens LSP 服务器也可以使用非规范类型和修饰符。
LSP 客户端为每个令牌添加一个或多个高亮。 高亮组从令牌的类型和修饰符派生
@lsp.type.<type>.<ft> 用于类型
@lsp.mod.<mod>.<ft> 用于每个修饰符
@lsp.typemod.<type>.<mod>.<ft> 用于每个修饰符 使用 :Inspect 查看特定令牌的高亮。 使用 :hinvim_set_hl() 更改语义高亮的外观
hi @lsp.type.function guifg=Yellow        " function names are yellow
hi @lsp.type.variable.lua guifg=Green     " variables in lua are green
hi @lsp.mod.deprecated gui=strikethrough  " deprecated is crossed out
hi @lsp.typemod.function.async guifg=Blue " async functions are blue
vim.hl.priorities.semantic_tokens@lsp.type.* 高亮的优先级。 @lsp.mod.*@lsp.typemod.* 高亮分别具有高 1 和 2 的优先级。
您可以通过清除高亮组来禁用语义高亮
-- Hide semantic highlights for functions
vim.api.nvim_set_hl(0, '@lsp.type.function', {})
-- Hide all semantic highlights
for _, group in ipairs(vim.fn.getcompletion("@lsp", "highlight")) do
  vim.api.nvim_set_hl(0, group, {})
end
您可能希望将它们放在 ColorScheme 自动命令中。
使用 LspTokenUpdatevim.lsp.semantic_tokens.highlight_token() 进行更复杂的高亮。
以下是 Nvim 查询中使用的标准捕获列表,根据当前配色方案突出显示(使用 :Inspect 查看一个以查看确切的定义)
@lsp.type.class 声明或引用类类型的标识符 @lsp.type.comment 代表注释的令牌 @lsp.type.decorator 声明或引用装饰器和注释的标识符 @lsp.type.enum 声明或引用枚举类型的标识符 @lsp.type.enumMember 声明或引用枚举属性、常量或成员的标识符 @lsp.type.event 声明事件属性的标识符 @lsp.type.function 声明函数的标识符 @lsp.type.interface 声明或引用接口类型的标识符 @lsp.type.keyword 代表语言关键字的令牌 @lsp.type.macro 声明宏的标识符 @lsp.type.method 声明成员函数或方法的标识符 @lsp.type.modifier 代表修饰符的令牌 @lsp.type.namespace 声明或引用命名空间、模块或包的标识符 @lsp.type.number 代表数字字面量的令牌 @lsp.type.operator 代表运算符的令牌 @lsp.type.parameter 声明或引用函数或方法参数的标识符 @lsp.type.property 声明或引用成员属性、成员字段或成员变量的标识符 @lsp.type.regexp 代表正则表达式字面量的令牌 @lsp.type.string 代表字符串字面量的令牌 @lsp.type.struct 声明或引用结构体类型的标识符 @lsp.type.type 声明或引用上面未涵盖的类型的标识符 @lsp.type.typeParameter 声明或引用类型参数的标识符 @lsp.type.variable 声明或引用局部或全局变量的标识符
@lsp.mod.abstract 抽象类型和成员函数 @lsp.mod.async 标记为异步的函数 @lsp.mod.declaration 符号的声明 @lsp.mod.defaultLibrary 属于标准库的符号 @lsp.mod.definition 符号的定义,例如,在头文件中 @lsp.mod.deprecated 不应再使用的符号 @lsp.mod.documentation 文档中出现的符号 @lsp.mod.modification 变量引用,其中变量被赋值 @lsp.mod.readonly 只读变量和成员字段(常量) @lsp.mod.static 类成员(静态成员)

事件 lsp-events

LspAttach LspAttach
LSP 客户端附加到缓冲区后。 autocmd-pattern 是缓冲区的名称。 当从 Lua 使用时,客户端 ID 将在“data”表中传递给回调。 请参阅 lsp-config 以获取示例。
LspDetach LspDetach
在 LSP 客户端从缓冲区分离之前。 autocmd-pattern 是缓冲区的名称。 当从 Lua 使用时,客户端 ID 将在“data”表中传递给回调。 例如
vim.api.nvim_create_autocmd('LspDetach', {
  callback = function(args)
    -- Get the detaching client
    local client = vim.lsp.get_client_by_id(args.data.client_id)
    -- Remove the autocommand to format the buffer on save, if it exists
    if client.supports_method('textDocument/formatting') then
      vim.api.nvim_clear_autocmds({
        event = 'BufWritePre',
        buffer = args.buf,
      })
    end
  end,
})
LspNotify LspNotify
此事件在成功向 LSP 服务器发送每个通知后触发。
当从 Lua 使用时,client_id、LSP 方法和参数将在“data”表中发送。 例如
vim.api.nvim_create_autocmd('LspNotify', {
  callback = function(args)
    local bufnr = args.buf
    local client_id = args.data.client_id
    local method = args.data.method
    local params = args.data.params
    -- do something with the notification
    if method == 'textDocument/...' then
      update_buffer(bufnr)
    end
  end,
})
LspProgress LspProgress
收到来自服务器的进度通知时。 可以从 vim.lsp.Clientprogress 环形缓冲区轮询通知,或者使用 vim.lsp.status() 获取汇总消息。
如果服务器发送“完成进度”,则 pattern 设置为 kindbeginreportend 之一)。
当从 Lua 使用时,事件包含一个具有 client_idparams 属性的 data 表。 params 将包含服务器发送的请求参数(请参阅 lsp.ProgressParams)。
示例
autocmd LspProgress * redrawstatus
LspRequest LspRequest
对于发送到 LSP 服务器的每个请求,此事件都会针对请求状态的每个更改触发。 状态可以是 pendingcompletecancel 之一,并作为传递给回调函数的“data”表上的 {type} 发送。
它在发送初始请求时触发 ({type} == pending),以及 LSP 服务器响应时触发 ({type} == complete)。 如果使用 client.cancel_request(request_id) 请求取消,则此事件将触发,其中 {type} == cancel
当从 Lua 使用时,客户端 ID、请求 ID 和请求将在“data”表中发送。 请参阅 vim.lsp.Client 中的 {requests} 以了解有关 {request} 值的详细信息。 如果请求类型是 complete,则请求将在调用事件的回调后立即从客户端的挂起请求表中删除。 例如
vim.api.nvim_create_autocmd('LspRequest', {
  callback = function(args)
    local bufnr = args.buf
    local client_id = args.data.client_id
    local request_id = args.data.request_id
    local request = args.data.request
    if request.type == 'pending' then
      -- do something with pending requests
      track_pending(client_id, bufnr, request_id, request)
    elseif request.type == 'cancel' then
      -- do something with pending cancel requests
      track_canceling(client_id, bufnr, request_id, request)
    elseif request.type == 'complete' then
      -- do something with finished requests. this pending
      -- request entry is about to be removed since it is complete
      track_finish(client_id, bufnr, request_id, request)
    end
  end,
})
LspTokenUpdate LspTokenUpdate
当 LSP 服务器发送或更新可见的语义令牌,或者当现有令牌首次变得可见时。 autocmd-pattern 是缓冲区的名称。 当从 Lua 使用时,令牌和客户端 ID 将在“data”表中传递给回调。 令牌字段在 vim.lsp.semantic_tokens.get_at_pos() 中有记录。 例如
vim.api.nvim_create_autocmd('LspTokenUpdate', {
  callback = function(args)
    local token = args.data.token
    if token.type == 'variable' and not token.modifiers.readonly then
      vim.lsp.semantic_tokens.highlight_token(
        token, args.buf, args.data.client_id, 'MyMutableVariableHighlight'
      )
    end
  end,
})
注意:除了调用 vim.lsp.semantic_tokens.highlight_token() 之外,任何其他操作都被认为是实验性的。

Lua 模块:vim.lsp lsp-core

buf_attach_client({bufnr}, {client_id}) vim.lsp.buf_attach_client()
实现 textDocument/did… 通知,这些通知对于跟踪任何语言服务器的缓冲区是必需的。
不调用此函数,服务器将不会收到有关缓冲区更改的通知。
参数
{bufnr} (integer) 缓冲区句柄,或当前缓冲区的 0
{client_id} (integer) 客户端 ID
返回值
(boolean) 成功 如果客户端成功附加,则为 true; 否则为 false
buf_detach_client({bufnr}, {client_id}) vim.lsp.buf_detach_client()
将客户端从指定的缓冲区分离。 注意:虽然服务器收到文本文档(缓冲区)已关闭的通知,但如果它忽略此通知,它仍然可以发送通知。
参数
{bufnr} (integer) 缓冲区句柄,或当前缓冲区的 0
{client_id} (integer) 客户端 ID
buf_is_attached({bufnr}, {client_id}) vim.lsp.buf_is_attached()
检查缓冲区是否已为特定客户端附加。
参数
{bufnr} (integer) 缓冲区句柄,或当前缓冲区的 0
{client_id} (integer) 客户端 ID
buf_notify({bufnr}, {method}, {params}) vim.lsp.buf_notify()
向服务器发送通知
参数
{bufnr} (integer?) 缓冲区的编号
{method} (string) 请求方法的名称
{params} (any) 要发送到服务器的参数
返回值
(boolean) 成功 如果任何客户端返回 true,则为 true; 否则为 false
vim.lsp.buf_request_all()
buf_request_all({bufnr}, {method}, {params}, {handler}) 向附加到缓冲区的每个活动客户端发送异步请求,并使用组合结果执行 handler 回调。
参数
{bufnr} (integer) 缓冲区句柄,或当前缓冲区的 0。
{method} (string) LSP 方法名称
{params} (table|(fun(client: vim.lsp.Client, bufnr: integer): table?)?) 要发送到服务器的参数。 也可以作为返回参数表的函数传递,用于参数特定于客户端的情况。
{handler} (function) 所有请求完成后调用的处理程序。 服务器结果作为 client_id:result 映射传递。
返回值
(function) 取消 取消所有请求的函数。
vim.lsp.buf_request_sync()
buf_request_sync({bufnr}, {method}, {params}, {timeout_ms}) 向所有服务器发送请求,并等待所有服务器的响应。
调用 vim.lsp.buf_request_all(),但在等待结果时会阻塞 Nvim。 参数与 vim.lsp.buf_request_all() 相同,但结果不同。 最多等待 {timeout_ms}
参数
{bufnr} (integer) 缓冲区句柄,或当前缓冲区的 0。
{method} (string) LSP 方法名称
{params} (table?) 要发送到服务器的参数
{timeout_ms} (integer?, 默认值:1000) 最多等待结果的毫秒数。
返回值(多个)
(table<integer, {error: lsp.ResponseError?, result: any}>?) 结果 client_id:request_result 的映射。 (string?) err 在超时、取消或错误时,err 是一个描述失败原因的字符串,result 为 nil。
client_is_stopped({client_id}) vim.lsp.client_is_stopped()
检查客户端是否已停止。
参数
{client_id} (integer)
返回值
(boolean) 已停止 如果客户端已停止,则为 true; 否则为 false。
commands vim.lsp.commands
客户端侧命令的注册表。 这是插件处理不在核心语言服务器协议规范中的自定义命令的扩展点。
注册表是一个表,其中键是唯一的命令名称,值是如果任何 LSP 操作(代码操作、代码透镜等)触发命令,则调用的函数。
如果 LSP 响应包含此注册表中没有匹配项的命令,则该命令将通过 LSP 服务器使用 workspace/executeCommand 执行。
函数的第一个参数将是 Command: 命令标题:字符串 命令:字符串 参数?:any[]
第二个参数是 lsp-handlerctx
formatexpr({opts}) vim.lsp.formatexpr()
在内置客户端和 formatexpr 函数之间提供接口。
目前仅支持单个客户端。可以通过 `setlocal formatexpr=v:lua.vim.lsp.formatexpr()` 或(更常见)在 `on_attach` 中通过 `vim.bo[bufnr].formatexpr = 'v:lua.vim.lsp.formatexpr(#{timeout_ms:250})'` 来设置。
参数
`{opts}` ( `table?` ) 一个包含以下字段的表格
`{timeout_ms}` ( `integer` ,默认值:500ms) 格式化请求的超时时间。
vim.lsp.get_buffers_by_client_id()
get_buffers_by_client_id( `{client_id}` ) 返回与 `client_id` 关联的缓冲区列表。
参数
`{client_id}` ( `integer` ) 客户端 ID
返回值
( `integer[]` ) 缓冲区 缓冲区 ID 列表
get_client_by_id( `{client_id}` ) vim.lsp.get_client_by_id()
根据 ID 获取客户端,如果 ID 无效则返回 nil。返回的客户端可能尚未完全初始化。
参数
`{client_id}` ( `integer` ) 客户端 ID
返回值
( `vim.lsp.Client?` ) 客户端 RPC 对象
get_clients( `{filter}` ) vim.lsp.get_clients()
获取活动客户端。
参数
`{filter}` ( `table?` ) 用于过滤返回客户端的键值对。
`{id}` ( `integer` ) 仅返回具有给定 ID 的客户端
`{bufnr}` ( `integer` ) 仅返回附加到此缓冲区的客户端
`{name}` ( `string` ) 仅返回具有给定名称的客户端
`{method}` ( `string` ) 仅返回支持给定方法的客户端
返回值
( `vim.lsp.Client[]` ) vim.lsp.Client 对象列表
get_log_path() vim.lsp.get_log_path()
获取 LSP 客户端使用的日志文件路径。
返回值
( `string` ) 日志文件路径
omnifunc( `{findstart}` , `{base}` ) vim.lsp.omnifunc()
实现与 'omnifunc' 兼容的 LSP 代码补全。
参数
`{findstart}` ( `integer` ) 0 或 1,决定行为
`{base}` ( `integer` ) findstart=0,要匹配的文本
返回值
( `integer|table` ) 由 `{findstart}` 决定
findstart=0: 代码补全开始的列,或 -2 或 -3
findstart=1: 匹配列表(实际上只是调用 complete()
set_log_level( `{level}` ) vim.lsp.set_log_level()
设置 LSP 日志的全局日志级别。
按名称排列的级别:“TRACE”、“DEBUG”、“INFO”、“WARN”、“ERROR”、“OFF”
级别编号从 0 开始的“TRACE”
使用 `lsp.log_levels` 进行反向查找。
参数
`{level}` ( `integer|string` ) 不区分大小写的级别名称或编号
另请参阅
start( `{config}` , `{opts}` ) vim.lsp.start()
创建一个新的 LSP 客户端并启动语言服务器,或者如果找到与 `name` 和 `root_dir` 匹配的正在运行的客户端,则重用该客户端。将当前缓冲区附加到客户端。
示例
vim.lsp.start({
   name = 'my-server-name',
   cmd = {'name-of-language-server-executable'},
   root_dir = vim.fs.root(0, {'pyproject.toml', 'setup.py'}),
})
有关所有可用选项,请参见 vim.lsp.start_client()。最重要的是
`name` LSP 客户端的任意名称。每个语言服务器应该唯一。
`cmd` 命令字符串数组或函数,如 vim.lsp.start_client() 所述。
`root_dir` 项目根目录的路径。默认情况下,此路径用于确定是否应重用现有客户端。上面的示例使用 vim.fs.root() 通过从当前目录开始向上遍历文件系统来检测根目录,直到找到 `pyproject.toml` 或 `setup.py` 文件为止。
`workspace_folders` 指定语言服务器使用的项目根目录文件夹的 `{ uri:string, name: string }` 表格列表。如果为 `nil`,则为了方便起见,该属性将从 `root_dir` 派生。
语言服务器使用此信息来发现元数据,例如项目的依赖项,它们倾向于索引项目文件夹内的内容。
为了确保语言服务器只为它可以处理的语言启动,请确保在 FileType 自动命令中调用 vim.lsp.start()。使用 :aunvim_create_autocmd() 或将调用放在 `ftplugin/<filetype_name>.lua` 中(参见 ftplugin-name
参数
`{config}` ( `vim.lsp.ClientConfig` ) 服务器的配置。参见 vim.lsp.ClientConfig
`{opts}` ( `table?` ) 可选的关键字参数
`{reuse_client}` ( `fun(client: vim.lsp.Client, config: vim.lsp.ClientConfig): boolean` ) 用于决定是否应重用客户端的谓词。用于所有正在运行的客户端。默认实现重用客户端,如果名称和 `root_dir` 匹配。
`{bufnr}` ( `integer` ) 要附加到的缓冲区句柄(如果启动或重用客户端,则为 0 表示当前)。
`{silent}` ( `boolean` ) 如果 LSP 服务器无法启动,则禁止错误报告(默认值为 false)。
返回值
( `integer?` ) client_id
start_client( `{config}` ) vim.lsp.start_client()
使用给定的配置启动并初始化客户端。
参数
`{config}` ( `vim.lsp.ClientConfig` ) 服务器的配置。参见 vim.lsp.ClientConfig
返回值(多个)
( `integer?` ) client_id vim.lsp.get_client_by_id() 注意:客户端可能尚未完全初始化。使用 `on_init` 在客户端初始化后执行任何操作。 ( `string?` ) 错误消息(如果有)
status() vim.lsp.status()
使用所有客户端的最新进度消息,并将它们格式化为字符串。如果没有任何客户端或没有新消息,则为空
返回值
( `string` )
stop_client( `{client_id}` , `{force}` ) vim.lsp.stop_client()
停止一个或多个客户端。
您也可以对 vim.lsp.Client 对象使用 `stop()` 函数。要停止所有客户端
vim.lsp.stop_client(vim.lsp.get_clients())
默认情况下,要求服务器关闭,除非已经为该客户端请求停止,否则将尝试强制关闭。
参数
`{client_id}` ( `integer|integer[]|vim.lsp.Client[]` ) ID、ID 列表或 vim.lsp.Client 对象列表
`{force}` ( `boolean?` ) 强制关闭
tagfunc( `{pattern}` , `{flags}` ) vim.lsp.tagfunc()
提供内置客户端和 'tagfunc' 之间的接口。
当与普通模式命令(例如 CTRL-])一起使用时,这将调用 “textDocument/definition” LSP 方法来查找光标下的标签。否则,使用 “workspace/symbol”。如果任何 LSP 服务器都没有返回结果,则回退使用内置标签。
参数
`{pattern}` ( `string` ) 用于查找工作区符号的模式
`{flags}` ( `string` ) 参见 tag-function
返回值
( `table[]` ) 标签 匹配标签列表

Lua 模块:vim.lsp.client lsp-client

字段
`{id}` ( `integer` ) 分配给客户端的 ID。
`{name}` ( `string` ) 如果在创建时指定了名称,则将使用该名称。否则,它只是客户端 ID。这用于日志和消息。
`{rpc}` ( `vim.lsp.rpc.PublicClient` ) RPC 客户端对象,用于与客户端的低级交互。参见 vim.lsp.rpc.start()
`{offset_encoding}` ( `string` ) 用于与服务器通信的编码。您可以在 `config` 的 `on_init` 方法中修改此编码,然后再将文本发送到服务器。
`{handlers}` ( `table<string,lsp.Handler>` ) 客户端使用的处理程序,如 lsp-handler 中所述。
`{requests}` ( `table<integer,{ type: string, bufnr: integer, method: string}>` ) 正在进行的到服务器的挂起请求。条目是键值对,键是请求 ID,值是包含 `type`、`bufnr` 和 `method` 键值对的表格。`type` 可以是 “pending”(表示活动请求)或 “cancel”(表示取消请求)。它在执行 LspRequest 自动命令时,在接收到服务器的回复时,会短暂地变为 “complete”。
`{config}` ( `vim.lsp.ClientConfig` ) 用户传递给 vim.lsp.start_client() 的表格的副本。参见 vim.lsp.ClientConfig
`{server_capabilities}` ( `lsp.ServerCapabilities?` ) 服务器在 `initialize` 上发送的响应,描述了服务器的功能。
`{progress}` ( `vim.lsp.Client.Progress` ) 一个循环缓冲区(vim.ringbuf()),包含服务器发送的进度消息。参见 vim.lsp.Client.Progress
`{initialized}` ( `true?` )
`{workspace_folders}` ( `lsp.WorkspaceFolder[]?` ) 服务器启动时在客户端中配置的工作区文件夹。此属性仅在客户端支持工作区文件夹时才可用。如果客户端支持工作区文件夹但未配置任何文件夹,则它可以为 `null`。
`{root_dir}` ( `string?` )
`{attached_buffers}` ( `table<integer,true>` )
`{commands}` ( `table<string,fun(command: lsp.Command, ctx: table)>` ) 命令名称到函数的表格,如果任何 LSP 操作(代码操作、代码透镜等)触发了该命令,则会调用该函数。客户端命令优先于全局命令注册表。
`{settings}` ( `table` ) 包含语言服务器特定设置的映射。如果通过 `workspace/configuration` 请求,这些设置将返回给语言服务器。键区分大小写。
`{flags}` ( `table` ) 包含客户端标志的表格。当前(实验性)标志是
`{allow_incremental_sync}` ( `boolean` ,默认值:`true` ) 允许对缓冲区编辑使用增量同步
`{debounce_text_changes}` ( `integer` ,默认值:`150` ) 通过给定的毫秒数对到服务器的 `didChange` 通知进行去抖动。如果为 `nil`,则不会进行去抖动。
`{exit_timeout}` ( `integer|false` ,默认值:`false` ) 在发送 “shutdown” 请求后等待服务器干净退出之前发送 kill -15 的毫秒数。如果设置为 false,则在将 “shutdown” 请求发送到服务器后,nvim 会立即退出。
`{get_language_id}` ( `fun(bufnr: integer, filetype: string): string` )
`{capabilities}` ( `lsp.ClientCapabilities` ) 客户端(编辑器或工具)提供的功能
`{dynamic_capabilities}` ( `lsp.DynamicCapabilities` )
`{request}` ( `fun(method: string, params: table?, handler: lsp.Handler?, bufnr: integer?): boolean, integer?` ) 向服务器发送请求。这是对 `{client.rpc.request}` 的一个薄包装,它进行了一些额外的检查。如果未指定 `{handler}` 并且没有相应的全局处理程序,则会发生错误。返回值: `{status}`、 `{client_id}`。 `{status}` 是一个布尔值,表示通知是否成功。如果为 `false`,则始终为 `false`(客户端已关闭)。如果 `{status}` 为 `true`,则该函数将 `{request_id}` 作为第二个结果返回。您可以将其与 `client.cancel_request(request_id)` 一起使用以取消请求。
`{request_sync}` ( `fun(method: string, params: table?, timeout_ms: integer?, bufnr: integer): {err: lsp.ResponseError?, result:any}?, string?` ) err # 字典
`{notify}` ( `fun(method: string, params: table?): boolean` ) 向 LSP 服务器发送通知。返回值:一个布尔值,表示通知是否成功。如果为 false,则始终为 false(客户端已关闭)。
`{cancel_request}` ( `fun(id: integer): boolean` ) 取消具有给定请求 ID 的请求。返回值:与 `notify()` 相同。
{stop} (fun(force?: boolean)) 停止一个客户端,可以选择是否强制停止。默认情况下,它只会要求服务器关闭,不会强制关闭。如果你请求停止一个之前已经收到关闭请求的客户端,它会自动升级并强制关闭。
{on_attach} (fun(bufnr: integer)) 如果客户端的配置中定义了 on_attach 函数,则运行该函数。这对于缓冲区本地设置很有用。
{supports_method} (fun(method: string, opts?: {bufnr: integer?}): boolean) 检查客户端是否支持给定的方法。对于未知的非规范方法始终返回 true。{opts} 是一个可选的 {bufnr?: integer} 表格。一些语言服务器功能可能是特定于文件的。
{is_stopped} (fun(): boolean) 检查客户端是否已停止。返回:如果客户端已完全停止则为 true。
{exec_cmd} (fun(self: vim.lsp.Client, command: lsp.Command, context: {bufnr?: integer}?, handler: lsp.Handler?)) 执行一个 lsp 命令,可以通过客户端命令函数(如果可用)或通过 workspace/executeCommand(如果服务器支持)执行
字段
{pending} (table<lsp.ProgressToken,lsp.LSPAny>)
字段
{cmd} (string[]|fun(dispatchers: vim.lsp.rpc.Dispatchers): vim.lsp.rpc.PublicClient) 启动语言服务器的命令字符串数组(在 jobstart() 中的处理方式相同,必须是绝对路径或在 $PATH 中,shell 构造(如“~”)不会扩展),或者用于创建 RPC 客户端的函数。函数接收一个 dispatchers 表格,并返回一个具有成员函数 requestnotifyis_closingterminate 的表格。请参阅 vim.lsp.rpc.request()vim.lsp.rpc.notify()。对于 TCP,有一个内置的 RPC 客户端工厂:vim.lsp.rpc.connect()
{cmd_cwd} (string, 默认:cwd) 启动 cmd 进程的目录。与 root_dir 无关。
{cmd_env} (table) 传递给 LSP 进程启动时的环境标志。必须使用表格指定。非字符串值将被强制转换为字符串。示例
{ PORT = 8080; HOST = "0.0.0.0"; }
{detached} (boolean, 默认:true) 将服务器进程守护化,使其在与 Nvim 分开的进程组中运行。Nvim 将在退出时关闭进程,但是如果 Nvim 无法干净地退出,这可能会留下孤立的服务器进程。
{workspace_folders} (lsp.WorkspaceFolder[]) 传递给语言服务器的工作区文件夹列表。为了向后兼容,rootUri 和 rootPath 将从此列表中的第一个工作区文件夹派生。请参阅 LSP 规范中的 workspaceFolders
{capabilities} (lsp.ClientCapabilities) 覆盖由 vim.lsp.protocol.make_client_capabilities() 定义的默认功能的映射,在初始化时传递给语言服务器。提示:使用 make_client_capabilities() 并修改其结果。
注意:要发送空字典,请使用 vim.empty_dict(),否则它将被编码为数组。
{handlers} (table<string,function>) 语言服务器方法名称到 lsp-handler 的映射
{settings} (table) 包含语言服务器特定设置的映射。请参阅 vim.lsp.Client 中的 {settings}
{commands} (table<string,fun(command: lsp.Command, ctx: table)>) 将客户端命令的字符串映射到用户定义函数的表格。传递给 start_client 的命令优先于全局命令注册表。每个键必须是唯一的命令名称,值是一个函数,如果任何 LSP 操作(代码操作、代码透镜等)触发该命令,则调用该函数。
{init_options} (table) 在初始化请求中作为 initializationOptions 传递的值。请参阅 LSP 规范中的 initialize
{name} (string, 默认:client-id) 日志消息中的名称。
{get_language_id} (fun(bufnr: integer, filetype: string): string) 语言 ID 作为字符串。默认值为文件类型。
{offset_encoding} ('utf-8'|'utf-16'|'utf-32') LSP 服务器期望的编码。客户端不会验证其是否正确。
{on_error} (fun(code: integer, err: string)) 当客户端操作抛出错误时调用的回调。code 是一个描述错误的数字。其他参数可能会根据错误类型传递。请参阅 vim.lsp.rpc.client_errors 以获取可能的错误。使用 vim.lsp.rpc.client_errors[code] 获取人类友好的名称。
{before_init} (fun(params: lsp.InitializeParams, config: vim.lsp.ClientConfig)) 在 LSP“初始化”阶段之前调用的回调,其中 params 包含发送到服务器的参数,config 是传递给 vim.lsp.start_client() 的配置。你可以使用它在发送参数之前修改参数。
{on_init} (elem_or_list<fun(client: vim.lsp.Client, initialize_result: lsp.InitializeResult)>) 在 LSP“初始化”之后调用的回调,其中 result 是一个包含 capabilities 和服务器可能发送的任何其他内容的表格。例如,clangd 会发送 initialize_result.offsetEncoding(如果向其发送了 capabilities.offsetEncoding)。你只能在此处修改 client.offset_encoding,然后才能发送任何通知。
{on_exit} (elem_or_list<fun(code: integer, signal: integer, client_id: integer)>) 在客户端退出时调用的回调。
code: 进程的退出代码
signal: 描述用于终止的信号的数字(如果有)
client_id: 客户端句柄
{on_attach} (elem_or_list<fun(client: vim.lsp.Client, bufnr: integer)>) 当客户端附加到缓冲区时调用的回调。
{trace} ('off'|'messages'|'verbose', 默认: "off") 直接传递到初始化请求中的语言服务器。无效/空值将
`{flags}` ( `table` ) 包含客户端标志的表格。当前(实验性)标志是
`{allow_incremental_sync}` ( `boolean` ,默认值:`true` ) 允许对缓冲区编辑使用增量同步
`{debounce_text_changes}` ( `integer` ,默认值:`150` ) 通过给定的毫秒数对到服务器的 `didChange` 通知进行去抖动。如果为 `nil`,则不会进行去抖动。
`{exit_timeout}` ( `integer|false` ,默认值:`false` ) 在发送 “shutdown” 请求后等待服务器干净退出之前发送 kill -15 的毫秒数。如果设置为 false,则在将 “shutdown” 请求发送到服务器后,nvim 会立即退出。
{root_dir} (string) 语言服务器将根据其在初始化时确定 workspaceFolders、rootUri 和 rootPath 的目录。
Client:exec_cmd({command}, {context}, {handler}) Client:exec_cmd()
执行一个 lsp 命令,可以通过客户端命令函数(如果可用)或通过 workspace/executeCommand(如果服务器支持)执行
参数
{command} (lsp.Command)
{context} ({bufnr?: integer}?)
{handler} (lsp.Handler?) 仅在服务器命令时调用

Lua 模块:vim.lsp.buf lsp-buf

字段
{on_list} (fun(t: vim.lsp.LocationOpts.OnList)) 替换默认处理程序的列表处理程序。对于任何非空结果都会调用。此表格可与 setqflist()setloclist() 一起使用。例如
local function on_list(options)
  vim.fn.setqflist({}, ' ', options)
  vim.cmd.cfirst()
end
vim.lsp.buf.definition({ on_list = on_list })
vim.lsp.buf.references(nil, { on_list = on_list })
如果你更喜欢 loclist 而不是 qflist
vim.lsp.buf.definition({ loclist = true })
vim.lsp.buf.references(nil, { loclist = true })
{loclist} (boolean)
字段
{reuse_win} (boolean) 如果缓冲区已经打开,则跳转到现有窗口。
字段
{items} (table[]) 结构类似于 setqflist-what
{title} (string) 列表的标题。
{context} (table) 来自 lsp-handlerctx
字段
{silent} (boolean)
字段
{silent} (boolean)
vim.lsp.buf.add_workspace_folder()
add_workspace_folder({workspace_folder}) 将路径处的文件夹添加到工作区文件夹。如果未提供 {path},则将使用 input() 提示用户输入路径。
参数
{workspace_folder} (string?)
clear_references() vim.lsp.buf.clear_references()
从当前缓冲区中移除文档突出显示。
code_action({opts}) vim.lsp.buf.code_action()
选择当前光标位置可用的代码操作。
参数
`{opts}` ( `table?` ) 一个包含以下字段的表格
{context} (lsp.CodeActionContext) 对应于 LSP 规范中的 CodeActionContext
{diagnostics} (table) LSP Diagnostic[]。如果没有提供,则从当前位置推断。
{only} (table) 用于过滤代码操作的 LSP CodeActionKind 列表。大多数语言服务器支持诸如 refactorquickfix 之类的值。
{triggerKind} (integer) 请求代码操作的原因。
{filter} (fun(x: lsp.CodeAction|lsp.Command):boolean) 接受 CodeAction 并返回布尔值的谓词。
{apply} (boolean) 当设置为 true 且只有一个剩余操作(在过滤后)时,该操作将在没有用户查询的情况下应用。
{range} ({start: integer[], end: integer[]}) 请求代码操作的范围。如果处于可视模式,则默认为活动选择。表格必须包含具有 {row,col} 元组的 startend 键,使用标记式索引。请参阅 api-indexing
declaration({opts}) vim.lsp.buf.declaration()
跳转到光标下方的符号的声明。
注意
许多服务器没有实现此方法。一般情况下,请参阅 vim.lsp.buf.definition()
参数
{opts} (vim.lsp.LocationOpts?) 请参阅 vim.lsp.LocationOpts
definition({opts}) vim.lsp.buf.definition()
跳转到光标下方的符号的定义。
参数
{opts} (vim.lsp.LocationOpts?) 请参阅 vim.lsp.LocationOpts
document_highlight() vim.lsp.buf.document_highlight()
向服务器发送请求,以解析当前文本文档位置的文档突出显示。此请求可以通过键映射或事件(例如 CursorHold)触发,例如
autocmd CursorHold  <buffer> lua vim.lsp.buf.document_highlight()
autocmd CursorHoldI <buffer> lua vim.lsp.buf.document_highlight()
autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
注意:使用 vim.lsp.buf.document_highlight() 需要定义以下突出显示组,否则你将无法看到实际的突出显示。hl-LspReferenceText hl-LspReferenceRead hl-LspReferenceWrite
document_symbol({opts}) vim.lsp.buf.document_symbol()
在快速修复窗口中列出当前缓冲区中的所有符号。
参数
{opts} (vim.lsp.ListOpts?) 请参阅 vim.lsp.ListOpts
format({opts}) vim.lsp.buf.format()
使用已附加(并可选地过滤)的语言服务器客户端格式化缓冲区。
参数
`{opts}` ( `table?` ) 一个包含以下字段的表格
{formatting_options} (table) 可用于指定 FormattingOptions。某些未指定的选项将自动从当前 Nvim 选项派生。请参阅 https://microsoft.github.io/language-server-protocol/specification/#formattingOptions
{timeout_ms} (integer, 默认: 1000) 以毫秒为单位的格式化请求阻塞时间。如果 async=true,则无效。
{bufnr} (integer, 默认:当前缓冲区) 将格式化限制为附加到给定缓冲区的客户端。
{filter} (fun(client: vim.lsp.Client): boolean?) 用于过滤客户端的谓词。接收客户端作为参数,必须返回布尔值。与谓词匹配的客户端将被包括在内。示例
-- Never request typescript-language-server for formatting
vim.lsp.buf.format {
  filter = function(client) return client.name ~= "tsserver" end
}
{async} (boolean, 默认:false) 如果为 true,则该方法不会阻塞。在异步格式化时编辑缓冲区会导致意外更改。
{id} (integer) 将格式化限制为与该字段匹配的 ID (client.id) 的客户端。
{name} (string) 将格式化限制为与该字段匹配的名称 (client.name) 的客户端。
{range} ({start:[integer,integer],end:[integer, integer]}|{start:[integer,integer],end:[integer,integer]}[], 默认:可视模式下的当前选择,其他模式下为 nil,格式化整个缓冲区) 要格式化的范围。表格必须包含 startend 键,其中 {row,col} 元组使用 (1,0) 索引。也可以是包含 startend 键的表格列表,如上所述,在这种情况下,需要 textDocument/rangesFormatting 支持。
hover({config}) vim.lsp.buf.hover()
在浮动窗口中显示光标下符号的悬停信息。窗口将在光标移动时消失。调用该函数两次将跳转到浮动窗口(因此默认情况下,“KK”将打开悬停窗口并将其聚焦)。在浮动窗口中,所有命令和映射都按常例可用,除了“q”将关闭窗口。您可以像滚动其他缓冲区一样滚动内容。
参数
{config} (vim.lsp.buf.hover.Opts?) 请参阅 vim.lsp.buf.hover.Opts.
implementation({opts}) vim.lsp.buf.implementation()
在快速修复窗口中列出光标下符号的所有实现。
参数
{opts} (vim.lsp.LocationOpts?) 请参阅 vim.lsp.LocationOpts
incoming_calls() vim.lsp.buf.incoming_calls()
快速修复 窗口中列出光标下符号的所有调用位置。如果符号可以解析为多个项目,用户可以在 inputlist() 中选择一个。
list_workspace_folders() vim.lsp.buf.list_workspace_folders()
列出工作区文件夹。
outgoing_calls() vim.lsp.buf.outgoing_calls()
快速修复 窗口中列出光标下符号调用的所有项目。如果符号可以解析为多个项目,用户可以在 inputlist() 中选择一个。
references({context}, {opts}) vim.lsp.buf.references()
在快速修复窗口中列出对光标下符号的所有引用。
参数
{context} (table?) 请求的上下文
{opts} (vim.lsp.ListOpts?) 请参阅 vim.lsp.ListOpts
vim.lsp.buf.remove_workspace_folder()
remove_workspace_folder({workspace_folder}) 从工作区文件夹中删除路径处的文件夹。如果未提供 {path},将使用 input() 提示用户输入路径。
参数
{workspace_folder} (string?)
rename({new_name}, {opts}) vim.lsp.buf.rename()
重命名对光标下符号的所有引用。
参数
{new_name} (string?) 如果未提供,将使用 vim.ui.input() 提示用户输入新名称。
{opts} (table?) 额外的选项
{filter} (fun(client: vim.lsp.Client): boolean?) 用于过滤客户端的谓词。接收一个客户端作为参数,必须返回一个布尔值。与谓词匹配的客户端将被包含。
{name} (string) 将用于重命名的客户端限制为 client.name 与该字段匹配的客户端。
{bufnr} (integer) (默认:当前缓冲区)
signature_help({config}) vim.lsp.buf.signature_help()
在浮动窗口中显示光标下符号的签名信息。
参数
{config} (vim.lsp.buf.signature_help.Opts?) 请参阅 vim.lsp.buf.signature_help.Opts.
type_definition({opts}) vim.lsp.buf.type_definition()
跳转到光标下符号类型的定义。
参数
{opts} (vim.lsp.LocationOpts?) 请参阅 vim.lsp.LocationOpts
typehierarchy({kind}) vim.lsp.buf.typehierarchy()
快速修复 窗口中列出光标下符号的所有子类型或超类型。如果符号可以解析为多个项目,用户可以使用 vim.ui.select() 选择一个。
参数
{kind} ("subtypes"|"supertypes")
workspace_symbol({query}, {opts}) vim.lsp.buf.workspace_symbol()
在快速修复窗口中列出当前工作区中的所有符号。
列表将根据 {query} 过滤;如果从调用中省略了参数,则会提示用户在命令行中输入字符串。空字符串表示不进行过滤。
参数
{query} (string?) 可选
{opts} (vim.lsp.ListOpts?) 请参阅 vim.lsp.ListOpts

Lua 模块:vim.lsp.diagnostic lsp-diagnostic

from({diagnostics}) vim.lsp.diagnostic.from()
将输入的 vim.Diagnostic 转换为 LSP 诊断。
参数
{diagnostics} (vim.Diagnostic[])
返回值
(lsp.Diagnostic[])
vim.lsp.diagnostic.get_namespace()
get_namespace({client_id}, {is_pull}) 获取与 LSP 客户端 vim.diagnostic 关联的诊断命名空间,用于诊断
参数
{client_id} (integer) LSP 客户端的 ID
{is_pull} (boolean?) 命名空间是用于拉取还是推送客户端。默认为推送
vim.lsp.diagnostic.on_diagnostic()
on_diagnostic({_}, {result}, {ctx}) 方法 "textDocument/diagnostic" 的 lsp-handler
请参阅 vim.diagnostic.config() 以了解配置选项。
参数
{result} (lsp.DocumentDiagnosticReport)
{ctx} (lsp.HandlerContext)
vim.lsp.diagnostic.on_publish_diagnostics()
on_publish_diagnostics({_}, {result}, {ctx}) 方法 "textDocument/publishDiagnostics" 的 lsp-handler
请参阅 vim.diagnostic.config() 以了解配置选项。
参数
{result} (lsp.PublishDiagnosticsParams)
{ctx} (lsp.HandlerContext)

Lua 模块:vim.lsp.codelens lsp-codelens

clear({client_id}, {bufnr}) vim.lsp.codelens.clear()
清除透镜。
参数
{client_id} (integer?) 按 client_id 过滤。如果为 nil,则为所有客户端
{bufnr} (integer?) 按缓冲区过滤。如果为 nil,则为所有缓冲区,如果为 0,则为当前缓冲区
display({lenses}, {bufnr}, {client_id}) vim.lsp.codelens.display()
使用虚拟文本显示透镜。
参数
{lenses} (lsp.CodeLens[]?) 要显示的透镜
{bufnr} (integer)
{client_id} (integer)
get({bufnr}) vim.lsp.codelens.get()
返回给定缓冲区的所有透镜。
参数
{bufnr} (integer) 缓冲区号。0 可以用于当前缓冲区。
返回值
(lsp.CodeLens[])
on_codelens({err}, {result}, {ctx}) vim.lsp.codelens.on_codelens()
方法 textDocument/codeLenslsp-handler
参数
{err} (lsp.ResponseError?)
{result} (lsp.CodeLens[])
{ctx} (lsp.HandlerContext)
refresh({opts}) vim.lsp.codelens.refresh()
刷新透镜。
建议使用 autocmd 或通过键映射来触发此操作。
示例
autocmd BufEnter,CursorHold,InsertLeave <buffer> lua vim.lsp.codelens.refresh({ bufnr = 0 })
参数
{opts} (table?) 可选字段
{bufnr} (integer?) 按缓冲区过滤。如果为 nil,则为所有缓冲区,如果为 0,则为当前缓冲区
run() vim.lsp.codelens.run()
运行当前行中的代码透镜。
save({lenses}, {bufnr}, {client_id}) vim.lsp.codelens.save()
存储特定缓冲区和客户端的透镜。
参数
{lenses} (lsp.CodeLens[]?) 要存储的透镜
{bufnr} (integer)
{client_id} (integer)

Lua 模块:vim.lsp.completion lsp-completion

字段
{autotrigger} (boolean) 默认:false 当为真时,完成将根据服务器的 triggerCharacters 自动触发。
{convert} (fun(item: lsp.CompletionItem): table) 将 LSP CompletionItem 转换为 complete-items
vim.lsp.completion.enable()
enable({enable}, {client_id}, {bufnr}, {opts}) 在给定缓冲区中启用或禁用来自给定语言客户端的补全。
参数
{enable} (boolean) 为真则启用,为假则禁用
{client_id} (integer) 客户端 ID
{bufnr} (integer) 缓冲区句柄,或 0 表示当前缓冲区
{opts} (vim.lsp.completion.BufferOpts?) 请参阅 vim.lsp.completion.BufferOpts.
trigger() vim.lsp.completion.trigger()
在当前缓冲区中触发 LSP 补全。

Lua 模块:vim.lsp.inlay_hint lsp-inlay_hint

enable({enable}, {filter}) vim.lsp.inlay_hint.enable()
{filter}ed 范围启用或禁用内联提示。
要“切换”,请传递 is_enabled() 的反值。
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
属性
自:0.10.0
参数
{enable} (boolean?) true/nil 表示启用,false 表示禁用
{filter} (table?) 可选过滤器 kwargs,或 nil 表示所有。
{bufnr} (integer?) 缓冲区号,或 0 表示当前缓冲区,或 nil 表示所有。
get({filter}) vim.lsp.inlay_hint.get()
获取内联提示列表,(可选)按缓冲区或范围限制。
示例用法
local hint = vim.lsp.inlay_hint.get({ bufnr = 0 })[1] -- 0 for current buffer
local client = vim.lsp.get_client_by_id(hint.client_id)
local resp = client.request_sync('inlayHint/resolve', hint.inlay_hint, 100, 0)
local resolved_hint = assert(resp and resp.result, resp.err)
vim.lsp.util.apply_text_edits(resolved_hint.textEdits, 0, client.encoding)
location = resolved_hint.label[1].location
client.request('textDocument/hover', {
  textDocument = { uri = location.uri },
  position = location.range.start,
})
属性
自:0.10.0
参数
{filter} (table?) 可选过滤器 kwargs
{bufnr} (integer?)
{range} (lsp.Range?)
返回值
(table[]) 包含以下字段的对象列表
{bufnr} (integer)
{client_id} (integer)
{inlay_hint} (lsp.InlayHint)
is_enabled({filter}) vim.lsp.inlay_hint.is_enabled()
查询在 {filter}ed 范围内是否启用了内联提示。
属性
自:0.10.0
参数
{filter} (table?) 可选过滤器 kwargs,或 nil 表示所有。
{bufnr} (integer?) 缓冲区号,或 0 表示当前缓冲区,或 nil 表示所有。
返回值
(boolean)

Lua 模块:vim.lsp.semantic_tokens lsp-semantic_tokens

force_refresh({bufnr}) vim.lsp.semantic_tokens.force_refresh()
强制刷新所有语义令牌。
仅在缓冲区当前处于语义令牌突出显示的活动状态时有效 (vim.lsp.semantic_tokens.start() 已为此调用)。
参数
{bufnr} (integer?) 按缓冲区过滤。如果为 nil,则为所有缓冲区,如果为 0,则为当前缓冲区
vim.lsp.semantic_tokens.get_at_pos()
get_at_pos({bufnr}, {row}, {col}) 返回给定位置的语义令牌。如果在没有参数的情况下调用,则返回光标下的令牌。
参数
{bufnr} (integer?) 缓冲区号(0 表示当前缓冲区,默认)
{row} (integer?) 位置行(默认光标位置)
{col} (integer?) 位置列(默认光标位置)
返回值
(table?) 位置处的令牌列表。每个令牌都具有以下字段
line (integer) 行号,从 0 开始
start_col (integer) 开始列,从 0 开始
end_col (integer) 结束列,从 0 开始
type (string) 令牌类型作为字符串,例如 "variable"
modifiers (table) 令牌修饰符作为集合。例如,{ static = true, readonly = true }
client_id (integer)
vim.lsp.semantic_tokens.highlight_token()
highlight_token({token}, {bufnr}, {client_id}, {hl_group}, {opts}) 突出显示语义令牌。
为语义标记应用一个带给定突出显示组的 extmark。当适当的时候,标记将被语义标记引擎删除;例如,当 LSP 发送更新的标记时。此函数旨在在 LspTokenUpdate 回调中使用。
参数
{token} (table) 语义标记,在 LspTokenUpdate 中作为 args.data.token 找到
{bufnr} (integer) 要突出显示的缓冲区,或 0 表示当前缓冲区
{client_id} (integer) vim.lsp.Client 的 ID
{hl_group} (string) 突出显示组名称
{opts} (table?) 可选参数
{priority} (integer, 默认值:vim.hl.priorities.semantic_tokens + 3) 应用的 extmark 的优先级。
start({bufnr}, {client_id}, {opts}) vim.lsp.semantic_tokens.start()
使用给定客户端为给定缓冲区启动语义标记突出显示引擎。客户端必须已附加到缓冲区。
注意:目前,这由 vim.lsp.buf_attach_client() 自动调用。要选择退出支持语义突出显示的服务器,您可以在 LspAttach 回调或配置中的 on_attach 回调中从 {server_capabilities} 中删除 semanticTokensProvider 表。
client.server_capabilities.semanticTokensProvider = nil
参数
{bufnr} (integer) 缓冲区编号,或 0 表示当前缓冲区
{client_id} (integer) vim.lsp.Client 的 ID
`{opts}` ( `table?` ) 可选的关键字参数
debounce (integer, 默认值:200): 以毫秒为单位,将对服务器的标记请求进行去抖动。
stop({bufnr}, {client_id}) vim.lsp.semantic_tokens.stop()
停止使用给定客户端为给定缓冲区启动语义标记突出显示引擎。
注意:这是由 LspDetach 自动命令自动调用的,该自动命令是在 start() 的一部分中设置的,因此您只需要此函数来手动断开语义标记引擎,而无需完全将 LSP 客户端从缓冲区分离。
参数
{bufnr} (integer) 缓冲区编号,或 0 表示当前缓冲区
{client_id} (integer) vim.lsp.Client 的 ID

Lua 模块:vim.lsp.util lsp-util

字段
{height} (integer) 浮动窗口的高度
{width} (integer) 浮动窗口的宽度
{wrap} (boolean, 默认值:true) 换行长行
{wrap_at} (integer) 在启用换行时,计算高度时要换行的字符
{max_width} (integer) 浮动窗口的最大宽度
{max_height} (integer) 浮动窗口的最大高度
{focus_id} (string) 如果打开具有此 ID 的弹出窗口,则将其聚焦
{close_events} (table) 关闭浮动窗口的事件列表
{focusable} (boolean, 默认值:true) 使浮动窗口可聚焦。
{focus} (boolean, 默认值:true) 如果为 true,并且如果 {focusable} 也为 true,则聚焦具有相同 {focus_id} 的现有浮动窗口
{offset_x} (integer) 要添加到 col 的偏移量
{offset_y} (integer) 要添加到 row 的偏移量
{border} (string|(string|[string,string])[]) 覆盖 border
{zindex} (integer) 覆盖 zindex,默认为 50
{title} (string)
{title_pos} ('left'|'center'|'right')
{relative} ('mouse'|'cursor') (默认值:'cursor')
{anchor_bias} ('auto'|'above'|'below', 默认值:'auto') - "auto": 根据光标哪一侧有更多行来放置窗口
"above": 将窗口放置在光标上方,除非没有足够的行来显示完整的窗口高度。
"below": 将窗口放置在光标下方,除非没有足够的行来显示完整的窗口高度。
vim.lsp.util.apply_text_document_edit()
apply_text_document_edit({text_document_edit}, {index}, {offset_encoding}) 应用 TextDocumentEdit,它是一系列对单个文档的更改。
参数
{text_document_edit} (lsp.TextDocumentEdit)
{index} (integer?) 编辑的可选索引,如果来自编辑列表(或者为 nil,如果不在列表中)
{offset_encoding} ('utf-8'|'utf-16'|'utf-32'?)
vim.lsp.util.apply_text_edits()
apply_text_edits({text_edits}, {bufnr}, {offset_encoding}) 将一系列文本编辑应用于缓冲区。
参数
{text_edits} (lsp.TextEdit[])
{bufnr} (integer) 缓冲区 ID
{offset_encoding} ('utf-8'|'utf-16'|'utf-32')
vim.lsp.util.apply_workspace_edit()
apply_workspace_edit({workspace_edit}, {offset_encoding}) 应用 WorkspaceEdit
参数
{workspace_edit} (lsp.WorkspaceEdit)
{offset_encoding} ('utf-8'|'utf-16'|'utf-32') (必需)
buf_clear_references({bufnr}) vim.lsp.util.buf_clear_references()
从缓冲区中移除文档突出显示。
参数
{bufnr} (integer?) 缓冲区 ID
vim.lsp.util.buf_highlight_references()
buf_highlight_references({bufnr}, {references}, {offset_encoding}) 显示特定缓冲区的文档突出显示列表。
参数
{bufnr} (integer) 缓冲区 ID
{references} (lsp.DocumentHighlight[]) 要突出显示的对象
{offset_encoding} ('utf-8'|'utf-16'|'utf-32')
vim.lsp.util.character_offset()
character_offset({buf}, {row}, {col}, {offset_encoding}) 返回特定缓冲区中位置的 UTF-32 和 UTF-16 偏移量。
参数
{buf} (integer) 缓冲区编号(0 表示当前)
{row} (integer) 0 索引行
{col} (integer) 行中 0 索引的字节偏移量
{offset_encoding} ('utf-8'|'utf-16'|'utf-32'?) 默认为 buf 的第一个客户端的 offset_encoding
返回值
(integer) offset_encoding 索引,表示缓冲区 {buf} 中行 {row}{col} 中的字符
vim.lsp.util.convert_input_to_markdown_lines()
convert_input_to_markdown_lines({input}, {contents}) 将 MarkedString | MarkedString[] | MarkupContent 中的任何内容转换为包含有效 markdown 的行列表。对于填充 textDocument/hover 的悬停窗口、解析 textDocument/signatureHelp 的结果以及可能的其他内容很有用。
请注意,如果输入是 MarkupContent 类型并且其 kind 为 plaintext,则返回相应的值,不会进行进一步修改。
参数
{input} (lsp.MarkedString|lsp.MarkedString[]|lsp.MarkupContent)
{contents} (string[]?) 要使用转换后的行扩展的字符串列表。默认为 {}。
返回值
(string[]) 使用转换后的 markdown 行进行扩展。
vim.lsp.util.convert_signature_help_to_markdown_lines()
convert_signature_help_to_markdown_lines({signature_help}, {ft}, {triggers}) 将 textDocument/signatureHelp 响应转换为 markdown 行。
参数
{signature_help} (lsp.SignatureHelp) textDocument/SignatureHelp 的响应
{ft} (string?) 将用作标签 markdown 代码块的 lang 的文件类型
{triggers} (string[]?) 来自 lsp 服务器的触发字符列表。用于更好地确定参数偏移量
返回值(多个)
(string[]?) 转换后的 markdown 行。 (Range4?) 活动参数的突出显示范围
get_effective_tabstop({bufnr}) vim.lsp.util.get_effective_tabstop()
返回缩进大小。
参数
{bufnr} (integer?) 缓冲区句柄,默认为当前缓冲区
返回值
(integer) 缩进大小
另请参阅
vim.lsp.util.locations_to_items()
locations_to_items({locations}, {offset_encoding}) 返回具有正确计算的字节位置且按排序顺序排列的项,以便在快速修复和位置列表中显示。
每个生成的项的 user_data 字段将包含它计算所基于的原始 LocationLocationLink
结果可以传递给 setqflist()setloclist(){list} 参数。
参数
{locations} (lsp.Location[]|lsp.LocationLink[])
{offset_encoding} ('utf-8'|'utf-16'|'utf-32'?) 默认为缓冲区的第一个客户端
返回值
(vim.quickfix.entry[]) 请参阅 setqflist() 以了解格式
vim.lsp.util.make_floating_popup_options()
make_floating_popup_options({width}, {height}, {opts}) 创建一个包含浮动窗口的合理默认选项的表。该表可以传递给 nvim_open_win().
参数
{width} (integer) 窗口宽度(以字符单元格为单位)
{height} (integer) 窗口高度(以字符单元格为单位)
{opts} (vim.lsp.util.open_floating_preview.Opts?) 请参阅 vim.lsp.util.open_floating_preview.Opts.
返回值
(table) 选项
vim.lsp.util.make_formatting_params()
make_formatting_params({options}) 为当前缓冲区和光标位置创建 DocumentFormattingParams 对象。
参数
{options} (lsp.FormattingOptions?) 包含有效的 FormattingOptions 条目
返回值
(lsp.DocumentFormattingParams) 对象
vim.lsp.util.make_given_range_params()
make_given_range_params({start_pos}, {end_pos}, {bufnr}, {offset_encoding}) 使用当前缓冲区中的给定范围,创建一个类似于 vim.lsp.util.make_range_params() 的对象。
参数
{start_pos} ([integer,integer]?) {row,col} 标记索引位置。默认为最后一个视觉选择的开头。
{end_pos} ([integer,integer]?) {row,col} 标记索引位置。默认为最后一个视觉选择的结尾。
{bufnr} (integer?) 缓冲区句柄或 0 表示当前缓冲区,默认为当前缓冲区
{offset_encoding} ('utf-8'|'utf-16'|'utf-32'?) 默认为 bufnr 的第一个客户端的 offset_encoding
返回值
(table) { textDocument = { uri = current_file_uri }, range = { start = start_position, end = end_position } }
vim.lsp.util.make_position_params()
make_position_params({window}, {offset_encoding}) 为当前缓冲区和光标位置创建 TextDocumentPositionParams 对象。
参数
{window} (integer?) 窗口句柄或 0 表示当前窗口,默认为当前窗口
{offset_encoding} ('utf-8'|'utf-16'|'utf-32'?) 默认为 window 的缓冲区的第一个客户端的 offset_encoding
返回值
(lsp.TextDocumentPositionParams)
vim.lsp.util.make_range_params()
make_range_params({window}, {offset_encoding}) 使用当前缓冲区中的当前位置,创建一个可以作为构建块用于多个 LSP 请求的对象,例如 textDocument/codeActiontextDocument/colorPresentationtextDocument/rangeFormatting
参数
{window} (integer?) 窗口句柄或 0 表示当前窗口,默认为当前窗口
{offset_encoding} ("utf-8"|"utf-16"|"utf-32"?) 默认为 window 的缓冲区的第一个客户端的 offset_encoding
返回值
(table) { textDocument = { uri = current_file_uri }, range = { start = current_position, end = current_position } }
vim.lsp.util.make_text_document_params()
make_text_document_params({bufnr}) 为当前缓冲区创建一个 TextDocumentIdentifier 对象。
参数
{bufnr} (integer?) 缓冲区句柄,默认为当前缓冲区
返回值
(lsp.TextDocumentIdentifier)
vim.lsp.util.make_workspace_params()
make_workspace_params({added}, {removed}) 创建工作区参数。
参数
{added} (lsp.WorkspaceFolder[])
{removed} (lsp.WorkspaceFolder[])
返回值
(lsp.WorkspaceFoldersChangeEvent)
vim.lsp.util.open_floating_preview()
open_floating_preview({contents}, {syntax}, {opts}) 在浮动窗口中显示内容。
参数
{contents} (table) 要在窗口中显示的行
{syntax} (string) 为打开的缓冲区设置的语法
{opts} (vim.lsp.util.open_floating_preview.Opts?) 带有可选字段(额外的键将在传递给 nvim_open_win() 之前使用 vim.lsp.util.make_floating_popup_options() 进行过滤)。参见 vim.lsp.util.open_floating_preview.Opts
返回值(多个)
(integer) 新创建的浮动窗口的 bufnr (integer) 新创建的浮动窗口预览窗口的 winid
preview_location({location}, {opts}) vim.lsp.util.preview_location()
在浮动窗口中预览位置。
行为取决于位置类型。
对于 Location,显示范围(例如,函数定义)。
对于 LocationLink,显示 targetRange(例如,函数定义的主体)。
参数
{location} (lsp.Location|lsp.LocationLink)
{opts} (vim.lsp.util.open_floating_preview.Opts?) 请参阅 vim.lsp.util.open_floating_preview.Opts.
返回值(多个)
(integer?) 浮动窗口的缓冲区 ID (integer?) 浮动窗口的窗口 ID
rename({old_fname}, {new_fname}, {opts}) vim.lsp.util.rename()
将 old_fname 重命名为 new_fname。
现有的缓冲区也会被重命名,同时保持其 bufnr。
仅当以下情况时,它才会删除与重命名后的文件名冲突的现有缓冲区:
opts 请求覆盖;或者
冲突的缓冲区未加载,因此删除它们不会导致数据丢失。
参数
{old_fname} (string)
{new_fname} (string)
{opts} (table?) 选项
{overwrite} (boolean)
{ignoreIfExists} (boolean)
vim.lsp.util.show_document()
show_document({location}, {offset_encoding}, {opts}) 显示文档,并可选地跳转到位置。
参数
{location} (lsp.Location|lsp.LocationLink)
{offset_encoding} ('utf-8'|'utf-16'|'utf-32'?)
`{opts}` ( `table?` ) 一个包含以下字段的表格
{reuse_win} (boolean) 如果缓冲区已经打开,则跳转到现有窗口。
{focus} (boolean) 是否在可能的情况下将焦点/跳转到位置。 (默认:true)
返回值
(boolean) true 如果成功
vim.lsp.util.stylize_markdown()
stylize_markdown({bufnr}, {contents}, {opts}) 通过剥离代码块并将它们转换为突出显示的代码,将 Markdown 转换为语法突出显示的区域。 默认情况下,这将在这些代码块区域之后插入一个空行分隔符以提高可读性。
此方法配置给定的缓冲区并返回要设置的行。
如果您想使用漂亮的 Markdown 打开弹出窗口,请使用 open_floating_preview
参数
{bufnr} (integer)
{contents} (string[]) 要在窗口中显示的行
{opts} (table?) 带有可选字段
浮动窗口的高度
浮动窗口的宽度
用于计算高度的换行符
浮动窗口的最大宽度
浮动窗口的最大高度
在代码块之后插入分隔符
返回值
(table) 剥离的内容
symbols_to_items({symbols}, {bufnr}) vim.lsp.util.symbols_to_items()
将符号转换为 quickfix 列表项。
参数
{symbols} (lsp.DocumentSymbol[]|lsp.SymbolInformation[])
{bufnr} (integer?)
返回值
(vim.quickfix.entry[]) 请参阅 setqflist() 以了解格式

Lua 模块:vim.lsp.log lsp-log

get_filename() vim.lsp.log.get_filename()
返回日志文件名。
返回值
(string) 日志文件名
get_level() vim.lsp.log.get_level()
获取当前日志级别。
返回值
(integer) 当前日志级别
set_format_func({handle}) vim.lsp.log.set_format_func()
设置用于格式化日志的格式化函数。
参数
{handle} (function) 要应用于日志记录参数的函数,传递 vim.inspect 以进行多行格式化
set_level({level}) vim.lsp.log.set_level()
设置当前日志级别。
参数
{level} (string|integer) vim.lsp.log.levels 中的一个
should_log({level}) vim.lsp.log.should_log()
检查级别是否足以进行日志记录。
参数
{level} (integer) 日志级别
返回值
(bool) 如果会记录,则为 true,否则为 false

Lua 模块:vim.lsp.rpc lsp-rpc

字段
{request} (fun(method: string, params: table?, callback: fun(err: lsp.ResponseError?, result: any), notify_reply_callback: fun(message_id: integer)?):boolean,integer?) 参见 vim.lsp.rpc.request()
{notify} (fun(method: string, params: any):boolean) 参见 vim.lsp.rpc.notify()
{is_closing} (fun(): boolean)
{terminate} (fun())
connect({host_or_path}, {port}) vim.lsp.rpc.connect()
创建一个 LSP RPC 客户端工厂,它连接到以下任一:
命名管道 (windows)
域套接字 (unix)
通过 TCP 的主机和端口
返回一个函数,该函数可以传递给 vim.lsp.start_client()vim.lsp.start()cmd 字段。
参数
{host_or_path} (string) 要连接到的主机或管道/域套接字的路径
{port} (integer?) 要连接到的 TCP 端口。 如果不存在,第一个参数必须是管道
返回值
(fun(dispatchers: vim.lsp.rpc.Dispatchers): vim.lsp.rpc.PublicClient)
format_rpc_error({err}) vim.lsp.rpc.format_rpc_error()
从 LSP 错误对象构造错误消息。
参数
{err} (table) 错误对象
返回值
(string) error_message 格式化的错误消息
notify({method}, {params}) vim.lsp.rpc.notify()
向 LSP 服务器发送通知。
参数
{method} (string) 调用的 LSP 方法
{params} (table?) 调用 LSP 方法的参数
返回值
(boolean) true 如果通知可以发送,false 如果不能
vim.lsp.rpc.request()
request({method}, {params}, {callback}, {notify_reply_callback}) 向 LSP 服务器发送请求,并在响应时运行 {callback}
参数
{method} (string) 调用的 LSP 方法
{params} (table?) 调用 LSP 方法的参数
{callback} (fun(err: lsp.ResponseError?, result: any)) 要调用的回调
{notify_reply_callback} (fun(message_id: integer)?) 在请求不再挂起时要调用的回调
返回值(多个)
(boolean) success true 如果请求可以发送,false 如果不能 (integer?) 如果请求可以发送,则为 message_id,否则为 nil
vim.lsp.rpc.rpc_response_error()
rpc_response_error({code}, {message}, {data}) 创建一个 RPC 响应表 error,以便将其发送到 LSP 响应。
参数
{code} (integer) 定义的 RPC 错误代码,参见 vim.lsp.protocol.ErrorCodes
{message} (string?) 要发送到服务器的任意消息
{data} (any?) 要发送到服务器的任意数据
返回值
(lsp.ResponseError)
另请参阅
lsp.ErrorCodes 参见 vim.lsp.protocol.ErrorCodes
start({cmd}, {dispatchers}, {extra_spawn_params}) vim.lsp.rpc.start() 启动一个 LSP 服务器进程,并创建一个 LSP RPC 客户端对象来与它交互。 与生成的进程的通信通过 stdio 进行。 对于通过 TCP 进行的通信,请手动生成一个进程并使用 vim.lsp.rpc.connect()
参数
{cmd} (string[]) 启动 LSP 服务器的命令。
{dispatchers} (table?) 用于 LSP 消息类型的调度程序。
{notification} (fun(method: string, params: table))
{server_request} (fun(method: string, params: table): any?, lsp.ResponseError?)
{on_exit} (fun(code: integer, signal: integer))
{on_error} (fun(code: integer, err: any))
{extra_spawn_params} (table?) LSP 服务器进程的额外上下文。
{cwd} (string) LSP 服务器进程的工作目录
{detached} (boolean) 将 LSP 服务器进程与当前进程分离
{env} (table<string,string>) LSP 服务器进程的额外环境变量。 参见 vim.system()
返回值
(vim.lsp.rpc.PublicClient) 客户端 RPC 对象,具有以下方法
is_closing() 返回一个布尔值,指示 RPC 是否正在关闭。
terminate() 终止 RPC 客户端。 参见 vim.lsp.rpc.PublicClient

Lua 模块:vim.lsp.protocol lsp-protocol

vim.lsp.protocol.make_client_capabilities()
make_client_capabilities() 获取一个新的 ClientCapabilities 对象,该对象描述了 LSP 客户端的功能。
返回值
(lsp.ClientCapabilities)
方法 vim.lsp.protocol.Methods
LSP 方法名称。
vim.lsp.protocol.resolve_capabilities()
resolve_capabilities({server_capabilities}) 创建一个规范化的对象,该对象描述了 LSP 服务器的功能。
参数
{server_capabilities} (table) 服务器支持的功能表
返回值
(lsp.ServerCapabilities?) 规范化的功能表
主要
命令索引
快速参考