提交 723b3348 编写于 作者: R Rob Lourens

Add literal match highlighting to NL settings search

上级 e8693114
...@@ -86,13 +86,13 @@ export interface IPreferencesEditorModel<T> { ...@@ -86,13 +86,13 @@ export interface IPreferencesEditorModel<T> {
} }
export type IGroupFilter = (group: ISettingsGroup) => boolean; export type IGroupFilter = (group: ISettingsGroup) => boolean;
export type ISettingFilter = (setting: ISetting) => IRange[]; export type ISettingMatcher = (setting: ISetting) => IRange[];
export interface ISettingsEditorModel extends IPreferencesEditorModel<ISetting> { export interface ISettingsEditorModel extends IPreferencesEditorModel<ISetting> {
readonly onDidChangeGroups: Event<void>; readonly onDidChangeGroups: Event<void>;
settingsGroups: ISettingsGroup[]; settingsGroups: ISettingsGroup[];
groupsTerms: string[]; groupsTerms: string[];
filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter, mostRelevantSettings?: string[]): IFilterResult; filterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher, mostRelevantSettings?: string[]): IFilterResult;
findValueMatches(filter: string, setting: ISetting): IRange[]; findValueMatches(filter: string, setting: ISetting): IRange[];
} }
......
...@@ -14,7 +14,7 @@ import { visit, JSONVisitor } from 'vs/base/common/json'; ...@@ -14,7 +14,7 @@ import { visit, JSONVisitor } from 'vs/base/common/json';
import { IModel } from 'vs/editor/common/editorCommon'; import { IModel } from 'vs/editor/common/editorCommon';
import { EditorModel } from 'vs/workbench/common/editor'; import { EditorModel } from 'vs/workbench/common/editor';
import { IConfigurationNode, IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN, IConfigurationPropertySchema, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationNode, IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN, IConfigurationPropertySchema, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { ISettingsEditorModel, IKeybindingsEditorModel, ISettingsGroup, ISetting, IFilterResult, ISettingsSection, IGroupFilter, ISettingFilter } from 'vs/workbench/parts/preferences/common/preferences'; import { ISettingsEditorModel, IKeybindingsEditorModel, ISettingsGroup, ISetting, IFilterResult, ISettingsSection, IGroupFilter, ISettingMatcher } from 'vs/workbench/parts/preferences/common/preferences';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { ITextEditorModel } from 'vs/editor/common/services/resolverService';
import { IRange, Range } from 'vs/editor/common/core/range'; import { IRange, Range } from 'vs/editor/common/core/range';
...@@ -26,7 +26,7 @@ export abstract class AbstractSettingsModel extends EditorModel { ...@@ -26,7 +26,7 @@ export abstract class AbstractSettingsModel extends EditorModel {
return this.settingsGroups.map(group => '@' + group.id); return this.settingsGroups.map(group => '@' + group.id);
} }
protected doFilterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter): IFilterResult { protected doFilterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher): IFilterResult {
const allGroups = this.settingsGroups; const allGroups = this.settingsGroups;
if (!filter) { if (!filter) {
...@@ -56,7 +56,7 @@ export abstract class AbstractSettingsModel extends EditorModel { ...@@ -56,7 +56,7 @@ export abstract class AbstractSettingsModel extends EditorModel {
for (const section of group.sections) { for (const section of group.sections) {
const settings: ISetting[] = []; const settings: ISetting[] = [];
for (const setting of section.settings) { for (const setting of section.settings) {
const settingMatches = settingFilter(setting); const settingMatches = settingMatcher(setting);
if (groupMatched || settingMatches && settingMatches.length) { if (groupMatched || settingMatches && settingMatches.length) {
settings.push(setting); settings.push(setting);
} }
...@@ -108,6 +108,8 @@ export abstract class AbstractSettingsModel extends EditorModel { ...@@ -108,6 +108,8 @@ export abstract class AbstractSettingsModel extends EditorModel {
} }
public abstract settingsGroups: ISettingsGroup[]; public abstract settingsGroups: ISettingsGroup[];
public abstract findValueMatches(filter: string, setting: ISetting): IRange[];
} }
export class SettingsEditorModel extends AbstractSettingsModel implements ISettingsEditorModel { export class SettingsEditorModel extends AbstractSettingsModel implements ISettingsEditorModel {
...@@ -147,8 +149,8 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti ...@@ -147,8 +149,8 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti
return this.settingsModel.getValue(); return this.settingsModel.getValue();
} }
public filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter): IFilterResult { public filterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher): IFilterResult {
return this.doFilterSettings(filter, groupFilter, settingFilter); return this.doFilterSettings(filter, groupFilter, settingMatcher);
} }
public findValueMatches(filter: string, setting: ISetting): IRange[] { public findValueMatches(filter: string, setting: ISetting): IRange[] {
...@@ -388,24 +390,13 @@ export class DefaultSettings extends Disposable { ...@@ -388,24 +390,13 @@ export class DefaultSettings extends Disposable {
this.initAllSettingsMap(settingsGroups); this.initAllSettingsMap(settingsGroups);
const mostCommonlyUsed = this.getMostCommonlyUsedSettings(settingsGroups); const mostCommonlyUsed = this.getMostCommonlyUsedSettings(settingsGroups);
this._allSettingsGroups = [mostCommonlyUsed, ...settingsGroups]; this._allSettingsGroups = [mostCommonlyUsed, ...settingsGroups];
this._content = this.toContent(this._allSettingsGroups, true);
const builder = new SettingsContentBuilder();
builder.pushLine('[');
builder.pushGroups([mostCommonlyUsed]);
builder.pushLine(',');
builder.pushGroups(settingsGroups);
builder.pushLine(']');
this._content = builder.getContent();
return this._content; return this._content;
} }
get raw(): string { get raw(): string {
if (!DefaultSettings._RAW) { if (!DefaultSettings._RAW) {
const settingsGroups = this.getRegisteredGroups(); DefaultSettings._RAW = this.toContent(this.getRegisteredGroups(), false);
const builder = new SettingsContentBuilder();
builder.pushGroups(settingsGroups);
DefaultSettings._RAW = builder.getContent();
} }
return DefaultSettings._RAW; return DefaultSettings._RAW;
} }
...@@ -543,6 +534,18 @@ export class DefaultSettings extends Disposable { ...@@ -543,6 +534,18 @@ export class DefaultSettings extends Disposable {
return c1.order - c2.order; return c1.order - c2.order;
} }
private toContent(settingsGroups: ISettingsGroup[], asArray: boolean): string {
const builder = new SettingsContentBuilder();
if (asArray) {
builder.pushLine('[');
}
builder.pushGroups(settingsGroups);
if (asArray) {
builder.pushLine(']');
}
return builder.getContent();
}
} }
export class DefaultSettingsEditorModel extends AbstractSettingsModel implements ISettingsEditorModel { export class DefaultSettingsEditorModel extends AbstractSettingsModel implements ISettingsEditorModel {
...@@ -576,20 +579,25 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements ...@@ -576,20 +579,25 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements
return this.defaultSettings.settingsGroups; return this.defaultSettings.settingsGroups;
} }
public filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter, mostRelevantSettings?: string[]): IFilterResult { public filterSettings(filter: string, groupFilter: IGroupFilter, settingMatcher: ISettingMatcher, mostRelevantSettings?: string[]): IFilterResult {
if (mostRelevantSettings) { if (mostRelevantSettings) {
const mostRelevantGroup = this.renderMostRelevantSettings(mostRelevantSettings); const mostRelevantGroup = this.renderMostRelevantSettings(mostRelevantSettings);
// calculate match ranges
const matches = mostRelevantGroup.sections[0].settings.reduce((prev, s) => {
return prev.concat(settingMatcher(s));
}, []);
return { return {
allGroups: [...this.settingsGroups, mostRelevantGroup], allGroups: [...this.settingsGroups, mostRelevantGroup],
filteredGroups: mostRelevantGroup.sections[0].settings.length ? [mostRelevantGroup] : [], filteredGroups: mostRelevantGroup.sections[0].settings.length ? [mostRelevantGroup] : [],
matches: [], matches,
query: filter query: filter
}; };
} else { } else {
// Do local search and add empty 'most relevant' group // Do local search and add empty 'most relevant' group
const mostRelevantGroup = this.renderMostRelevantSettings([]); const mostRelevantGroup = this.renderMostRelevantSettings([]);
const result = this.doFilterSettings(filter, groupFilter, settingFilter); const result = this.doFilterSettings(filter, groupFilter, settingMatcher);
result.allGroups = [...result.allGroups, mostRelevantGroup]; result.allGroups = [...result.allGroups, mostRelevantGroup];
return result; return result;
} }
......
...@@ -128,11 +128,11 @@ class LocalSearchProvider { ...@@ -128,11 +128,11 @@ class LocalSearchProvider {
return regex.test(group.title); return regex.test(group.title);
}; };
const settingFilter = (setting: ISetting) => { const settingMatcher = (setting: ISetting) => {
return new SettingMatches(this._filter, setting, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches; return new SettingMatches(this._filter, setting, true, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches;
}; };
return TPromise.wrap(preferencesModel.filterSettings(this._filter, groupFilter, settingFilter)); return TPromise.wrap(preferencesModel.filterSettings(this._filter, groupFilter, settingMatcher));
} }
} }
...@@ -150,19 +150,6 @@ class RemoteSearchProvider { ...@@ -150,19 +150,6 @@ class RemoteSearchProvider {
filterPreferences(preferencesModel: ISettingsEditorModel): TPromise<IFilterResult> { filterPreferences(preferencesModel: ISettingsEditorModel): TPromise<IFilterResult> {
return this._remoteSearchP.then(remoteResult => { return this._remoteSearchP.then(remoteResult => {
const settingFilter = (setting: ISetting) => {
if (!!remoteResult.scoredResults[setting.key]) {
const settingMatches = new SettingMatches(this._filter, setting, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches;
if (settingMatches.length) {
return settingMatches;
} else {
return [new Range(setting.keyRange.startLineNumber, setting.keyRange.startColumn, setting.keyRange.endLineNumber, setting.keyRange.startColumn)];
}
} else {
return null;
}
};
if (remoteResult) { if (remoteResult) {
let sortedNames = Object.keys(remoteResult.scoredResults).sort((a, b) => remoteResult.scoredResults[b] - remoteResult.scoredResults[a]); let sortedNames = Object.keys(remoteResult.scoredResults).sort((a, b) => remoteResult.scoredResults[b] - remoteResult.scoredResults[a]);
if (sortedNames.length) { if (sortedNames.length) {
...@@ -170,7 +157,8 @@ class RemoteSearchProvider { ...@@ -170,7 +157,8 @@ class RemoteSearchProvider {
sortedNames = sortedNames.filter(name => remoteResult.scoredResults[name] >= highScore / 2); sortedNames = sortedNames.filter(name => remoteResult.scoredResults[name] >= highScore / 2);
} }
const result = preferencesModel.filterSettings(this._filter, group => null, settingFilter, sortedNames); const settingMatcher = this.getRemoteSettingMatcher(sortedNames, preferencesModel);
const result = preferencesModel.filterSettings(this._filter, group => null, settingMatcher, sortedNames);
result.metadata = remoteResult; result.metadata = remoteResult;
return result; return result;
} else { } else {
...@@ -226,6 +214,22 @@ class RemoteSearchProvider { ...@@ -226,6 +214,22 @@ class RemoteSearchProvider {
return TPromise.as(p as any); return TPromise.as(p as any);
} }
private getRemoteSettingMatcher(names: string[], preferencesModel: ISettingsEditorModel): any {
const resultSet = new Set();
names.forEach(name => resultSet.add(name));
return (setting: ISetting) => {
if (resultSet.has(setting.key)) {
const settingMatches = new SettingMatches(this._filter, setting, false, (filter, setting) => preferencesModel.findValueMatches(filter, setting)).matches;
if (settingMatches.length) {
return settingMatches;
}
}
return [];
};
}
} }
const API_VERSION = 'api-version=2016-09-01-Preview'; const API_VERSION = 'api-version=2016-09-01-Preview';
...@@ -275,7 +279,7 @@ class SettingMatches { ...@@ -275,7 +279,7 @@ class SettingMatches {
public readonly matches: IRange[]; public readonly matches: IRange[];
constructor(searchString: string, setting: ISetting, private valuesMatcher: (filter: string, setting: ISetting) => IRange[]) { constructor(searchString: string, setting: ISetting, private requireFullQueryMatch: boolean, private valuesMatcher: (filter: string, setting: ISetting) => IRange[]) {
this.matches = distinct(this._findMatchesInSetting(searchString, setting), (match) => `${match.startLineNumber}_${match.startColumn}_${match.endLineNumber}_${match.endColumn}_`); this.matches = distinct(this._findMatchesInSetting(searchString, setting), (match) => `${match.startLineNumber}_${match.startColumn}_${match.endLineNumber}_${match.endColumn}_`);
} }
...@@ -283,7 +287,7 @@ class SettingMatches { ...@@ -283,7 +287,7 @@ class SettingMatches {
const result = this._doFindMatchesInSetting(searchString, setting); const result = this._doFindMatchesInSetting(searchString, setting);
if (setting.overrides && setting.overrides.length) { if (setting.overrides && setting.overrides.length) {
for (const subSetting of setting.overrides) { for (const subSetting of setting.overrides) {
const subSettingMatches = new SettingMatches(searchString, subSetting, this.valuesMatcher); const subSettingMatches = new SettingMatches(searchString, subSetting, this.requireFullQueryMatch, this.valuesMatcher);
let words = searchString.split(' '); let words = searchString.split(' ');
const descriptionRanges: IRange[] = this.getRangesForWords(words, this.descriptionMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]); const descriptionRanges: IRange[] = this.getRangesForWords(words, this.descriptionMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]);
const keyRanges: IRange[] = this.getRangesForWords(words, this.keyMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]); const keyRanges: IRange[] = this.getRangesForWords(words, this.keyMatchingWords, [subSettingMatches.descriptionMatchingWords, subSettingMatches.keyMatchingWords, subSettingMatches.valueMatchingWords]);
...@@ -353,7 +357,7 @@ class SettingMatches { ...@@ -353,7 +357,7 @@ class SettingMatches {
const ranges = from.get(word); const ranges = from.get(word);
if (ranges) { if (ranges) {
result.push(...ranges); result.push(...ranges);
} else if (others.every(o => !o.has(word))) { } else if (this.requireFullQueryMatch && others.every(o => !o.has(word))) {
return []; return [];
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册