diff --git a/lua/gemini/chat.lua b/lua/gemini/chat.lua index 0083810..9c887ca 100644 --- a/lua/gemini/chat.lua +++ b/lua/gemini/chat.lua @@ -29,7 +29,15 @@ local function setup_buffer_options(bufnr) swapfile = false, bufhidden = 'wipe', modifiable = false, - readonly = true, -- Add readonly option + readonly = true, + undolevels = -1, -- Disable undo + list = false, -- Disable list mode + number = false, -- Disable line numbers + relativenumber = false, + modifiable = false, + modified = false, + foldmethod = 'manual', + foldlevel = 99, } for option, value in pairs(options) do @@ -40,8 +48,15 @@ end local function setup_buffer_autocmds(bufnr) local augroup = vim.api.nvim_create_augroup('GeminiChatBuffer', { clear = true }) - -- Block all file operations - vim.api.nvim_create_autocmd({'BufReadCmd', 'FileReadCmd', 'BufWriteCmd', 'FileWriteCmd'}, { + -- Block ALL file operations and buffer modifications + local blocked_events = { + 'BufReadCmd', 'FileReadCmd', 'BufWriteCmd', 'FileWriteCmd', + 'BufReadPre', 'BufReadPost', 'BufWrite', 'BufWritePre', 'BufWritePost', + 'FileReadPre', 'FileReadPost', 'FileWritePre', 'FileWritePost', + 'BufAdd', 'BufCreate', 'BufDelete', 'BufWipeout' + } + + vim.api.nvim_create_autocmd(blocked_events, { group = augroup, buffer = bufnr, callback = function() @@ -57,6 +72,10 @@ local function setup_buffer_autocmds(bufnr) callback = function() vim.opt_local.modifiable = false vim.opt_local.readonly = true + -- Disable file-related options + vim.opt_local.swapfile = false + vim.opt_local.buftype = 'nofile' + vim.opt_local.buflisted = false end }) end @@ -64,27 +83,44 @@ end local function setup_buffer_keymaps(bufnr) local opts = { buffer = bufnr, nowait = true, silent = true } - -- Disable ALL file operations - local operations = { - 'e', 'edit', 'w', 'write', 'sp', 'split', 'vs', 'vsplit', - 'new', 'vnew', 'read', 'update', 'saveas', 'f', 'file', - 'wq', 'wqa', 'wa', 'wall', 'q', 'quit', 'qa', 'qall' + -- Block ALL commands that could manipulate files or buffers + local blocked_cmds = { + 'e', 'edit', 'ene', 'enew', 'fin', 'find', + 'w', 'write', 'wa', 'wall', + 'sp', 'split', 'vs', 'vsplit', + 'new', 'vnew', 'tabnew', + 'read', 'r', 'file', 'f', + 'saveas', 'w', 'wq', 'wqa', + 'q', 'quit', 'qa', 'qall', + 'bn', 'bnext', 'bp', 'bprevious', + 'bd', 'bdelete', 'bw', 'bwipeout', + 'o', 'open', 'browse' } - for _, op in ipairs(operations) do - vim.keymap.set('n', ':' .. op, function() - vim.notify('Operation not allowed in chat window', vim.log.levels.WARN) + -- Block all command variations + for _, cmd in ipairs(blocked_cmds) do + vim.keymap.set('n', ':' .. cmd, function() + vim.notify('Command not allowed in chat window', vim.log.levels.WARN) + end, opts) + vim.keymap.set('n', ':' .. cmd .. '!', function() + vim.notify('Command not allowed in chat window', vim.log.levels.WARN) end, opts) end - -- Disable command mode completely + -- Disable command-line completely vim.keymap.set('n', ':', function() vim.notify('Command mode disabled in chat window', vim.log.levels.WARN) end, opts) -- Block common file operation key combinations - vim.keymap.set('n', 'ZZ', '', opts) - vim.keymap.set('n', 'ZQ', '', opts) + local blocked_keys = { + 'ZZ', 'ZQ', 'gf', 'f', 'gf', + 'v', 's', 'n' + } + + for _, key in ipairs(blocked_keys) do + vim.keymap.set('n', key, '', opts) + end -- Set chat-specific keymaps local mappings = config.options.mappings