From a23e8c15f50a176f0decf054ecbfc38c7570b9b0 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Mon, 27 May 2024 18:16:35 +0200 Subject: [PATCH] feat(copilot-chat): enhanced rendering of the chat window --- .../plugins/extras/coding/copilot-chat.lua | 60 +++++++++++++++---- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/lua/lazyvim/plugins/extras/coding/copilot-chat.lua b/lua/lazyvim/plugins/extras/coding/copilot-chat.lua index 46a21441..4fc4cc9f 100644 --- a/lua/lazyvim/plugins/extras/coding/copilot-chat.lua +++ b/lua/lazyvim/plugins/extras/coding/copilot-chat.lua @@ -3,18 +3,25 @@ return { "CopilotC-Nvim/CopilotChat.nvim", branch = "canary", cmd = "CopilotChat", - opts = { - model = "gpt-4", - auto_insert_mode = true, - show_help = true, - window = { - width = 0.4, - }, - selection = function(source) - local select = require("CopilotChat.select") - return select.visual(source) or select.buffer(source) - end, - }, + opts = function() + local user = vim.env.USER or "User" + user = user:sub(1, 1):upper() .. user:sub(2) + return { + model = "gpt-4", + auto_insert_mode = true, + show_help = true, + question_header = " " .. user .. " ", + answer_header = " Copilot ", + separator = "---", + window = { + width = 0.4, + }, + selection = function(source) + local select = require("CopilotChat.select") + return select.visual(source) or select.buffer(source) + end, + } + end, keys = { { "aa", @@ -53,13 +60,40 @@ return { end, config = function(_, opts) local chat = require("CopilotChat") + local ns = vim.api.nvim_create_namespace("copilot-chat-text-hl") + vim.api.nvim_create_autocmd("BufEnter", { pattern = "copilot-chat", - callback = function() + callback = function(ev) vim.opt_local.relativenumber = false vim.opt_local.number = false + + vim.api.nvim_create_autocmd({ "TextChanged", "TextChangedI" }, { + group = vim.api.nvim_create_augroup("copilot-chat-text-" .. ev.buf, { clear = true }), + buffer = ev.buf, + callback = function() + vim.api.nvim_buf_clear_namespace(ev.buf, ns, 0, -1) + local lines = vim.api.nvim_buf_get_lines(ev.buf, 0, -1, false) + for l, line in ipairs(lines) do + if line:match(opts.separator .. "$") then + local sep = vim.fn.strwidth(line) - vim.fn.strwidth(opts.separator) + vim.api.nvim_buf_set_extmark(ev.buf, ns, l - 1, sep, { + virt_text_win_col = sep, + virt_text = { { string.rep("─", vim.go.columns), "@punctuation.special.markdown" } }, + priority = 100, + }) + vim.api.nvim_buf_set_extmark(ev.buf, ns, l - 1, 0, { + end_col = sep + 1, + hl_group = "@markup.heading.2.markdown", + priority = 100, + }) + end + end + end, + }) end, }) + chat.setup(opts) end, },