sidekick.nvim

GitHub
2.5k 109 较难 1 次阅读 今天Apache-2.0语言模型插件
AI 解读 由 AI 自动生成,仅供参考

sidekick.nvim 是专为 Neovim 打造的 AI 编程助手,旨在让开发者在不离开编辑器的情况下,高效利用人工智能提升编码体验。它主要解决了传统 AI 插件功能单一、上下文切换频繁以及代码建议不够直观的问题。

该工具的核心亮点在于深度集成了 GitHub Copilot LSP 的“下一步编辑建议”(NES)功能。与普通行内补全不同,NES 能主动提供跨越多行的重构方案或大范围代码修改,并通过基于 Treesitter 的高亮差分视图,让用户逐块预览和确认变更。此外,sidekick.nvim 内置了智能终端,支持直接调用 Claude、Gemini、Codex 等主流 AI 命令行工具。它能自动感知当前文件内容、光标位置及错误信息作为上下文,并预设了丰富的提示词库,方便用户快速执行代码解释、故障修复或测试生成等任务。

sidekick.nvim 特别适合习惯使用 Neovim 的软件开发者和技术研究人员。如果你希望将 AI 的大局观建议与灵活的命令行交互无缝融入日常编码流,同时保持对代码变更的完全掌控,这款插件将极大优化你的工作流。其高度可配置的架构也允许高级用户根据需求定制界面与功能,打造个性化的智能开发环境。

使用场景

资深后端工程师正在重构一个遗留的 Python 微服务模块,需要批量优化异步逻辑并修复潜在的竞态条件。

没有 sidekick.nvim 时

  • 上下文频繁切换:为了获取大段重构建议,必须离开编辑器打开浏览器或独立终端与 AI 对话,复制粘贴代码不仅打断心流,还容易出错。
  • 审查效率低下:面对 AI 返回的大段代码差异,缺乏精细化的逐词高亮和分块导航,只能肉眼逐行比对,极易遗漏细微的逻辑变更。
  • 手动应用繁琐:将 AI 生成的多行修改应用到现有文件中时,需手动定位、删除旧代码并粘贴新内容,操作过程机械且耗时。
  • 状态感知缺失:无法在编辑器状态栏直观看到 Copilot LSP 的请求进度或建议就绪状态,常常需要盲目等待或反复检查。

使用 sidekick.nvim 后

  • 沉浸式智能协作:暂停打字即可自动触发“下一步编辑建议(NES)”,直接在编辑器内通过 <Tab> 键预览并应用整块重构方案,无需切换窗口。
  • 精细化差异审查:利用基于 Treesitter 的词级差异高亮和分块(Hunk)导航功能,可以逐个审查变更细节,确保每一处逻辑修改都符合预期。
  • 一键安全应用:支持逐块跳转审查确认,确认无误后一键应用所有更改,将原本繁琐的手动合并过程简化为流畅的键盘操作。
  • 实时状态反馈:状态栏实时显示 Copilot 建议的生成进度和预览文本,让开发者对 AI 辅助状态一目了然,掌控感更强。

sidekick.nvim 通过将强大的 AI 建议与精细的代码审查流程无缝融入 Neovim,让开发者在不中断思维流的情况下高效完成复杂重构。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明

内存

未说明

依赖
notes该工具是 Neovim 插件,核心依赖是 GitHub Copilot LSP 服务器。AI CLI 功能支持 Claude、Gemini、Grok、Codex 等外部工具,需用户自行安装这些 CLI 工具。在类 Unix 系统上建议安装 lsof 和 ps 以检测运行中的 AI CLI 会话。配置 Copilot LSP 时必须使用 vim.lsp.enable 启用。
python未说明
Neovim >= 0.11.2
copilot-language-server
snacks.nvim (可选)
nvim-treesitter-textobjects (可选,需 main 分支)
lsof (Unix-like 系统推荐)
ps (Unix-like 系统推荐)
tmux 或 zellij (用于会话持久化,可选)
sidekick.nvim hero image

快速开始

🤖 sidekick.nvim

sidekick.nvim 是你的 Neovim AI 小助手,它将 Copilot LSP 的“下一次编辑建议”与内置终端集成,适用于任何 AI 命令行工具。你可以在不离开编辑器的情况下,审查并应用差异、与 AI 助手对话,从而简化编码流程。

