You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 03:45:47