copilot.lua

by zbirenbaum (community) · Neovim 0.9+

Plugin Dev Tools Open Source v3.0.0 · 11.06.2026 активный

Community-реализация GitHub Copilot для Neovim на чистом Lua. Заменяет официальный плагин на Node.js — быстрее, меньше потребляет ресурсов, лучше интегрируется с nvim-cmp. Особенности: - Полная замена официального copilot.vim - Нет зависимости от Node.js (использует встроенный LSP Neovim) - Интеграция с nvim-cmp через copilot-cmp - Virtual text suggestions - Панель предложений (panel mode) - Работает с тем же GitHub Copilot подпиской

v3.0.0
11.06.2026 current
Добавлен 18.06.2026 · Обновлён 18.06.2026 · Dev Tools
Установка
# lazy.nvim:
{
  "zbirenbaum/copilot.lua",
  event = "InsertEnter",
  config = function()
    require("copilot").setup({
      suggestion = { enabled = false },
      panel = { enabled = false },
    })
  end,
},
-- nvim-cmp источник:
{
  "zbirenbaum/copilot-cmp",
  config = function()
    require("copilot_cmp").setup()
  end,
}
переведено ИИ

copilot.lua

Этот плагин является чисто Lua-заменой для github/copilot.vim. Огромное спасибо @tris203 за код, стоящий за функциональностью NES (copilot-lsp).

Мотивация создания copilot.lua

При использовании copilot.vim впервые с момента начала работы с neovim мой ноутбук начал перегреваться. Кроме того, движущийся по коду большой блок призрачного текста, который мешал моему существующему призрачному тексту от cmp, был отвлекающим. Поскольку Lua значительно более эффективна и упрощает интеграцию с современными плагинами, был создан этот репозиторий.

Содержание

Требования

  • Curl
  • NeoVim 0.11.0 или выше
  • NodeJS v22 или выше, если используется стандартная версия LSP для NodeJS

Установка

Установите плагин с помощью вашего предпочтительного менеджера плагинов. Например, с packer.nvim:

use { "zbirenbaum/copilot.lua"
  requires = {
    "copilotlsp-nvim/copilot-lsp", -- (опционально) для функциональности NES
  },
}

Аутентификация

Вы можете аутентифицироваться, используя один из следующих методов:

Постоянный вход (Рекомендуется)

После запуска copilot выполните команду :Copilot auth, чтобы начать процесс аутентификации.

Токен (не официально поддерживается)

Токены, выдаваемые через gh auth token, не поддерживают Copilot, поэтому вам необходимо сначала сгенерировать токен через LSP:

  • Аутентифицируйтесь, используя метод «Постоянный вход».
  • Получите токен, выполнив команду :Copilot auth info.
  • После этого вы можете безопасно удалить папку github-copilot, созданную в вашей базовой директории данных NeoVim.

Установите переменную окружения GITHUB_COPILOT_TOKEN или GH_COPILOT_TOKEN на этот токен. Обратите внимание, что если переменная установлена, даже если она пуста, LSP будет пытаться использовать её для входа.

Выход / Смена аккаунтов

Чтобы выйти из текущего аккаунта GitHub:

:Copilot auth signout

Чтобы войти с другим аккаунтом:

:Copilot auth signin

Чтобы просмотреть текущий статус аутентификации:

:Copilot auth info

Учетные данные хранятся языковым сервером Copilot в: - Linux/macOS: ~/.config/github-copilot/auth.db (или $XDG_CONFIG_HOME/github-copilot/auth.db) - Windows: ~/AppData/Local/github-copilot/auth.db

Аутентификация в альтернативных экземплярах GitHub

Если ваш доступ к Copilot предоставляется не публичным экземпляром GitHub, вы можете установить вашего поставщика аутентификации на пользовательский URL-адрес с соответствующим ключом конфигурации, например. auth_provider_url = "https://mycorp.ghe.com/".

Настройка и конфигурация

Для запуска Copilot необходимо выполнить функцию require("copilot").setup(options). Если параметры не предоставлены, используются значения по умолчанию.

Поскольку серверу copilot требуется некоторое время для запуска, рекомендуется загружать copilot лениво. Например:

use {
  "zbirenbaum/copilot.lua",
  requires = {
    "copilotlsp-nvim/copilot-lsp", -- (опционально) для функциональности NES
  },
  cmd = "Copilot",
  event = "InsertEnter",
  config = function()
    require("copilot").setup({})
  end,
}

Конфигурация по умолчанию

