apply_diff
apply_diff
工具通过指定要替换的确切内容,对文件进行精确的修改。它使用多种复杂策略来查找和应用更改,同时保持正确的代码格式和结构。
参数
该工具接受以下参数:
path
(必填):要修改的文件路径,相对于当前工作目录。diff
(必填):使用特定于活动diff策略的格式定义更改的搜索/替换块。start_line
(可选):搜索内容开始的提示,某些策略会使用。end_line
(可选):搜索内容结束的提示,某些策略会使用。
功能
该工具使用复杂的策略对现有文件进行有针对性的更改,以精确定位和替换内容。与简单的搜索和替换不同,它使用智能匹配算法(包括模糊匹配),能够适应不同的内容类型和文件大小,并为复杂编辑提供回退机制。
使用场景
- 当Kilo Code需要对现有代码进行精确更改而不重写整个文件时。
- 在重构代码的特定部分同时保持周围上下文时。
- 以手术般的精度修复现有代码中的错误时。
- 实现仅修改文件某些部分的功能增强时。
主要特性
- 使用可配置置信度阈值(通常为0.8-1.0)的智能模糊匹配。
- 使用
BUFFER_LINES
(默认40)提供匹配的上下文。 - 采用重叠窗口方法搜索大文件。
- 自动保留代码格式和缩进。
- 组合重叠匹配以提高置信度评分。
- 在应用更改前,在diff视图中显示更改以供用户审查和编辑。
- 跟踪每个文件的连续错误(
consecutiveMistakeCountForApplyDiff
)以防止重复失败。 - 根据
.kilocodeignore
规则验证文件访问权限。 - 有效处理多行编辑。
限制
- 对于独特、独特的代码部分效果最佳,以便可靠识别。
- 对于非常大的文件或高度重复的代码模式,性能可能会有所不同。
- 如果内容不明确,模糊匹配可能会偶尔选择错误的位置。
- 每个diff策略都有特定的格式要求。
- 复杂的编辑可能需要仔细选择策略或手动审查。
工作原理
当调用apply_diff
工具时,它会遵循以下过程:
- 参数验证:验证必需的
path
和diff
参数。 - KiloCodeIgnore检查:验证目标文件路径是否被
.kilocodeignore
规则允许。 - 文件分析:加载目标文件内容。
- 匹配查找:使用所选策略的算法(精确、模糊、重叠窗口)定位目标内容,考虑置信度阈值和上下文(
BUFFER_LINES
)。 - 更改准备:生成建议的更改,保留缩进。
- 用户交互:
- 在diff视图中显示更改。
- 允许用户审查并可能编辑建议的更改。
- 等待用户批准或拒绝。
- 更改应用:如果获得批准,将更改(可能包括用户编辑)应用到文件。
- 错误处理:如果发生错误(例如,匹配失败、部分应用),则递增文件的
consecutiveMistakeCountForApplyDiff
并报告失败类型。 - 反馈:返回结果,包括任何用户反馈或错误详细信息。
Diff策略
Kilo Code使用以下策略来应用diff:
MultiSearchReplaceDiffStrategy
一种增强的搜索/替换格式,支持在一个请求中进行多次更改。需要每个搜索块的行号。
- 最佳使用场景:已知或可以估计行号的多个不同更改。
- 要求:
SEARCH
块内容的精确匹配,包括空格和缩进。行号(:start_line:
,:end_line:
)是必需的。内容中的标记必须转义(\
)。
<diff>
块的示例格式:
<<<<<<< SEARCH
:start_line:10
:end_line:12
-------
// Old calculation logic
const result = value * 0.9;
return result;
=======
// Updated calculation logic with logging
console.log(`Calculating for value: ${value}`);
const result = value * 0.95; // Adjusted factor
return result;
>>>>>>> REPLACE
<<<<<<< SEARCH
:start_line:25
:end_line:25
-------
const defaultTimeout = 5000;
=======
const defaultTimeout = 10000; // Increased timeout
>>>>>>> REPLACE