image

✨ 功能

  • 🤖 由 Copilot LSP 提供支持的下一次编辑建议 (NES)

    • 🪄 自动建议:当你暂停输入或移动光标时,会自动获取建议。
    • 🎨 丰富的差异显示:通过内联和块级差异可视化更改,采用 Treesitter 基础的语法高亮,并可精确到单词或字符级别的差异。
    • 🧭 逐块导航:逐个跳转查看编辑内容,确认后再应用。
    • 📊 状态栏集成:在状态栏中显示 Copilot LSP 的状态、请求进度以及预览文本。
  • 💬 集成的 AI 命令行终端

    • 🚀 直接访问 AI 命令行工具:无需离开 Neovim 即可与你喜欢的 AI 命令行工具交互。
    • 📦 为常用工具预配置:开箱即用支持 Claude、Gemini、Grok、Codex、Copilot CLI 等。
    • 上下文感知提示:自动将文件内容、光标位置和诊断信息包含在提示中。
    • 📝 提示库:提供用于常见任务的预定义提示库,例如解释代码、修复问题或编写测试。
    • 🔄 会话持久化:通过与 tmuxzellij 集成,保持 CLI 会话持续运行。
    • 📂 自动文件监听:当 AI 工具修改文件时,Neovim 会自动重新加载该文件。
  • 🔌 可扩展且可定制

    • ⚙️ 灵活配置:可根据个人喜好微调插件的各个方面。
    • 🧩 插件友好的 API:丰富的 API 便于与其他插件集成及构建自定义工作流。
    • 🎨 可自定义 UI:更改差异显示、标志等外观。

📋 要求

  • Neovim >= 0.11.2 或更高版本
  • 官方 copilot-language-server LSP 服务器,需启用 vim.lsp.enable。可通过以下方式安装:
    1. 使用 npm 或操作系统的包管理器安装
    2. 使用 mason-lspconfig.nvim 安装
    3. copilot.luacopilot.vim 均在其插件中捆绑了 LSP 服务器。
  • 有效的 lsp/copilot.lua 配置。
  • snacks.nvim 用于更好地选择提示/工具 (可选)
  • nvim-treesitter-textobjects (main 分支) 用于 {function}{class} 上下文变量 (可选)
  • AI 命令行工具,如 Codex、Claude、Copilot、Gemini 等 (可选) 详情请参阅 🤖 AI 命令行集成 部分。
  • 在类 Unix 系统上,使用 lsofps 来检测正在运行的 AI 命令行工具会话。 (可选,但推荐)

🚀 快速入门

  1. 使用你的包管理器安装插件(见下文)
  2. 配置 Copilot LSP — 必须启用 vim.lsp.enable
  3. 检查健康状况:checkhealth sidekick
  4. 登录 Copilot:LspCopilotSignIn
  5. 试用
    • 输入一些代码并暂停——观察下一次编辑建议是否出现
    • <Tab> 键浏览或应用建议
    • 使用 <leader>aa 打开 AI 命令行工具

[!NOTE] 初次接触下一次编辑建议? 与内联补全不同,NES 会在文件中的任意位置建议完整的重构或多行更改——可以将其视为 Copilot 的“全局视角”建议。

📦 安装

使用您喜欢的包管理器进行安装。使用 lazy.nvim

