@@ -2782,11 +2782,39 @@ function M:_replace_text(target, replacement, opts)
27822782 local line = range_lines [idx ] or " "
27832783 local s_idx , e_idx = line :find (target , 1 , true )
27842784 if s_idx then
2785- local new_line = (line :sub (1 , s_idx - 1 )) .. replacement .. (line :sub (e_idx + 1 ))
27862785 local absolute_line = end_line + idx - 1 -- convert to absolute 1-based line
2787- vim .api .nvim_buf_set_lines (chat .bufnr , absolute_line - 1 , absolute_line , false , { new_line })
2788- changed = true
2789- break
2786+
2787+ -- If replacement contains newlines, split it into proper buffer lines
2788+ if type (replacement ) == " string" and replacement :find (" \n " ) then
2789+ local parts = Utils .split_lines (replacement )
2790+ local prefix = line :sub (1 , s_idx - 1 )
2791+ local suffix = line :sub (e_idx + 1 )
2792+
2793+ local new_lines = {}
2794+ if # parts > 0 then
2795+ -- First line: prefix + first part
2796+ table.insert (new_lines , prefix .. parts [1 ])
2797+ -- Middle parts (if any)
2798+ for i = 2 , # parts do
2799+ table.insert (new_lines , parts [i ])
2800+ end
2801+ -- Append suffix to the last inserted line
2802+ new_lines [# new_lines ] = new_lines [# new_lines ] .. suffix
2803+ else
2804+ -- Fallback: no parts (shouldn't happen), just replace inline
2805+ table.insert (new_lines , prefix .. suffix )
2806+ end
2807+
2808+ vim .api .nvim_buf_set_lines (chat .bufnr , absolute_line - 1 , absolute_line , false , new_lines )
2809+ changed = true
2810+ break
2811+ else
2812+ -- Simple single-line replacement
2813+ local new_line = (line :sub (1 , s_idx - 1 )) .. replacement .. (line :sub (e_idx + 1 ))
2814+ vim .api .nvim_buf_set_lines (chat .bufnr , absolute_line - 1 , absolute_line , false , { new_line })
2815+ changed = true
2816+ break
2817+ end
27902818 end
27912819 end
27922820 end )
0 commit comments