• Tan
    2026-05-06 来自广东
    当实现了edit工具后,我把main.go的prompt改成:“逐行模糊匹配(lineByLineReplace)算法中,虽然我们成功去除了首尾空格的干扰找到了匹配块,但在进行文本替换时,我们采用了一个极其粗暴的做法:直接将原有的那几行删掉,塞入未经任何处理的 newText。这会带来一个小问题:如果目标代码块是在一个嵌套极深的函数中(比如前面有 12 个空格的缩进),而大模型输出的 newText 只有 4 个空格的缩进,替换完之后,这部分代码的格式就会显得非常难看。结合你对字符串处理的经验,如果在匹配到目标行的同时,我们要提取出目标行原来的“基础缩进前缀(Base Indentation)”,并将其自动补齐到 newText 的每一行前面,你会如何在现有的 lineByLineReplace 中进行代码优化?” AI就帮我把代码优化好了
    
    1
  • Lee
    2026-05-07 来自河北
    // L1: 精确匹配 count := strings.Count(originalContent, oldText) if count == 1 { return strings.Replace(originalContent, oldText, newText, 1), nil } 这个逻辑有问题吧,如果大模型输出的去空格后的内容正好匹配上了代码中其中一段不是我们早替换得内容,不就有问题
    
    
  • 蹲蹲兽
    2026-05-07 来自广东
    不如改成直接用行号编辑,提供一个editline工具,参数为 起始行号,结束行号,内容。这样就不需要考虑文本替换的问题了🤔
    
    
  • Geek_d6f50f
    2026-05-06 来自广东
    // 滑动窗口在原始文件中寻找匹配块 for i := 0; i <= len(contentLines)-len(oldLines); i++ { isMatch := true for j := 0; j < len(oldLines); j++ { if strings.TrimSpace(contentLines[i+j]) != oldLines[j] { isMatch = false break } } if isMatch { matchCount++ matchStartIndex = i matchEndIndex = i + len(oldLines) } } 这里的匹配规则是不是有问题呢?这个匹配方法,仅仅能匹配到oldLines中的一行,如果多行匹配到,则就报错了,预期不是匹配整个oldText吗?
    
    
  • 麦耀锋
    2026-05-06 来自广东
    我觉得缩进这个问题挺复杂的,目前并没有好的思路能解决所有问题,举两个例子: 例子1:oldText中本身就有问题,比如本身的缩进就有问题,那么你以oldText的基础缩进前缀就没有任何参考意义 例子2:将下面: if a < 5 { b = 2 c= 4 } 改为: if a < 5 { b = 2 } 实际上大模型有可能会告知这个: oldText = '<space><space> c = 4\n}\n' newText = '}\n' 在这种情况下,实际上缩进是不需要特殊处理,因为两者的“第一行”不是同一个概念。
    
    