{
  "folke/sidekick.nvim",
  opts = {
    -- 在这里添加任何选项
    cli = {
      mux = {
        backend = "zellij",
        enabled = true,
      },
    },
  },
  keys = {
    {
      "<tab>",
      function()
        -- 如果有下一个编辑建议,跳转到它;否则应用第一个建议(如果有)
        if not require("sidekick").nes_jump_or_apply() then
          return "<Tab>" -- 回退到正常的 Tab 键行为
        end
      end,
      expr = true,
      desc = "前往/应用下一个编辑建议",
    },
    {
      "<c-.>",
      function() require("sidekick.cli").focus() end,
      desc = "聚焦 Sidekick CLI",
      mode = { "n", "t", "i", "x" },
    },
    {
      "<leader>aa",
      function() require("sidekick.cli").toggle() end,
      desc = "切换 Sidekick CLI 界面",
    },
    {
      "<leader>as",
      function() require("sidekick.cli").select() end,
      -- 或者仅选择已安装的工具:
      -- require("sidekick.cli").select({ filter = { installed = true } })
      desc = "选择 CLI 工具",
    },
    {
      "<leader>ad",
      function() require("sidekick.cli").close() end,
      desc = "断开当前 CLI 会话连接",
    },
    {
      "<leader>at",
      function() require("sidekick.cli").send({ msg = "{this}" }) end,
      mode = { "x", "n" },
      desc = "发送当前内容",
    },
    {
      "<leader>af",
      function() require("sidekick.cli").send({ msg = "{file}" }) end,
      desc = "发送当前文件",
    },
    {
      "<leader>av",
      function() require("sidekick.cli").send({ msg = "{selection}" }) end,
      mode = { "x" },
      desc = "发送可视选区内容",
    },
    {
      "<leader>ap",
      function() require("sidekick.cli").prompt() end,
      mode = { "n", "x" },
      desc = "Sidekick 选择提示界面",
    },
    -- 示例:直接打开 Claude 的快捷键
    {
      "<leader>ac",
      function() require("sidekick.cli").toggle({ name = "claude", focus = true }) end,
      desc = "切换 Claude CLI 界面",
    },
  },
}

[!TIP] 安装完成后,建议运行 :checkhealth sidekick 检查健康状态。

在插入模式中集成 <Tab> 键与 blink.cmp
{
  "saghen/blink.cmp",
  ---@module 'blink.cmp'
  ---@type blink.cmp.Config
  opts = {

    keymap = {
      ["<Tab>"] = {
        "snippet_forward",
        function() -- Sidekick 下一个编辑建议
          return require("sidekick").nes_jump_or_apply()
        end,
        function() -- 如果您正在使用 Neovim 原生内联补全
          return vim.lsp.inline_completion.get()
        end,
        "fallback",
      },
    },
  },
}
自定义 <Tab> 集成用于插入模式
{
  "folke/sidekick.nvim",
  opts = {
    -- 在这里添加任何选项
  },
  keys = {
    {
      "<tab>",
      function()
        -- 如果有下一个编辑建议,跳转到它;否则应用第一个建议(如果有)
        if require("sidekick").nes_jump_or_apply() then
          return -- 跳转或应用成功
        end

        -- 如果您正在使用 Neovim 原生内联补全
        if vim.lsp.inline_completion.get() then
          return
        end

        -- 您希望在按下 Tab 键时执行的其他操作(例如代码片段)可以放在这里。

        -- 最后回退到正常的 Tab 键行为
        return "<tab>"
      end,
      mode = { "i", "n" },
      expr = true,
      desc = "前往/应用下一个编辑建议",
    },
  },
}

安装完成后,如果提示,请使用 :LspCopilotSignIn 登录。

⚙️ 配置

该模块提供了安全的默认配置,并通过 require("sidekick").setup({ ... }) 暴露所有可配置项。

