提交 9b739ad6 编写于 作者: R Rob Lourens

Refactor search - multiline/preview options tweaks

上级 1b812bad
......@@ -238,26 +238,27 @@ export class TextSearchResult implements ITextSearchResult {
constructor(text: string, range: ISearchRange, previewOptions?: ITextSearchPreviewOptions) {
this.range = range;
if (previewOptions) {
if (previewOptions && previewOptions.matchLines === 1) {
// 1 line preview requested
text = getNLines(text, previewOptions.matchLines);
const leadingChars = Math.floor(previewOptions.charsPerLine / 5);
const endColumnByTrimmedLines = (range.startLineNumber + previewOptions.matchLines - 1) === range.endLineNumber ? // if single line...
range.endColumn :
previewOptions.charsPerLine;
// This doesn't handle all previewOptions correctly
const previewStart = Math.max(range.startColumn - leadingChars, 0);
const endByCharsPerLine = previewOptions.charsPerLine + previewStart;
const trimmedEndOfMatchRangeInPreview = Math.min(endByCharsPerLine, endColumnByTrimmedLines - previewStart);
const previewText = text.substring(previewStart, previewOptions.charsPerLine + previewStart);
const endColInPreview = (range.endLineNumber - range.startLineNumber + 1) <= previewOptions.matchLines ?
Math.min(previewText.length, range.endColumn - previewStart) : // if number of match lines will not be trimmed by previewOptions
previewText.length; // if number of lines is trimmed
this.preview = {
text: text.substring(previewStart, endByCharsPerLine),
match: new OneLineRange(0, range.startColumn - previewStart, trimmedEndOfMatchRangeInPreview)
text: previewText,
match: new OneLineRange(0, range.startColumn - previewStart, endColInPreview)
};
} else {
// n line or no preview requested
this.preview = {
text: text,
match: new OneLineRange(0, range.startColumn, range.endColumn)
text,
match: new SearchRange(0, range.startColumn, range.endLineNumber - range.startLineNumber, range.endColumn)
};
}
}
......
......@@ -223,21 +223,24 @@ export class RipgrepParser extends EventEmitter {
private submatchToResult(parsedLine: any, match: any, uri: vscode.Uri): vscode.TextSearchResult {
const lineNumber = parsedLine.data.line_number - 1;
let matchText = parsedLine.data.lines.bytes ?
new Buffer(parsedLine.data.lines.bytes, 'base64').toString() :
parsedLine.data.lines.text;
let start = match.start;
let end = match.end;
let lineText = bytesOrTextToString(parsedLine.data.lines);
let matchText = bytesOrTextToString(match.match);
const newlineMatches = matchText.match(/\n/g);
const newlines = newlineMatches ? newlineMatches.length : 0;
let startCol = match.start;
const endLineNumber = lineNumber + newlines;
let endCol = match.end - (lineText.lastIndexOf('\n', lineText.length - 2) + 1);
if (lineNumber === 0) {
if (startsWithUTF8BOM(matchText)) {
matchText = stripUTF8BOM(matchText);
start -= 3;
end -= 3;
startCol -= 3;
endCol -= 3;
}
}
const range = new Range(lineNumber, start, lineNumber, end);
return createTextSearchResult(uri, matchText, range, this.previewOptions);
const range = new Range(lineNumber, startCol, endLineNumber, endCol);
return createTextSearchResult(uri, lineText, range, this.previewOptions);
}
private onResult(match: vscode.TextSearchResult): void {
......@@ -245,6 +248,12 @@ export class RipgrepParser extends EventEmitter {
}
}
function bytesOrTextToString(obj: any): string {
return obj.bytes ?
new Buffer(obj.bytes, 'base64').toString() :
obj.text;
}
function getRgArgs(query: vscode.TextSearchQuery, options: vscode.TextSearchOptions): string[] {
const args = ['--hidden', '--heading', '--line-number', '--color', 'ansi', '--colors', 'path:none', '--colors', 'line:none', '--colors', 'match:fg:red', '--colors', 'match:style:nobold'];
args.push(query.isCaseSensitive ? '--case-sensitive' : '--ignore-case');
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册