添加rg工具
This commit is contained in:
parent
74bb2de4db
commit
ed574f4ca0
73
src/tools/rg.ts
Normal file
73
src/tools/rg.ts
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
import { rgPath } from "@vscode/ripgrep";
|
||||||
|
|
||||||
|
// 建议使用你之前用的颜色库
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取搜索结果及其上下文代码块
|
||||||
|
* @param pattern 搜索词
|
||||||
|
* @param contextLines 上下文行数 (前后各取几行)
|
||||||
|
* @param targetPath 搜索路径
|
||||||
|
*/
|
||||||
|
async function getCodeBlocks(pattern: string, contextLines: number = 5, targetPath: string = ".") {
|
||||||
|
const args = [
|
||||||
|
pattern,
|
||||||
|
targetPath,
|
||||||
|
"--json", // 输出 JSON 格式以便解析
|
||||||
|
"--context", String(contextLines), // 带出上下文
|
||||||
|
"--max-columns", "500", // 防止单行过长
|
||||||
|
"--heading", // 保持文件分组
|
||||||
|
];
|
||||||
|
|
||||||
|
const proc = Bun.spawn([rgPath, ...args]);
|
||||||
|
const text = await new Response(proc.stdout).text();
|
||||||
|
|
||||||
|
// Ripgrep 的 JSON 输出是每行一个 JSON 对象
|
||||||
|
const lines = text.split("\n").filter(Boolean);
|
||||||
|
|
||||||
|
const results: any[] = [];
|
||||||
|
let currentFile = "";
|
||||||
|
let currentBlock: any = null;
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
const node = JSON.parse(line);
|
||||||
|
|
||||||
|
// 1. 处理文件路径切换
|
||||||
|
if (node.type === "begin") {
|
||||||
|
currentFile = node.data.path.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 处理匹配行和上下文行
|
||||||
|
if (node.type === "match" || node.type === "context") {
|
||||||
|
const isMatch = node.type === "match";
|
||||||
|
const lineText = node.data.lines.text;
|
||||||
|
const lineNumber = node.data.line_number;
|
||||||
|
|
||||||
|
// 这里简单的逻辑:如果是连续行,就放进同一个 block
|
||||||
|
if (!currentBlock || (lineNumber !== currentBlock.endLine + 1)) {
|
||||||
|
if (currentBlock) results.push(currentBlock);
|
||||||
|
currentBlock = {
|
||||||
|
file: currentFile,
|
||||||
|
startLine: lineNumber,
|
||||||
|
endLine: lineNumber,
|
||||||
|
code: lineText,
|
||||||
|
hasMatch: isMatch
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
currentBlock.code += lineText;
|
||||||
|
currentBlock.endLine = lineNumber;
|
||||||
|
if (isMatch) currentBlock.hasMatch = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.type === "end" && currentBlock) {
|
||||||
|
results.push(currentBlock);
|
||||||
|
currentBlock = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用示例
|
||||||
|
const blocks = await getCodeBlocks("deepseek", 3);
|
||||||
|
console.log(JSON.stringify(blocks, null, 2));
|
||||||
Loading…
Reference in New Issue
Block a user