默认设置
---@class sidekick.Config
local defaults = {
  nes = {
    ---@type boolean|fun(buf:integer):boolean?
    enabled = function(buf)
      return vim.g.sidekick_nes ~= false and vim.b.sidekick_nes ~= false
    end,
    debounce = 100,
    trigger = {
      -- 触发侧边栏下一个编辑建议的事件
      events = { "ModeChanged i:n", "TextChanged", "User SidekickNesDone" },
    },
    clear = {
      -- 清除当前下一个编辑建议的事件
      events = { "TextChangedI", "InsertEnter" },
      esc = true, -- 按下 <Esc> 键时清除下一个编辑建议
    },
    ---@class sidekick.diff.Opts
    ---@field inline? "words"|"chars"|false 启用内联差异
    ---@field show? "always"|"cursor" `cursor` 只有当光标位于编辑位置时才会显示差异。
    diff = {
      inline = "words",
      show = "always",
    },
    signs = true, -- 为下一个编辑建议显示标志
    jumplist = true, -- 将条目添加到跳转列表
  },
  -- 直接从 Neovim 内部使用 AI 命令行工具
  cli = {
    watch = true, -- 当 AI 命令行工具对文件进行更改时,通知 Neovim
    ---@class sidekick.win.Opts
    win = {
      --- 这会在创建新终端之前运行,在启动终端之前执行。
      --- 在这里可以修改窗口选项 `terminal.opts`。
      ---@param terminal sidekick.cli.Terminal
      config = function(terminal) end,
      wo = {}, ---@type vim.wo
      bo = {}, ---@type vim.bo
      layout = "right", ---@type "float"|"left"|"bottom"|"top"|"right"
      --- 当布局为 "float" 时使用的选项
      ---@type vim.api.keyset.win_config
      float = {
        width = 0.9,
        height = 0.9,
      },
      -- 当布局为 "left"|"bottom"|"top"|"right" 时使用的选项
      ---@type vim.api.keyset.win_config
      split = {
        width = 80, -- 设置为 0 以使用默认的分割宽度
        height = 20, -- 设置为 0 以使用默认的分割高度
      },
      --- CLI 工具快捷键(默认模式为 `t`)
      ---@type table<string, sidekick.cli.Keymap|false>
      keys = {
        buffers       = { "<c-b>", "buffers"   , mode = "nt", desc = "打开缓冲区选择器" },
        files         = { "<c-f>", "files"     , mode = "nt", desc = "打开文件选择器" },
        hide_n        = { "q"    , "hide"      , mode = "n" , desc = "隐藏终端窗口" },
        hide_ctrl_q   = { "<c-q>", "hide"      , mode = "n" , desc = "隐藏终端窗口" },
        hide_ctrl_dot = { "<c-.>", "hide"      , mode = "nt", desc = "隐藏终端窗口" },
        hide_ctrl_z   = { "<c-z>", "blur"      , mode = "nt", desc = "返回上一个窗口而不隐藏终端" },
        prompt        = { "<c-p>", "prompt"    , mode = "t" , desc = "插入提示或上下文" },
        stopinsert    = { "<c-q>", "stopinsert", mode = "t" , desc = "进入普通模式" },
        -- 在终端模式下导航窗口。仅在以下情况下生效:
        -- * 布局不是 "float"
        -- * 方向上有另一个窗口
        -- 使用默认的 "right" 布局时,只有 `<c-h>` 会被映射
        nav_left      = { "<c-h>", "nav_left"  , expr = true, desc = "导航到左侧窗口" },
        nav_down      = { "<c-j>", "nav_down"  , expr = true, desc = "导航到下方窗口" },
        nav_up        = { "<c-k>", "nav_up"    , expr = true, desc = "导航到上方窗口" },
        nav_right     = { "<c-l>", "nav_right" , expr = true, desc = "导航到右侧窗口" },
      },
      ---@type fun(dir:"h"|"j"|"k"|"l")?
      --- 处理窗口之间导航的函数。
      --- 默认为 `vim.cmd.wincmd`。由 `nav_*` 快捷键使用。
      nav = nil,
    },
    ---@class sidekick.cli.Mux
    ---@field backend? "tmux"|"zellij" 多路复用器后端,用于持久化 CLI 会话
    mux = {
      backend = vim.env.ZELLIJ and "zellij" or "tmux", -- 默认使用 tmux,除非检测到 zellij
      enabled = false,
      -- terminal: 为每个 CLI 工具创建新会话,并在 Neovim 终端中显示
      -- window: 在终端多路复用器中运行时,新会话将在新标签页中创建
      -- split: 在终端多路复用器中运行时,新会话将在新的分割窗口中创建
      -- 注意:zellij 只支持 `terminal`
      create = "terminal", ---@type "terminal"|"window"|"split"
      split = {
        vertical = true, -- 垂直或水平分割
        size = 0.5, -- 分割大小(0-1 表示百分比)
      },
    },
    --- 实际的 CLI 工具配置从运行时路径 `sk/cli/{tool}.lua` 加载,并与下面的配置合并。
    --- 默认配置请参见 https://github.com/folke/sidekick.nvim/tree/main/sk/cli
    ---@type table<string, sidekick.cli.Config|{}>
    tools = {
      aider    = {},
      amazon_q = {},
      claude   = {},
      codex    = {},
      copilot  = {},
      crush    = {},
      cursor   = {},
      gemini   = {},
      grok     = {},
      opencode = {},
      pi       = {},
      qwen     = {},
    },
    --- 添加自定义上下文。请参阅 `lua/sidekick/context/init.lua`
    ---@type table<string, sidekick.context.Fn>
    context = {},
    ---@type table<string, sidekick.Prompt|string|fun(ctx:sidekick.context.ctx):(string?)>
    prompts = {
      changes         = "你能审查我的更改吗?",
      diagnostics     = "你能帮我修复 {file} 中的诊断信息吗?\n{diagnostics}",
      diagnostics_all = "你能帮我修复这些诊断信息吗?\n{diagnostics_all}",
      document        = "为 {function|line} 添加文档",
      explain         = "解释 {this}",
      fix             = "你能修复 {this} 吗?",
      optimize        = "如何优化 {this}?",
      review          = "你能审查 {file} 是否有任何问题或改进建议吗?",
      tests           = "你能为 {this} 编写测试吗?",
      -- 简单的上下文提示
      buffers         = "{buffers}",
      file            = "{file}",
      line            = "{line}",
      position        = "{position}",
      quickfix        = "{quickfix}",
      selection       = "{selection}",
      ["function"]    = "{function}",
      class           = "{class}",
    },
    -- 用于选择文件的首选选择器
    ---@alias sidekick.picker "snacks"|"telescope"|"fzf-lua"
    picker = "snacks", ---@type sidekick.picker
  },
  copilot = {
    -- 使用 `didChangeStatus` 跟踪 Copilot 的状态
    status = {
      enabled = true,
      level = vim.log.levels.WARN,
      -- 设置为 vim.log.levels.OFF 以禁用通知
      -- level = vim.log.levels.OFF,
    },
  },
  ui = {
    icons = {
      nes               = " ",
      attached          = " ",
      started           = " ",
      installed         = " ",
      missing           = " ",
      external_attached = "󰖩 ",
      external_started  = "󰖪 ",
      terminal_attached = " ",
      terminal_started  = " ",
    },
  },
  debug = false, -- 启用调试日志
}

