From a27e3da769dd9ba3247db30e9ea3818d97f4ab79 Mon Sep 17 00:00:00 2001 From: Dominik Polakovics Date: Fri, 31 Jan 2025 17:45:30 +0100 Subject: [PATCH] fix: escaping in replace_in_file tool --- lua/chatgpt_nvim/tools/replace_in_file.lua | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lua/chatgpt_nvim/tools/replace_in_file.lua b/lua/chatgpt_nvim/tools/replace_in_file.lua index c49fa46..6a9f6d7 100644 --- a/lua/chatgpt_nvim/tools/replace_in_file.lua +++ b/lua/chatgpt_nvim/tools/replace_in_file.lua @@ -3,8 +3,11 @@ local robust_lsp = require("chatgpt_nvim.tools.lsp_robust_diagnostics") local M = {} --- Enhanced search_and_replace to track if a string was found. We use Lua’s gsub return value --- (updatedString, replacementCount) to see if any replacements occurred. +-- Function to escape all Lua pattern magic characters: +local function escape_lua_pattern(s) + return s:gsub("([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1") +end + local function search_and_replace(original, replacements) local updated = original local info_msgs = {} @@ -13,8 +16,11 @@ local function search_and_replace(original, replacements) local search_str = r.search or "" local replace_str = r.replace or "" + -- Escape special pattern chars to ensure literal matching: + local escaped_search = escape_lua_pattern(search_str) + local replacement_count = 0 - updated, replacement_count = updated:gsub(search_str, replace_str) + updated, replacement_count = updated:gsub(escaped_search, replace_str) -- If the string was not found, append an info message if replacement_count == 0 then @@ -41,8 +47,8 @@ M.run = function(tool_call, conf, prompt_user_tool_accept, is_subpath, read_file if not path or #replacements == 0 then return "[replace_in_file] Missing 'path' or 'replacements'." end - local root = vim.fn.getcwd() + local root = vim.fn.getcwd() if not is_subpath(root, path) then return string.format("Tool [replace_in_file for '%s'] REJECTED. Path outside project root.", path) end