-- ============================================================================ -- COPILOT: GitHub AI code completion and chat -- ============================================================================ -- AI-powered code suggestions (ghost text + cmp menu) and chat. -- Autocomplete: accept ghost text, also shows in cmp menu. -- Chat: cc toggle, cq quick chat, ce explain. -- -- MODEL SELECTION: -- Chat: :CopilotChatModels (pick from gpt-4o, claude-sonnet-4, o3-mini, etc.) -- Autocomplete: controlled server-side by GitHub, not user-selectable. -- ============================================================================ return { -- Copilot core: ghost text suggestions + LSP backend { "zbirenbaum/copilot.lua", cmd = "Copilot", event = "InsertEnter", config = function() require("copilot").setup({ copilot_model = "gpt-41-copilot", panel = { enabled = true, auto_refresh = false, layout = { position = "bottom", ratio = 0.4, }, }, suggestion = { enabled = true, auto_trigger = true, debounce = 75, keymap = { accept = "", next = "", prev = "", dismiss = "", }, }, filetypes = { markdown = true, help = true, gitcommit = true, gitrebase = true, hgcommit = true, svn = true, cvs = true, tex = false, ["."] = true, }, copilot_node_command = "node", server_opts_overrides = {}, }) -- Disable Copilot when opening .tex files vim.api.nvim_create_autocmd({ "FileType", "BufEnter" }, { pattern = "tex", callback = function() local ok, suggestion = pcall(require, "copilot.suggestion") if ok and suggestion and suggestion.is_visible() then suggestion.dismiss() end vim.cmd("Copilot disable") end, desc = "Disable Copilot for LaTeX files", }) end, }, -- Copilot CMP: adds Copilot as a completion source in nvim-cmp menu { "zbirenbaum/copilot-cmp", dependencies = { "zbirenbaum/copilot.lua" }, config = function() require("copilot_cmp").setup() end, }, -- CopilotChat: full chat interface with model selection { "CopilotC-Nvim/CopilotChat.nvim", dependencies = { "zbirenbaum/copilot.lua", "nvim-lua/plenary.nvim", }, build = "make tiktoken", cmd = { "CopilotChat", "CopilotChatToggle", "CopilotChatModels", "CopilotChatExplain", "CopilotChatReview", "CopilotChatFix", "CopilotChatOptimize", "CopilotChatDocs", "CopilotChatTests", "CopilotChatCommit", }, keys = { { "cc", "CopilotChatToggle", desc = "CopilotChat: Toggle chat window" }, { "cq", function() local input = vim.fn.input("Quick Chat: ") if input ~= "" then require("CopilotChat").ask(input, { selection = require("CopilotChat.select").buffer }) end end, desc = "CopilotChat: Quick chat (whole buffer)" }, { "ce", "CopilotChatExplain", mode = { "n", "v" }, desc = "CopilotChat: Explain code" }, { "cr", "CopilotChatReview", mode = { "n", "v" }, desc = "CopilotChat: Review code" }, { "cf", "CopilotChatFix", mode = { "n", "v" }, desc = "CopilotChat: Fix code" }, { "co", "CopilotChatOptimize", mode = { "n", "v" }, desc = "CopilotChat: Optimize code" }, { "cd", "CopilotChatDocs", mode = { "n", "v" }, desc = "CopilotChat: Generate docs" }, { "ct", "CopilotChatTests", mode = { "n", "v" }, desc = "CopilotChat: Generate tests" }, { "cm", "CopilotChatModels", desc = "CopilotChat: Select model" }, }, config = function() require("CopilotChat").setup({ -- Default model (change with :CopilotChatModels at runtime) -- Options include: gpt-4o, claude-sonnet-4, o3-mini, gemini-2.0-flash, etc. model = "claude-sonnet-4", window = { layout = "vertical", width = 0.35, border = "rounded", }, mappings = { complete = { insert = "" }, close = { normal = "q", insert = "" }, reset = { normal = "", insert = "" }, submit_prompt = { normal = "", insert = "" }, }, }) end, }, }