fix: change to a normal buffer

This commit is contained in:
2024-12-23 17:02:30 +01:00
parent eb19c4144f
commit a354ff080a

View File

@@ -62,36 +62,48 @@ local function is_directory(path)
return stat and stat.type == "directory" return stat and stat.type == "directory"
end end
-- Replaces the inline input() call with opening a new buffer for prompt input ---------------------------------------------------------------------------
-- Updated run_chatgpt_command using BufWriteCmd to avoid creating a file --
---------------------------------------------------------------------------
function M.run_chatgpt_command() function M.run_chatgpt_command()
local conf = config.load() local conf = config.load()
if conf.debug then if conf.debug then
vim.api.nvim_out_write("[chatgpt_nvim:init] Running :ChatGPT command.\n") vim.api.nvim_out_write("[chatgpt_nvim:init] Running :ChatGPT command.\n")
end end
-- Create a new scratch buffer for user to type the message -- Create a normal, listed buffer so :w / :wq will work
local bufnr = vim.api.nvim_create_buf(false, true) local bufnr = vim.api.nvim_create_buf(false, false)
vim.api.nvim_buf_set_name(bufnr, "ChatGPT_Prompt") -- Assign a filename so Vim treats it like a normal file, but we intercept writes
vim.api.nvim_buf_set_option(bufnr, 'bufhidden', 'wipe') vim.api.nvim_buf_set_name(bufnr, "ChatGPT_Prompt.md")
vim.api.nvim_buf_set_option(bufnr, 'filetype', 'markdown') vim.api.nvim_buf_set_option(bufnr, "filetype", "markdown")
vim.api.nvim_buf_set_option(bufnr, "bufhidden", "wipe")
vim.api.nvim_buf_set_option(bufnr, "buftype", "")
vim.api.nvim_buf_set_option(bufnr, "modifiable", true)
-- Set some initial placeholder lines
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, { vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, {
"# Enter your prompt below.", "# Enter your prompt below.",
"", "",
"Save & close with :wq to finalize your prompt." "Save & close with :wq to finalize your prompt."
}) })
local function on_write_post() -- Intercept the write so that no file is actually created on disk
-- Read buffer lines and join them into a single string vim.api.nvim_create_autocmd("BufWriteCmd", {
buffer = bufnr,
callback = function()
-- Gather lines
local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
-- Skip the first lines that are placeholders, if desired
local user_input = table.concat(lines, "\n") local user_input = table.concat(lines, "\n")
-- Basic check to ensure user actually wrote something
if user_input == "" or user_input:find("^# Enter your prompt below.") then if user_input == "" or user_input:find("^# Enter your prompt below.") then
print("No valid input provided.") vim.api.nvim_out_write("No valid input provided.\n")
-- Mark buffer as unmodified, so :wq can still exit
vim.api.nvim_buf_set_option(bufnr, "modified", false)
return return
end end
-- Continue the same logic as originally, just using our new user_input -- Build the prompt using the user_input
local dirs = conf.directories or {"."} local dirs = conf.directories or {"."}
local project_structure = context.get_project_structure(dirs) local project_structure = context.get_project_structure(dirs)
@@ -143,24 +155,21 @@ function M.run_chatgpt_command()
end end
if token_count > token_limit then if token_count > token_limit then
print("Too many files in project structure. The request exceeds the O1 model limit of " .. token_limit .. " tokens.") vim.api.nvim_out_write("Too many files in project structure. The request exceeds the O1 model limit of " .. token_limit .. " tokens.\n")
return else
end
copy_to_clipboard(prompt) copy_to_clipboard(prompt)
print("Prompt (requesting needed files) copied to clipboard! Paste it into the ChatGPT O1 model.") vim.api.nvim_out_write("Prompt (requesting needed files) copied to clipboard! Paste it into the ChatGPT O1 model.\n")
end end
-- Create an autocmd that triggers once when user saves the buffer (BufWritePost) -- Mark as unmodified so :wq won't complain
vim.api.nvim_create_autocmd("BufWritePost", { vim.api.nvim_buf_set_option(bufnr, "modified", false)
buffer = bufnr, end,
once = true,
callback = on_write_post
}) })
-- Switch to the newly created buffer -- Switch to the newly created buffer
vim.cmd("buffer " .. bufnr) vim.cmd("buffer " .. bufnr)
end end
---------------------------------------------------------------------------
function M.run_chatgpt_paste_command() function M.run_chatgpt_paste_command()
local conf = config.load() local conf = config.load()