NVIM中如何通过缓冲区编号bufnr获取对应buffer对象
说明
你记忆里「传入bufnr返回带内置方法的buffer实例」的函数不是Neovim核心API。Neovim原生所有缓冲区、窗口相关操作都是函数式设计,以数字类型的缓冲区编号bufnr作为核心入参,不存在挂载了lsp.formatting()这类实例方法的buffer对象,你之前见到的写法基本都是第三方插件做的面向对象封装,所以在官方文档检索相关关键词找不到对应接口。
正确实现方案
你需要的「对指定bufnr对应的缓冲区执行LSP格式化」逻辑,直接调用原生LSP API传入bufnr参数即可,不需要提前获取所谓的buffer实例:
官方原生写法(兼容Neovim 0.8及以上所有稳定版本)
function(client, bufnr) vim.lsp.buf.format({ bufnr = bufnr, -- 可选配置:如果需要指定仅用当前传入的LSP客户端执行格式化,加上这个过滤规则 filter = function(active_client) return active_client.id == client.id end }) end
注意:Neovim 0.8以前的旧版本使用的
vim.lsp.buf.formatting()接口已经废弃,全版本统一用vim.lsp.buf.format即可。调用时如果不传bufnr参数,默认会对当前光标所在的活动缓冲区执行格式化,操作指定缓冲区必须显式传入对应bufnr。
面向对象风格封装(匹配你写的调用逻辑)
如果你偏好实例调用的写法,可以自己做一层简单封装,实现你预期的nvim_get_buffer效果:
local function nvim_get_buffer(bufnr) local buf_proxy = { bufnr = bufnr } setmetatable(buf_proxy, { __index = function(_, key) if key == "lsp" then return { formatting = function(opts) local format_opts = vim.tbl_extend("force", { bufnr = bufnr }, opts or {}) vim.lsp.buf.format(format_opts) end } end -- 其他需要的buffer方法可以按照这个逻辑自行扩展 end }) return buf_proxy end -- 封装后就可以完全匹配你写的调用逻辑 function(client, bufnr) local buffer = nvim_get_buffer(bufnr) buffer.lsp.formatting() end
内容的提问来源于stack exchange,提问作者Twiggeh
相关产品推荐
相关产品推荐