require('copilot').setup({
panel = {
  enabled = true,
  auto_refresh = false,
  keymap = {
    jump_prev = "[[",
    jump_next = "]]",
    accept = "<CR>",
    refresh = "gr",
    open = "<M-CR>"
  },
  layout = {
    position = "bottom", -- | top | left | right | bottom |
    ratio = 0.4
  },
},
suggestion = {
  enabled = true,
  auto_trigger = false,
  hide_during_completion = true,
  debounce = 15,
  trigger_on_accept = true,
  keymap = {
    accept = "<M-l>",
    accept_word = false,
    accept_line = false,
    next = "<M-]>",
    prev = "<M-[>",
    dismiss = "<C-]>",
    toggle_auto_trigger = false,
  },
},
nes = {
  enabled = false, -- требует copilot-lsp в качестве зависимости
  auto_trigger = false,
  keymap = {
    accept_and_goto = false,
    accept = false,
    dismiss = false,
  },
},
auth_provider_url = nil, -- URL поставщика аутентификации, если не "https://github.com/"
logger = {
  file = vim.fn.stdpath("log") .. "/copilot-lua.log",
  file_log_level = vim.log.levels.OFF,
  print_log_level = vim.log.levels.WARN,
  trace_lsp = "off", -- "off" | "debug" | "verbose"
  trace_lsp_progress = false,
  log_lsp_messages = false,
},
copilot_node_command = 'node', -- Версия Node.js должна быть > 22
workspace_folders = {},
copilot_model = "",
disable_limit_reached_message = false,  -- Установите в `true`, чтобы скрыть всплывающее окно о достижении лимита дополнений
root_dir = function()
  return vim.fs.dirname(vim.fs.find(".git", { upward = true })[1])
end,
should_attach = function(buf_id, _)
  if not vim.bo[buf_id].buflisted then
    logger.debug("не присоединяюсь, буфер не 'buflisted'")
    return false
  end

  if vim.bo[buf_id].buftype ~= "" then
    logger.debug("не присоединяюсь, 'buftype' буфера равен " .. vim.bo[buf_id].buftype)
    return false
  end

  return true
end,
server = {
  type = "nodejs", -- "nodejs" | "binary"
  custom_server_filepath = nil,
},
server_opts_overrides = {},
})

Панель

Панель может использоваться для предварительного просмотра предложений в отдельном окне. Вы можете выполнить команду :Copilot panel, чтобы открыть её.

Если auto_refresh установлен в true, предложения обновляются при вводе текста в буфере.

Модуль copilot.panel предоставляет следующие функции:

require("copilot.panel").accept()
require("copilot.panel").jump_next()
require("copilot.panel").jump_prev()
require("copilot.panel").open({position, ratio})
require("copilot.panel").close()
require("copilot.panel").toggle()
require("copilot.panel").refresh()
require("copilot.panel").is_open()

К ним также можно получить доступ через команду :Copilot panel <функция> (например, :Copilot panel accept).

Предложение

Когда auto_trigger установлен в true, copilot начинает предлагать варианты сразу после входа в режим вставки. Когда auto_trigger установлен в false, используйте клавиши next, prev или accept для вызова предложения copilot. Когда trigger_on_accept установлен в false, нажатие клавиши будет передано в буфер как есть, вместо того чтобы вызывать завершение.

Для переключения автоматического вызова для текущего буфера используйте require("copilot.suggestion").toggle_auto_trigger().

Предложение copilot автоматически скрывается, когда открыт popupmenu-completion. Если вы используете кастомное меню для дополнений, вы можете установить переменную буфера copilot_suggestion_hidden в true, чтобы получить аналогичное поведение.

Пример использования с nvim-cmp

cmp.event:on("menu_opened", function()
vim.b.copilot_suggestion_hidden = true
end)

cmp.event:on("menu_closed", function()
vim.b.copilot_suggestion_hidden = false
end)

Пример использования с blink.cmp

vim.api.nvim_create_autocmd("User", {
pattern = "BlinkCmpMenuOpen",
callback = function()
  vim.b.copilot_suggestion_hidden = true
end,
})

vim.api.nvim_create_autocmd("User", {
pattern = "BlinkCmpMenuClose",
callback = function()
  vim.b.copilot_suggestion_hidden = false
end,
})

Модуль copilot.suggestion предоставляет следующие функции:

require("copilot.suggestion").is_visible()
require("copilot.suggestion").accept(modifier)
require("copilot.suggestion").accept_word()
require("copilot.suggestion").accept_line()
require("copilot.suggestion").next()
require("copilot.suggestion").prev()
require("copilot.suggestion").clear_preview()
require("copilot.suggestion").update_preview()
require("copilot.suggestion").dismiss()
require("copilot.suggestion").toggle_auto_trigger()

