提交 1e99dc2c 编写于 作者: B Benjamin Pasero 提交者: GitHub

Merge pull request #23220 from daviwil/default-language-config

Add new "files.defaultLanguage" configuration setting
......@@ -32,6 +32,11 @@ export class SettingsDocument {
return this.provideExcludeCompletionItems(location, range);
}
// files.defaultLanguage
if (location.path[0] === 'files.defaultLanguage') {
return this.provideLanguageCompletionItems(location, range);
}
return this.provideLanguageOverridesCompletionItems(location, position);
}
......@@ -142,10 +147,10 @@ export class SettingsDocument {
return Promise.resolve(completions);
}
private provideLanguageCompletionItems(location: Location, range: vscode.Range, stringify: boolean = true): vscode.ProviderResult<vscode.CompletionItem[]> {
private provideLanguageCompletionItems(location: Location, range: vscode.Range, formatFunc: (string) => string = (l) => JSON.stringify(l)): vscode.ProviderResult<vscode.CompletionItem[]> {
return vscode.languages.getLanguages().then(languages => {
return languages.map(l => {
return this.newSimpleCompletionItem(stringify ? JSON.stringify(l) : l, range);
return this.newSimpleCompletionItem(formatFunc(l), range);
});
});
}
......@@ -175,19 +180,9 @@ export class SettingsDocument {
}
if (location.path.length === 1 && location.previousNode && typeof location.previousNode.value === 'string' && location.previousNode.value.startsWith('[')) {
// Suggestion model word matching includes starting quote and open sqaure bracket
// Hence exclude them from the proposal range
range = new vscode.Range(new vscode.Position(range.start.line, range.start.character + 2), range.end);
return vscode.languages.getLanguages().then(languages => {
return languages.map(l => {
// Suggestion model word matching includes closed sqaure bracket and ending quote
// Hence include them in the proposal to replace
return this.newSimpleCompletionItem(l, range, '', l + ']"');
});
});
// Suggestion model word matching includes closed sqaure bracket and ending quote
// Hence include them in the proposal to replace
return this.provideLanguageCompletionItems(location, range, language => `"[${language}]"`);
}
return Promise.resolve([]);
}
......
......@@ -575,6 +575,7 @@ export interface IFilesConfiguration {
exclude: glob.IExpression;
watcherExclude: { [filepattern: string]: boolean };
encoding: string;
defaultLanguage: string;
trimTrailingWhitespace: boolean;
autoSave: string;
autoSaveDelay: number;
......
......@@ -265,6 +265,10 @@ configurationRegistry.registerConfiguration({
nls.localize('hotExit.onExitAndWindowClose', 'Hot exit will be triggered when the application is closed, that is when the last window is closed on Windows/Linux or when the workbench.action.quit command is triggered (command pallete, keybinding, menu), and also for any window with a folder opened regardless of whether it\'s the last window. All windows without folders opened will be restored upon next launch. To restore folder windows as they were before shutdown set "window.reopenFolders" to "all".')
],
'description': nls.localize('hotExit', "Controls whether unsaved files are remembered between sessions, allowing the save prompt when exiting the editor to be skipped.", HotExitConfiguration.ON_EXIT, HotExitConfiguration.ON_EXIT_AND_WINDOW_CLOSE)
},
'files.defaultLanguage': {
'type': 'string',
'description': nls.localize('defaultLanguage', "The default language mode that is assigned to new files.")
}
}
});
......
......@@ -8,6 +8,8 @@ import URI from 'vs/base/common/uri';
import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import arrays = require('vs/base/common/arrays');
import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput';
import { IFilesConfiguration } from 'vs/platform/files/common/files';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import Event, { Emitter, once } from 'vs/base/common/event';
export const IUntitledEditorService = createDecorator<IUntitledEditorService>('untitledEditorService');
......@@ -89,7 +91,8 @@ export class UntitledEditorService implements IUntitledEditorService {
private _onDidDisposeModel: Emitter<URI>;
constructor(
@IInstantiationService private instantiationService: IInstantiationService
@IInstantiationService private instantiationService: IInstantiationService,
@IConfigurationService private configurationService: IConfigurationService
) {
this._onDidChangeContent = new Emitter<URI>();
this._onDidChangeDirty = new Emitter<URI>();
......@@ -185,6 +188,11 @@ export class UntitledEditorService implements IUntitledEditorService {
} while (Object.keys(UntitledEditorService.CACHE).indexOf(resource.toString()) >= 0);
}
const configuration = this.configurationService.getConfiguration<IFilesConfiguration>();
if (!modeId && configuration.files && configuration.files.defaultLanguage) {
modeId = configuration.files.defaultLanguage;
}
const input = this.instantiationService.createInstance(UntitledEditorInput, resource, hasAssociatedFilePath, modeId, initialValue);
const contentListener = input.onDidModelChangeContent(() => {
......
......@@ -9,12 +9,20 @@ import * as assert from 'assert';
import { TPromise } from 'vs/base/common/winjs.base';
import { join } from 'vs/base/common/paths';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices';
import { UntitledEditorModel } from 'vs/workbench/common/editor/untitledEditorModel';
import { IModeService } from 'vs/editor/common/services/modeService';
import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl';
class ServiceAccessor {
constructor( @IUntitledEditorService public untitledEditorService: UntitledEditorService) {
constructor(
@IUntitledEditorService public untitledEditorService: UntitledEditorService,
@IModeService public modeService: ModeServiceImpl,
@IConfigurationService public testConfigurationService: TestConfigurationService) {
}
}
......@@ -125,6 +133,46 @@ suite('Workbench - Untitled Editor', () => {
});
});
test('Untitled created with files.defaultLanguage setting', function (done) {
const defaultLanguage = 'javascript';
const config = accessor.testConfigurationService;
config.setUserConfiguration('files', { 'defaultLanguage': defaultLanguage });
const service = accessor.untitledEditorService;
const input = service.createOrGet();
input.resolve().then((model: UntitledEditorModel) => {
assert.equal(model.getModeId(), defaultLanguage);
config.setUserConfiguration('files', { 'defaultLanguage': undefined });
input.dispose();
done();
});
});
test('Untitled created with modeId overrides files.defaultLanguage setting', function (done) {
const modeId = 'typescript';
const defaultLanguage = 'javascript';
const config = accessor.testConfigurationService;
config.setUserConfiguration('files', { 'defaultLanguage': defaultLanguage });
const service = accessor.untitledEditorService;
const input = service.createOrGet(null, modeId);
input.resolve().then((model: UntitledEditorModel) => {
assert.equal(model.getModeId(), modeId);
config.setUserConfiguration('files', { 'defaultLanguage': undefined });
input.dispose();
done();
});
});
test('encoding change event', function (done) {
const service = accessor.untitledEditorService;
const input = service.createOrGet();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册