✏️ 下一步编辑建议 (NES)

Copilot NES 请求会在您离开插入模式、在普通模式下修改文本或应用编辑后自动运行。

命令Lua
:Sidekick nes apply 应用当前活动的文本编辑
---@return boolean applied
require("sidekick.nes").apply()
:Sidekick nes clear 清除所有当前活动的编辑
require("sidekick.nes").clear()
:Sidekick nes disable

require("sidekick.nes").disable()
:Sidekick nes enable
---@param enable? boolean
require("sidekick.nes").enable(enable)
检查当前缓冲区中是否有活动编辑
require("sidekick.nes").have()
:Sidekick nes jump 跳转到当前活动编辑的起始位置
---@return boolean jumped
require("sidekick.nes").jump()
:Sidekick nes toggle

require("sidekick.nes").toggle()
:Sidekick nes update 向 LSP 服务器请求新的编辑(如果有的话)
require("sidekick.nes").update()

🤖 AI CLI 集成

Sidekick 自带一个轻量级的终端封装,让您无需离开 Neovim 即可与本地 AI CLI 工具交互。每个工具都在独立的临时终端窗口中运行,并共享辅助提示,这些提示会根据请求打包缓冲区上下文、当前光标位置以及诊断信息。

命令Lua
:Sidekick cli close
---@param opts? sidekick.cli.Hide
---@overload fun(name: string)
require("sidekick.cli").close(opts)
:Sidekick cli focus 如果终端窗口已打开,则切换其焦点
---@param opts? sidekick.cli.Show
---@overload fun(name: string)
require("sidekick.cli").focus(opts)
:Sidekick cli hide
---@param opts? sidekick.cli.Hide
---@overload fun(name: string)
require("sidekick.cli").hide(opts)
:Sidekick cli prompt 选择要发送的提示
---@param opts? sidekick.cli.Prompt|{cb:nil}
---@overload fun(cb:fun(msg?:string))
require("sidekick.cli").prompt(opts)
渲染消息模板或提示
---@param opts? sidekick.cli.Message|string
require("sidekick.cli").render(opts)
:Sidekick cli select 启动或附加到一个 CLI 工具
---@param opts? sidekick.cli.Select|{cb:nil}|{focus?:boolean}
---@overload fun(cb:fun(state?:sidekick.cli.State))
require("sidekick.cli").select(opts)
:Sidekick cli send 向 CLI 发送消息或提示
---@param opts? sidekick.cli.Send
---@overload fun(msg:string)
require("sidekick.cli").send(opts)
:Sidekick cli show
---@param opts? sidekick.cli.Show
---@overload fun(name: string)
require("sidekick.cli").show(opts)
:Sidekick cli toggle
---@param opts? sidekick.cli.Show
---@overload fun(name: string)
require("sidekick.cli").toggle(opts)