К ним также можно получить доступ через команду :Copilot suggestion <функция> (например, :Copilot suggestion accept).

Группы подсветки

Copilot использует две группы подсветки для стилизации своих предложений:

Группа подсветки Используется для Связь по умолчанию
CopilotSuggestion Встроенный текст призрачных предложений Comment
CopilotAnnotation Аннотации во встроенных предложениях и на панели Comment

Если эти группы подсветки не определены вашей цветовой схемой, по умолчанию они будут связаны с Comment. Чтобы настроить их, установите подсветку после загрузки цветовой схемы или используйте автокоманду ColorScheme:

vim.api.nvim_create_autocmd("ColorScheme", {
  callback = function()
    vim.api.nvim_set_hl(0, "CopilotSuggestion", { fg = "#83a598", italic = true })
    vim.api.nvim_set_hl(0, "CopilotAnnotation", { fg = "#83a598" })
  end,
})

nes (предложение следующего редактирования)

[!WARNING] Эта функция все еще находится на стадии эксперимента и может работать неожиданным образом в некоторых сценариях, пожалуйста, сообщайте о любых проблемах, с которыми вы столкнетесь.

Когда enabled установлен в true, copilot будет предоставлять предложения на основе следующего редактирования, которое вы, вероятно, будете выполнять, через copilot-lsp. Если предложения нет, клавиши будут передавать управление стандартным клавишам.

copilot-lsp также имеет встроенные конфигурации, для дополнительных настроек, пожалуйста, обратитесь к документации copilot-lsp. Эти конфигурации должны быть установлены в функции init зависимости copilot-lsp.

use {
  "zbirenbaum/copilot.lua",
  requires = {
    "copilotlsp-nvim/copilot-lsp",
    init = function()
      vim.g.copilot_nes_debounce = 500
    end,
  },
  cmd = "Copilot",
  event = "InsertEnter",
  config = function()
    require("copilot").setup({
      nes = {
        enabled = true,
        keymap = {
          accept_and_goto = "<leader>p",
          accept = false,
          dismiss = "<Esc>",
        },
      },
    })
  end,
}

Типы файлов

Укажите типы файлов для присоединения copilot.

Пример:

require("copilot").setup {
  filetypes = {
    markdown = true, -- переопределяет значение по умолчанию
    terraform = false, -- запрещает определенный тип файла
    sh = function ()
      if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), '^%.env.*') then
        -- отключает для файлов .env
        return false
      end
      return true
    end,
  },
}

Если вы добавите "*" в качестве типа файла, конфигурация по умолчанию для filetypes больше не будет использоваться. например.

require("copilot").setup {
  filetypes = {
    javascript = true, -- разрешает определенный тип файла
    typescript = true, -- разрешает определенный тип файла
    ["*"] = false, -- отключает для всех остальных типов файлов и игнорирует стандартный `filetypes`
  },
}

Логгер

Записи будут записываться в file для сообщений уровня file_log_level и выше. Записи будут выводиться в NeoVim (с использованием notify) для сообщений уровня print_log_level и выше. Чтобы отключить любой из них, просто установите его уровень на vim.log.levels.OFF. Запись в файл выполняется асинхронно, чтобы минимизировать влияние на производительность, однако некоторое воздействие все еще существует.

Используемые уровни логирования определены в vim.log:

vim.log = {
  levels = {
    TRACE = 0,
    DEBUG = 1,
    INFO = 2,
    WARN = 3,
    ERROR = 4,
    OFF = 5,
  },
}

trace_lsp управляет логированием трассировочных сообщений LSP ($/logTrace) и может быть:

  • off
  • messages, что будет выводить сообщения LSP
  • verbose, что добавляет дополнительную информацию к сообщению.

Когда trace_lsp_progress установлен в true, также будут логироваться сообщения о прогрессе LSP ($/progress). Когда log_lsp_messages установлен в true, будут логироваться события сообщений журнала LSP (window/logMessage).

Будьте осторожны с включением всех функций логирования, поскольку файлы логов могут со временем стать очень большими, и приложение не очищает их.

copilot_node_command

Используйте это поле для предоставления пути к определенной версии node, например, установленной через nvm. Версия Node.js должна быть 22 или новее.

Пример:

copilot_node_command = vim.fn.expand("$HOME") .. "/.config/nvm/versions/node/v22.0.0/bin/node", -- Версия Node.js должна быть > 22

