diff --git a/packages/core/src/common/strings.ts b/packages/core/src/common/strings.ts index d12770734880e..7714171c88d24 100644 --- a/packages/core/src/common/strings.ts +++ b/packages/core/src/common/strings.ts @@ -26,3 +26,11 @@ export function* split(s: string, splitter: string): IterableIterator { start = end + splitter.length; } } + +export function escapeInvisibleChars(value: string ): string { + return value.replace(/\n/g, '\\n').replace(/\r/g, '\\r'); +} + +export function unescapeInvisibleChars(value: string): string { + return value.replace(/\\n/g, '\n').replace(/\\r/g, '\r'); +} diff --git a/packages/preferences/src/browser/preferences-decorator.ts b/packages/preferences/src/browser/preferences-decorator.ts index 0c8582bdc6f9b..718d673ab155f 100644 --- a/packages/preferences/src/browser/preferences-decorator.ts +++ b/packages/preferences/src/browser/preferences-decorator.ts @@ -17,6 +17,7 @@ import { inject, injectable } from 'inversify'; import { Tree, TreeDecorator, TreeDecoration, PreferenceProperty, PreferenceService } from '@theia/core/lib/browser'; import { Emitter, Event, MaybePromise } from '@theia/core'; +import { escapeInvisibleChars } from '@theia/core/lib/common/strings'; @injectable() export class PreferencesDecorator implements TreeDecorator { @@ -50,7 +51,8 @@ export class PreferencesDecorator implements TreeDecorator { tooltip: preferenceValue.description, captionSuffixes: [ { - data: storedValue !== undefined ? ': ' + storedValue : preferenceValue.default !== undefined ? ': ' + preferenceValue.default : undefined, + data: storedValue !== undefined && typeof storedValue === 'string' ? ': ' + escapeInvisibleChars(storedValue) : + preferenceValue.default !== undefined ? ': ' + preferenceValue.default : undefined, }, { data: ' ' + preferenceValue.description, @@ -64,4 +66,5 @@ export class PreferencesDecorator implements TreeDecorator { decorations(tree: Tree): MaybePromise> { return this.preferencesDecorations; } + } diff --git a/packages/preferences/src/browser/preferences-menu-factory.ts b/packages/preferences/src/browser/preferences-menu-factory.ts index d79dc441fb861..a3bb00c37c702 100644 --- a/packages/preferences/src/browser/preferences-menu-factory.ts +++ b/packages/preferences/src/browser/preferences-menu-factory.ts @@ -18,6 +18,7 @@ import { injectable } from 'inversify'; import { Menu } from '@phosphor/widgets'; import { CommandRegistry } from '@phosphor/commands'; import { PreferenceProperty } from '@theia/core/lib/browser'; +import { escapeInvisibleChars, unescapeInvisibleChars } from '@theia/core/lib/common/strings'; @injectable() export class PreferencesMenuFactory { @@ -29,13 +30,14 @@ export class PreferencesMenuFactory { if (property) { const enumConst = property.enum; if (enumConst) { - enumConst.forEach(enumValue => { + enumConst.map(escapeInvisibleChars) + .forEach(enumValue => { const commandId = id + '-' + enumValue; if (!commands.hasCommand(commandId)) { commands.addCommand(commandId, { label: enumValue, - iconClass: savedPreference === enumValue || !savedPreference && property.default === enumValue ? 'fa fa-check' : '', - execute: () => execute(id, enumValue) + iconClass: escapeInvisibleChars(savedPreference) === enumValue || !savedPreference && property.default === enumValue ? 'fa fa-check' : '', + execute: () => execute(id, unescapeInvisibleChars(enumValue)) }); menu.addItem({ type: 'command',