提示与上下文

Sidekick 自带一组预定义的提示,您可以将其与 AI 工具一起使用。此外,您还可以在提示中使用上下文变量,以包含有关当前文件、选区、诊断等信息。

image
可用提示
  • changes: 你能 review 我的更改吗?
  • diagnostics: 你能帮我修复 {file} 中的诊断问题吗?\n{diagnostics}
  • diagnostics_all: 你能帮我修复这些诊断问题吗?\n{diagnostics_all}
  • document: 为 {position} 添加文档
  • explain: 解释 {this}
  • fix: 你能修复 {this} 吗?
  • optimize: 如何优化 {this}?
  • review: 你能 review {file} 是否有任何问题或改进之处吗?
  • tests: 你能为 {this} 编写测试吗?
  • quickfix: {quickfix}(当前 quickfix 条目)。
可用上下文变量
  • {buffers}: 所有打开的缓冲区列表。
  • {file}: 当前文件路径。
  • {position}: 当前文件中的光标位置。
  • {line}: 当前行。
  • {selection}: 可视化选区。
  • {diagnostics}: 当前缓冲区的诊断信息。
  • {diagnostics_all}: 工作区中的所有诊断信息。
  • {quickfix}: 当前 quickfix 列表,包括标题和格式化后的条目。
  • {function}: 光标处的函数(Tree-sitter)——返回类似 function foo @file:10:5 的位置。
  • {class}: 光标处的类/结构体(Tree-sitter)——返回位置。
  • {this}: 一个特殊的上下文变量。如果当前缓冲区是文件,则解析为 {position};否则,解析为字面字符串“this”,并将当前 {selection} 追加到提示中。

Snacks.nvim 选取器集成

如果您正在使用 snacks.nvim,您可以将选取器中的选择直接发送到 Sidekick 的 AI CLI 工具中。这对于将搜索结果、grep 匹配项或文件选择作为上下文发送非常有用。

Snacks 选取器配置示例
{
  "folke/snacks.nvim",
  optional = true,
  opts = {
    picker = {
      actions = {
        sidekick_send = function(...)
          return require("sidekick.cli.picker.snacks").send(...)
        end,
      },
      win = {
        input = {
          keys = {
            ["<a-a>"] = {
              "sidekick_send",
              mode = { "n", "i" },
            },
          },
        },
      },
    },
  },
}

通过此配置,在任何 Snacks 选取器中按下 <a-a> 键,都会将所选内容发送到您当前的 AI CLI 会话中。该集成会自动处理:

  • 带完整路径的文件选择
  • 带行号和位置的 grep 结果
  • 多重选择(发送所有选中的内容)
  • 精确位置范围以提供更详细的上下文

CLI 键位映射

你可以通过设置 cli.win.keys 选项来自定义 CLI 窗口的键位映射。 默认的键位映射如下:

  • q(在普通模式下):隐藏终端窗口。
  • <c-q>(在终端模式下):隐藏终端窗口。
  • <c-z>:退出 CLI 窗口。
  • <c-p>:插入提示或上下文。
如何覆盖默认键位映射的示例
{
  "folke/sidekick.nvim",
  opts = {
    cli = {
      win = {
        keys = {
          -- 覆盖默认的隐藏键位
          hide_n = { "<leader>q", "hide", mode = "n" },
          -- 添加一个新的键位用于打招呼
          say_hi = {
            "<c-h>",
            function(t)
              t:send("hi!")
            end,
          },
        },
      },
    },
  },
}

默认 CLI 工具

Sidekick 预配置了一些流行的 AI CLI 工具。运行 :checkhealth sidekick 可以查看哪些工具已安装。