server_opts_overrides

Переопределяет настройки клиента copilot lsp. Список опций смотрите в :h vim.lsp.start. Убедитесь, что поле name не переопределяется, поскольку оно используется для повышения эффективности во многих проверках для подтверждения фактической работы copilot.

Поле settings — это место, где вы можете настроить поведение copilot lsp. Полный список доступных настроек и их ключей смотрите в SettingsOpts.md).

Пример:

require("copilot").setup {
  server_opts_overrides = {
    trace = "verbose",
    settings = {
      advanced = {
        listCount = 10, -- #completions for panel
        inlineSuggestCount = 3, -- #completions for getCompletions
      }
    },
  }
}

[!NOTE] Значения settings следуют вложенной структуре таблицы, соответствующей ключам в SettingsOpts.md). Например, InlineSuggestCount: ["advanced", "inlineSuggestCount"] становится settings = { advanced = { inlineSuggestCount = 3 } }.

Папки рабочего пространства

Папки рабочего пространства улучшают предложения Copilot. По умолчанию используется root_dir как папка рабочего пространства.

Дополнительные папки можно добавить через конфигурацию следующим образом:

workspace_folders = {
  "/home/user/gits",
  "/home/user/projects",
}

Их также можно добавить во время выполнения, используя команду :Copilot workspace add [путь к папке], где [путь к папке] — это папка рабочего пространства.

root_dir

Это позволяет изменить функцию, которая получает корневую папку, по умолчанию она ищет родительскую папку, содержащую папку .git. Если ни одна не найдена, будет использоваться текущий рабочий каталог.

should_attach

Эта функция вызывается для определения, должен ли copilot присоединяться к буферу или нет. Она полезна, если вы хотите выйти за рамки типов файлов и иметь больший контроль над тем, когда copilot должен присоединяться. Вы также можете использовать ее для присоединения к буферам, отображаемым в списке, просто опустив эту часть функции. Поскольку это происходит перед присоединением к буферу, это хороший способ не допустить чтение Copilot конфиденциальных файлов.

Примером этого может быть:

require("copilot").setup {
  should_attach = function(_, bufname)
    if string.match(bufname, "env") then
      return false
    end

    return true
  end
}

Сервер

[!CAUTION] Режим "binary" все еще находится на стадии эксперимента, пожалуйста, сообщайте о любых проблемах, с которыми вы столкнетесь.

type может быть либо "nodejs", либо "binary". Бинарная версия будет загружена при ее использовании.

custom_server_filepath используется для указания пути к серверу (с включенным именем файла) либо для файла .js, если используется "nodejs", либо для бинарного файла, если используется "binary". Имя файла само по себе также может быть установлено, если оно доступно через ваш PATH. При использовании "binary" процесс загрузки будет отключен, и бинарный файл будет использоваться напрямую. пример:

require("copilot").setup {
  server = {
    type = "nodejs",
    custom_server_filepath = "/home/user/copilot-lsp/language-server.js",
  },
}

Команды

copilot.lua определяет команду :Copilot, которая может выполнять различные действия. Она поддерживает автодополнение, так что попробуйте.

Интеграции

Модуль copilot.api может использоваться для построения интеграций поверх copilot.lua.

ЧАВО

Ошибка разбора сертификата

Это проблема самого copilot lsp, как описано в этом обсуждении. Пожалуйста, обновите плагин до последней версии для решения этой проблемы. Если обновление не помогает, некоторые пользователи сообщили, что обновление /usr/bin/update-ca-trust и удаление опции --comment из команд извлечения доверенных сертификатов решает проблему. Однако это не проверено автором этого плагина и может иметь непредвиденные последствия, поэтому действуйте с осторожностью.

Предупреждение о нескольких кодировках смещений

Как обсуждается в #247, проблема возникает потому, что два или более клиентов используют разные кодировки смещений. Для решения этого в lspconfig:

local capabilities = vim.lsp.protocol.make_client_capabilities() -- Получить возможности capabilities
capabilities.general.positionEncodings = { "utf-16" } -- Установить кодировку смещений, см. `:h vim.lsp.start` для получения дополнительной информации
require("lspconfig")[server].setup({ capabilities = capabilities }) -- Настроить сервер

Установите то же самое для copilot в server_opts_overrides:

server_opts_overrides = {
  offset_encoding = "utf-16" -- Установить кодировку смещений так же, как и выше, см. `:h vim.lsp.start` для получения дополнительной информации
}

Обратитесь к документации ваших плагинов для внесения изменений.

Комментарии
Войдите, чтобы оставить комментарий