Skip to content

Commit

Permalink
#1587 Configure settings for current language from language selector
Browse files Browse the repository at this point in the history
  • Loading branch information
sandy081 committed Jan 19, 2017
1 parent 8d4a639 commit e141f19
Showing 1 changed file with 70 additions and 3 deletions.
73 changes: 70 additions & 3 deletions src/vs/workbench/browser/parts/editor/editorStatus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { IDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecyc
import { IMessageService, Severity } from 'vs/platform/message/common/message';
import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService';
import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing';
import { IEditorAction, ICommonCodeEditor, IModelContentChangedEvent, IModelOptionsChangedEvent, IModelLanguageChangedEvent, ICursorPositionChangedEvent, EndOfLineSequence, EditorType, IModel, IDiffEditorModel, IEditor } from 'vs/editor/common/editorCommon';
import { IEditorAction, ICommonCodeEditor, IModelContentChangedEvent, IModelOptionsChangedEvent, IModelLanguageChangedEvent, ICursorPositionChangedEvent, EndOfLineSequence, EditorType, IModel, IDiffEditorModel, IEditor, IPosition } from 'vs/editor/common/editorCommon';
import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser';
import { TrimTrailingWhitespaceAction } from 'vs/editor/contrib/linesOperations/common/linesOperations';
import { IndentUsingSpaces, IndentUsingTabs, DetectIndentation, IndentationToSpacesAction, IndentationToTabsAction } from 'vs/editor/contrib/indentation/common/indentation';
Expand All @@ -46,6 +46,9 @@ import { ICommandService } from 'vs/platform/commands/common/commands';
import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { getCodeEditor as getEditorWidget } from 'vs/editor/common/services/codeEditorService';
import { IPreferencesService, ISetting } from 'vs/workbench/parts/preferences/common/preferences';
import { EditOperation } from 'vs/editor/common/core/editOperation';
import { Position } from 'vs/editor/common/core/position';

function getCodeEditor(editorWidget: IEditor): ICommonCodeEditor {
if (editorWidget) {
Expand Down Expand Up @@ -713,7 +716,10 @@ export class ChangeModeAction extends Action {
@IMessageService private messageService: IMessageService,
@IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService,
@IQuickOpenService private quickOpenService: IQuickOpenService,
@IInstantiationService private instantiationService: IInstantiationService
@IPreferencesService private preferencesService: IPreferencesService,
@IInstantiationService private instantiationService: IInstantiationService,
@ICommandService private commandService: ICommandService,
@IConfigurationEditingService private configurationEditService: IConfigurationEditingService
) {
super(actionId, actionLabel);
}
Expand All @@ -730,8 +736,9 @@ export class ChangeModeAction extends Action {

// Compute mode
let currentModeId: string;
let modeId;
if (textModel) {
const modeId = textModel.getLanguageIdentifier().language;
modeId = textModel.getLanguageIdentifier().language;
currentModeId = this.modeService.getLanguageName(modeId);
}

Expand Down Expand Up @@ -770,6 +777,7 @@ export class ChangeModeAction extends Action {

// Offer action to configure via settings
let configureModeAssociations: IPickOpenEntry;
let configureModeSettings: IPickOpenEntry;
let galleryAction: Action;
if (fileResource) {
const ext = paths.extname(fileResource.fsPath) || paths.basename(fileResource.fsPath);
Expand All @@ -779,6 +787,8 @@ export class ChangeModeAction extends Action {
picks.unshift(galleryAction);
}

configureModeSettings = { label: nls.localize('configureModeSettings', "Configure '{0}' language based settings...", currentModeId) };
picks.unshift(configureModeSettings);
configureModeAssociations = { label: nls.localize('configureAssociationsExt', "Configure File Association for '{0}'...", ext) };
picks.unshift(configureModeAssociations);
}
Expand Down Expand Up @@ -807,6 +817,12 @@ export class ChangeModeAction extends Action {
return;
}

// User decided to configure settings for current language
if (pick === configureModeSettings) {
this.configureModeSettings(modeId);
return;
}

// Change mode for active editor
activeEditor = this.editorService.getActiveEditor();
const editorWidget: IEditor = getEditorWidget(activeEditor);
Expand Down Expand Up @@ -888,6 +904,57 @@ export class ChangeModeAction extends Action {
});
});
}

private configureModeSettings(language: string): void {
this.preferencesService.openGlobalSettings()
.then(editor => {
const codeEditor = getEditorWidget(editor);
this.getPosition(language, codeEditor)
.then(position => {
codeEditor.setPosition(position);
codeEditor.focus();
});
});
}

private getPosition(language: string, codeEditor: ICommonCodeEditor): TPromise<IPosition> {
return this.preferencesService.resolvePreferencesEditorModel<ISetting>(this.preferencesService.userSettingsResource)
.then(settingsModel => {
const languageKey = `[${language}]`;
let setting = settingsModel.getPreference(languageKey);
const model = codeEditor.getModel();
const configuration = this.configurationService.getConfiguration<{ tabSize: number; insertSpaces: boolean }>('editor');
const {eol} = this.configurationService.getConfiguration<{ eol: string }>('files');
if (setting) {
if (setting.settings.length) {
const lastSetting = setting.settings[setting.settings.length - 1];
let content;
if (lastSetting.valueRange.endLineNumber === setting.range.endLineNumber) {
content = ',' + eol + this.spaces(2, configuration) + eol + this.spaces(1, configuration);
} else {
content = ',' + eol + this.spaces(2, configuration);
}
const editOperation = EditOperation.insert(new Position(lastSetting.valueRange.endLineNumber, lastSetting.valueRange.endColumn), content);
model.pushEditOperations([], [editOperation], () => []);
return { lineNumber: lastSetting.valueRange.endLineNumber + 1, column: model.getLineMaxColumn(lastSetting.valueRange.endLineNumber + 1) };
}
return { lineNumber: setting.valueRange.startLineNumber, column: setting.valueRange.startColumn + 1 };
}
return this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: languageKey, value: {} }, { autoSave: false, writeToBuffer: true })
.then(() => {
setting = settingsModel.getPreference(languageKey);
let content = eol + this.spaces(2, configuration) + eol + this.spaces(1, configuration);
let editOperation = EditOperation.insert(new Position(setting.valueRange.endLineNumber, setting.valueRange.endColumn - 1), content);
model.pushEditOperations([], [editOperation], () => []);
let lineNumber = setting.valueRange.endLineNumber + 1;
return { lineNumber, column: model.getLineMaxColumn(lineNumber) };
});
});
}

private spaces(count: number, {tabSize, insertSpaces}: { tabSize: number; insertSpaces: boolean }): string {
return insertSpaces ? strings.repeat(' ', tabSize * count) : strings.repeat('\t', count);
}
}

export interface IChangeEOLEntry extends IPickOpenEntry {
Expand Down

0 comments on commit e141f19

Please sign in to comment.