工具 描述 安装方法
aider AI 配对程序员 pip install aider-chatpipx install aider-chat
amazon_q Amazon Q 开发者 安装指南
claude Claude Code CLI 参见 Claude Code 文档
codex OpenAI Codex CLI 参见 OpenAI 文档
copilot GitHub Copilot CLI npm install -g @githubnext/github-copilot-cli
crush Charm 的 AI 助手 参见 安装说明
cursor Cursor CLI 代理 参见 Cursor 文档
gemini Google Gemini CLI 参见 仓库
grok xAI Grok CLI 参见 仓库
opencode OpenCode CLI npm install -g opencode
qwen Alibaba Qwen Code 参见 仓库

[!TIP] 安装工具后,重启 Neovim 或运行 :Sidekick cli select 即可看到可用的工具。

🚀 命令

Sidekick 提供了一个 :Sidekick 命令,允许你从命令行与插件交互。 该命令是 Lua API 的一个轻量级封装,因此你可以使用它来执行 Lua API 能够完成的任何操作。

命令结构

命令结构很简单:

:Sidekick <模块> <命令> [参数]
  • <模块>:你要使用的模块名称(例如 nescli)。
  • <命令>:你要执行的命令名称。
  • [参数]:命令的可选参数。这些参数会被解析为一个 Lua 表。

例如,要显示 claude 工具的 CLI 窗口,可以使用以下命令:

:Sidekick cli show name=claude

这等同于以下 Lua 代码:

require("sidekick.cli").show({ name = "claude" })
可用命令

以下是可用命令的列表:

NES (nes)

  • enable: 启用下一步编辑建议。
  • disable: 禁用下一步编辑建议。
  • toggle: 切换下一步编辑建议的启用状态。
  • update: 触发新的建议。
  • clear: 清除当前建议。

CLI (cli)

  • show: 显示 CLI 窗口。
  • toggle: 切换 CLI 窗口的显示状态。
  • hide: 隐藏 CLI 窗口。
  • close: 关闭 CLI 窗口。
  • focus: 将焦点切换到 CLI 窗口。
  • select: 选择要打开的 CLI 工具。
  • send: 向当前 CLI 工具发送消息。
  • prompt: 选择要发送给当前 CLI 工具的提示。
示例

以下是一些使用 :Sidekick 命令的示例:

  • 切换 CLI 窗口的显示状态:

    :Sidekick cli toggle
    

    Lua 等价代码:

    require("sidekick.cli").toggle()
    
  • 将可视选区发送到当前 CLI 工具:

    :'<,'>Sidekick cli send msg="{selection}"
    

    Lua 等价代码:

    require("sidekick.cli").send({ msg = "{selection}" })
    
  • 显示 grok 工具的 CLI 窗口并将其置为焦点:

    :Sidekick cli show name=grok focus=true
    

    Lua 等价代码:

    require("sidekick.cli").show({ name = "grok", focus = true })
    

📟 状态栏集成

通过 require("sidekick.status") API,你可以轻松地将 Copilot LSPCLI 会话 集成到你的状态栏中。

适用于 lualine.nvim 的示例
{
  "nvim-lualine/lualine.nvim",
  opts = function(_, opts)
    opts.sections = opts.sections or {}
    opts.sections.lualine_c = opts.sections.lualine_c or {}

    -- Copilot 状态
    table.insert(opts.sections.lualine_c, {
      function()
        return " "
      end,
      color = function()
        local status = require("sidekick.status").get()
        if status then
          return status.kind == "Error" and "DiagnosticError" or status.busy and "DiagnosticWarn" or "Special"
        end
      end,
      cond = function()
        local status = require("sidekick.status")
        return status.get() ~= nil
      end,
    })

    -- CLI 会话状态
    table.insert(opts.sections.lualine_x, 2, {
      function()
        local status = require("sidekick.status").cli()
        return " " .. (#status > 1 and #status or "")
      end,
      cond = function()
        return #require("sidekick.status").cli() > 0
      end,
      color = function()
        return "Special"
      end,
    })
  end,
}

❓ 常见问题解答

sidekick.nvim 会取代 Copilot 的内联建议吗?

不会!NES 是对内联建议的补充。它们服务于不同的目的:

  • 内联补全:即时、边打字边提供的快速建议(使用 copilot.lua 或原生的 vim.lsp.inline_completion
  • NES:在你暂停编辑后进行的大规模重构和多行更改

为了获得最佳体验,你可能需要同时使用两者。

这与 copilot.lua 或 copilot.vim 有何不同?

copilot.luacopilot.vim 提供的是 内联补全(即边输入边提供建议)。而 sidekick.nvim 则增加了:

  • Next Edit Suggestions (NES):跨文件的多行重构和上下文感知编辑
  • AI CLI 集成:内置终端,支持 Claude、Gemini 等 AI 工具

将它们结合使用,可以获得完整的体验!

NES 没有显示建议怎么办?

  1. 运行 :checkhealth sidekick 来验证你的配置是否正确。
  2. 确保 Copilot 已登录::LspCopilotSignIn
  3. 检查 LSP 是否已连接::lua vim.print(require("sidekick.config").get_client())
  4. 尝试手动触发::Sidekick nes update

CLI 工具无法启动怎么办?

  1. 确认工具已安装:which claude(或你使用的工具名称)。
  2. 使用 :checkhealth sidekick 检查工具的安装状态。
  3. 先尝试在终端中直接运行该工具。
  4. 尝试启动后查看 :messages 中是否有错误信息。

终端会话无法持久化怎么办?

确保你已安装 tmux 或 zellij,并启用多路复用器:

opts = {
  cli = {
    mux = {
      enabled = true,
      backend = "tmux", -- 或 "zellij"
    },
  },
}

我需要 GitHub Copilot 订阅吗?

是的,但仅限于 NES 功能(Next Edit Suggestions)。而 AI CLI 集成 可以独立使用任何 CLI 工具(如 Claude、Gemini 等),并不需要 Copilot。

如果我只想使用 CLI 工具,而不使用 NES,可以吗?

当然可以!只需禁用 NES 即可:

opts = {
  nes = { enabled = false },
}

这个插件能在 Neovim 0.10 上运行吗?

不能。由于 sidekick.nvim 使用了 LSP 功能和 API,因此需要 Neovim >= 0.11.2

如何添加我自己的 AI 工具?

将它添加到 cli.tools 配置中:

opts = {
  cli = {
    tools = {
      my_tool = {
        cmd = { "my-ai-cli", "--flag" },
        -- 可选:为该工具自定义快捷键
        keys = {
          submit = { "<c-s>", function(t) t:send("\n") end },
        },
      },
    },
  },
}

如何创建自定义提示?

将其添加到你的配置中:

opts = {
  cli = {
    prompts = {
      refactor = "请将 {this} 重构得更易于维护",
      security = "检查 {file} 中是否存在安全漏洞",
      custom = function(ctx)
        return "当前文件:" .. ctx.buf .. " 在第 " .. ctx.row 行"
      end,
    },
  },
}

然后可以通过 <leader>ap:Sidekick cli prompt 来使用这些提示。

版本历史

v2.3.02026/03/20
v2.2.02026/03/20
v2.1.02025/10/23
v2.0.02025/10/17
v1.3.02025/10/08
v1.2.02025/10/02
v1.1.02025/09/29
v1.0.02025/09/27

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

140.4k|★★☆☆☆|今天
开发框架Agent语言模型

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|昨天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|2天前
Agent图像开发框架

PaddleOCR

PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。

74.9k|★★★☆☆|今天
语言模型图像开发框架

OpenHands

OpenHands 是一个专注于 AI 驱动开发的开源平台,旨在让智能体(Agent)像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点,通过自动化流程显著提升开发速度。 无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员,还是需要快速原型验证的技术团队,都能从中受益。OpenHands 提供了灵活多样的使用方式:既可以通过命令行(CLI)或本地图形界面在个人电脑上轻松上手,体验类似 Devin 的流畅交互;也能利用其强大的 Python SDK 自定义智能体逻辑,甚至在云端大规模部署上千个智能体并行工作。 其核心技术亮点在于模块化的软件智能体 SDK,这不仅构成了平台的引擎,还支持高度可组合的开发模式。此外,OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩,证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能,支持与 Slack、Jira 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。

70.6k|★★★☆☆|今天
语言模型Agent开发框架