提交 227b38f6 编写于 作者: A Alex Dima

Fixes #26945: Present symbolic names in keybindings.json for non-US standard keyboard layouts

上级 d33fce1c
...@@ -215,25 +215,25 @@ class KeyCodeStrMap { ...@@ -215,25 +215,25 @@ class KeyCodeStrMap {
this._strToKeyCode[str.toLowerCase()] = keyCode; this._strToKeyCode[str.toLowerCase()] = keyCode;
} }
fromKeyCode(keyCode: KeyCode): string { keyCodeToStr(keyCode: KeyCode): string {
return this._keyCodeToStr[keyCode]; return this._keyCodeToStr[keyCode];
} }
toKeyCode(str: string): KeyCode { strToKeyCode(str: string): KeyCode {
return this._strToKeyCode[str.toLowerCase()] || KeyCode.Unknown; return this._strToKeyCode[str.toLowerCase()] || KeyCode.Unknown;
} }
} }
const ui = new KeyCodeStrMap(); const uiMap = new KeyCodeStrMap();
const usUserSettings = new KeyCodeStrMap(); const userSettingsUSMap = new KeyCodeStrMap();
const generalUserSettings = new KeyCodeStrMap(); const userSettingsGeneralMap = new KeyCodeStrMap();
(function () { (function () {
function define(keyCode: KeyCode, uiLabel: string, usUserSettingsLabel: string = uiLabel, generalUserSettingsLabel: string = usUserSettingsLabel): void { function define(keyCode: KeyCode, uiLabel: string, usUserSettingsLabel: string = uiLabel, generalUserSettingsLabel: string = usUserSettingsLabel): void {
ui.define(keyCode, uiLabel); uiMap.define(keyCode, uiLabel);
usUserSettings.define(keyCode, usUserSettingsLabel); userSettingsUSMap.define(keyCode, usUserSettingsLabel);
generalUserSettings.define(keyCode, generalUserSettingsLabel); userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel);
} }
define(KeyCode.Unknown, 'unknown'); define(KeyCode.Unknown, 'unknown');
...@@ -360,24 +360,22 @@ const generalUserSettings = new KeyCodeStrMap(); ...@@ -360,24 +360,22 @@ const generalUserSettings = new KeyCodeStrMap();
})(); })();
export const USER_SETTINGS = {
fromKeyCode: (keyCode: KeyCode) => {
return usUserSettings.fromKeyCode(keyCode);
},
toKeyCode: (str: string) => {
return usUserSettings.toKeyCode(str) || generalUserSettings.toKeyCode(str);
}
};
export namespace KeyCodeUtils { export namespace KeyCodeUtils {
export function toString(keyCode: KeyCode): string { export function toString(keyCode: KeyCode): string {
return ui.fromKeyCode(keyCode); return uiMap.keyCodeToStr(keyCode);
// return STRING.fromKeyCode(keyCode);
} }
export function fromString(key: string): KeyCode { export function fromString(key: string): KeyCode {
return ui.toKeyCode(key); return uiMap.strToKeyCode(key);
// return STRING.toKeyCode(key); }
export function toUserSettingsUS(keyCode: KeyCode): string {
return userSettingsUSMap.keyCodeToStr(keyCode);
}
export function toUserSettingsGeneral(keyCode: KeyCode): string {
return userSettingsGeneralMap.keyCodeToStr(keyCode);
}
export function fromUserSettings(key: string): KeyCode {
return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key);
} }
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
'use strict'; 'use strict';
import { ResolvedKeybinding, ResolvedKeybindingPart, KeyCode, KeyCodeUtils, USER_SETTINGS, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes'; import { ResolvedKeybinding, ResolvedKeybindingPart, KeyCode, KeyCodeUtils, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes';
import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels';
import { OperatingSystem } from 'vs/base/common/platform'; import { OperatingSystem } from 'vs/base/common/platform';
...@@ -127,7 +127,7 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { ...@@ -127,7 +127,7 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding {
if (keybinding.isDuplicateModifierCase()) { if (keybinding.isDuplicateModifierCase()) {
return ''; return '';
} }
return USER_SETTINGS.fromKeyCode(keybinding.keyCode); return KeyCodeUtils.toUserSettingsUS(keybinding.keyCode);
} }
public getUserSettingsLabel(): string { public getUserSettingsLabel(): string {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
'use strict'; 'use strict';
import { USER_SETTINGS, Keybinding, SimpleKeybinding, ChordKeybinding } from 'vs/base/common/keyCodes'; import { Keybinding, SimpleKeybinding, ChordKeybinding, KeyCodeUtils } from 'vs/base/common/keyCodes';
import { OperatingSystem } from 'vs/base/common/platform'; import { OperatingSystem } from 'vs/base/common/platform';
import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
...@@ -119,7 +119,7 @@ export class KeybindingIO { ...@@ -119,7 +119,7 @@ export class KeybindingIO {
private static _readSimpleKeybinding(input: string): [SimpleKeybinding, string] { private static _readSimpleKeybinding(input: string): [SimpleKeybinding, string] {
const mods = this._readModifiers(input); const mods = this._readModifiers(input);
const keyCode = USER_SETTINGS.toKeyCode(mods.key); const keyCode = KeyCodeUtils.fromUserSettings(mods.key);
return [new SimpleKeybinding(mods.ctrl, mods.shift, mods.alt, mods.meta, keyCode), mods.remains]; return [new SimpleKeybinding(mods.ctrl, mods.shift, mods.alt, mods.meta, keyCode), mods.remains];
} }
...@@ -148,7 +148,7 @@ export class KeybindingIO { ...@@ -148,7 +148,7 @@ export class KeybindingIO {
const scanCode = ScanCodeUtils.lowerCaseToEnum(strScanCode); const scanCode = ScanCodeUtils.lowerCaseToEnum(strScanCode);
return [new ScanCodeBinding(mods.ctrl, mods.shift, mods.alt, mods.meta, scanCode), mods.remains]; return [new ScanCodeBinding(mods.ctrl, mods.shift, mods.alt, mods.meta, scanCode), mods.remains];
} }
const keyCode = USER_SETTINGS.toKeyCode(mods.key); const keyCode = KeyCodeUtils.fromUserSettings(mods.key);
return [new SimpleKeybinding(mods.ctrl, mods.shift, mods.alt, mods.meta, keyCode), mods.remains]; return [new SimpleKeybinding(mods.ctrl, mods.shift, mods.alt, mods.meta, keyCode), mods.remains];
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
'use strict'; 'use strict';
import { OperatingSystem } from 'vs/base/common/platform'; import { OperatingSystem } from 'vs/base/common/platform';
import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, ResolvedKeybindingPart } from 'vs/base/common/keyCodes';
import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode';
import { CharCode } from 'vs/base/common/charCode'; import { CharCode } from 'vs/base/common/charCode';
import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels';
...@@ -926,7 +926,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { ...@@ -926,7 +926,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper {
const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[binding.scanCode]; const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[binding.scanCode];
if (immutableKeyCode !== -1) { if (immutableKeyCode !== -1) {
return USER_SETTINGS.fromKeyCode(immutableKeyCode).toLowerCase(); return KeyCodeUtils.toUserSettingsUS(immutableKeyCode).toLowerCase();
} }
// Check if this scanCode always maps to the same keyCode and back // Check if this scanCode always maps to the same keyCode and back
...@@ -937,7 +937,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { ...@@ -937,7 +937,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper {
for (let i = 0, len = reverseBindings.length; i < len; i++) { for (let i = 0, len = reverseBindings.length; i < len; i++) {
const reverseBinding = reverseBindings[i]; const reverseBinding = reverseBindings[i];
if (reverseBinding.scanCode === binding.scanCode) { if (reverseBinding.scanCode === binding.scanCode) {
return USER_SETTINGS.fromKeyCode(constantKeyCode).toLowerCase(); return KeyCodeUtils.toUserSettingsUS(constantKeyCode).toLowerCase();
} }
} }
} }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
'use strict'; 'use strict';
import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, ResolvedKeybindingPart } from 'vs/base/common/keyCodes';
import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode';
import { CharCode } from 'vs/base/common/charCode'; import { CharCode } from 'vs/base/common/charCode';
import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels';
...@@ -171,7 +171,10 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { ...@@ -171,7 +171,10 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding {
if (keybinding.isDuplicateModifierCase()) { if (keybinding.isDuplicateModifierCase()) {
return ''; return '';
} }
return USER_SETTINGS.fromKeyCode(keybinding.keyCode); if (this._mapper.isUSStandard) {
return KeyCodeUtils.toUserSettingsUS(keybinding.keyCode);
}
return KeyCodeUtils.toUserSettingsGeneral(keybinding.keyCode);
} }
public getUserSettingsLabel(): string { public getUserSettingsLabel(): string {
...@@ -273,12 +276,14 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { ...@@ -273,12 +276,14 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding {
export class WindowsKeyboardMapper implements IKeyboardMapper { export class WindowsKeyboardMapper implements IKeyboardMapper {
public readonly isUSStandard: boolean;
private readonly _codeInfo: IScanCodeMapping[]; private readonly _codeInfo: IScanCodeMapping[];
private readonly _scanCodeToKeyCode: KeyCode[]; private readonly _scanCodeToKeyCode: KeyCode[];
private readonly _keyCodeToLabel: string[] = []; private readonly _keyCodeToLabel: string[] = [];
private readonly _keyCodeExists: boolean[]; private readonly _keyCodeExists: boolean[];
constructor(rawMappings: IWindowsKeyboardMapping) { constructor(isUSStandard: boolean, rawMappings: IWindowsKeyboardMapping) {
this.isUSStandard = isUSStandard;
this._scanCodeToKeyCode = []; this._scanCodeToKeyCode = [];
this._keyCodeToLabel = []; this._keyCodeToLabel = [];
this._keyCodeExists = []; this._keyCodeExists = [];
......
...@@ -126,8 +126,9 @@ export class KeyboardMapperFactory { ...@@ -126,8 +126,9 @@ export class KeyboardMapperFactory {
} }
private static _createKeyboardMapper(isISOKeyboard: boolean, layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): IKeyboardMapper { private static _createKeyboardMapper(isISOKeyboard: boolean, layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): IKeyboardMapper {
const isUSStandard = KeyboardMapperFactory._isUSStandard(layoutInfo);
if (OS === OperatingSystem.Windows) { if (OS === OperatingSystem.Windows) {
return new WindowsKeyboardMapper(<IWindowsKeyboardMapping>rawMapping); return new WindowsKeyboardMapper(isUSStandard, <IWindowsKeyboardMapping>rawMapping);
} }
if (Object.keys(rawMapping).length === 0) { if (Object.keys(rawMapping).length === 0) {
...@@ -143,7 +144,6 @@ export class KeyboardMapperFactory { ...@@ -143,7 +144,6 @@ export class KeyboardMapperFactory {
} }
} }
const isUSStandard = KeyboardMapperFactory._isUSStandard(layoutInfo);
return new MacLinuxKeyboardMapper(isISOKeyboard, isUSStandard, <IMacLinuxKeyboardMapping>rawMapping, OS); return new MacLinuxKeyboardMapper(isISOKeyboard, isUSStandard, <IMacLinuxKeyboardMapping>rawMapping, OS);
} }
......
...@@ -14,9 +14,9 @@ import { ScanCodeBinding, ScanCode } from 'vs/workbench/services/keybinding/comm ...@@ -14,9 +14,9 @@ import { ScanCodeBinding, ScanCode } from 'vs/workbench/services/keybinding/comm
const WRITE_FILE_IF_DIFFERENT = false; const WRITE_FILE_IF_DIFFERENT = false;
function createKeyboardMapper(file: string): TPromise<WindowsKeyboardMapper> { function createKeyboardMapper(isUSStandard: boolean, file: string): TPromise<WindowsKeyboardMapper> {
return readRawMapping<IWindowsKeyboardMapping>(file).then((rawMappings) => { return readRawMapping<IWindowsKeyboardMapping>(file).then((rawMappings) => {
return new WindowsKeyboardMapper(rawMappings); return new WindowsKeyboardMapper(isUSStandard, rawMappings);
}); });
} }
...@@ -29,7 +29,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -29,7 +29,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
let mapper: WindowsKeyboardMapper; let mapper: WindowsKeyboardMapper;
suiteSetup((done) => { suiteSetup((done) => {
createKeyboardMapper('win_de_ch').then((_mapper) => { createKeyboardMapper(false, 'win_de_ch').then((_mapper) => {
mapper = _mapper; mapper = _mapper;
done(); done();
}, done); }, done);
...@@ -102,7 +102,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -102,7 +102,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Ctrl+^', label: 'Ctrl+^',
ariaLabel: 'Control+^', ariaLabel: 'Control+^',
electronAccelerator: 'Ctrl+]', electronAccelerator: 'Ctrl+]',
userSettingsLabel: 'ctrl+]', userSettingsLabel: 'ctrl+oem_6',
isWYSIWYG: false, isWYSIWYG: false,
isChord: false, isChord: false,
dispatchParts: ['ctrl+]', null], dispatchParts: ['ctrl+]', null],
...@@ -125,7 +125,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -125,7 +125,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Ctrl+^', label: 'Ctrl+^',
ariaLabel: 'Control+^', ariaLabel: 'Control+^',
electronAccelerator: 'Ctrl+]', electronAccelerator: 'Ctrl+]',
userSettingsLabel: 'ctrl+]', userSettingsLabel: 'ctrl+oem_6',
isWYSIWYG: false, isWYSIWYG: false,
isChord: false, isChord: false,
dispatchParts: ['ctrl+]', null], dispatchParts: ['ctrl+]', null],
...@@ -141,7 +141,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -141,7 +141,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Shift+^', label: 'Shift+^',
ariaLabel: 'Shift+^', ariaLabel: 'Shift+^',
electronAccelerator: 'Shift+]', electronAccelerator: 'Shift+]',
userSettingsLabel: 'shift+]', userSettingsLabel: 'shift+oem_6',
isWYSIWYG: false, isWYSIWYG: false,
isChord: false, isChord: false,
dispatchParts: ['shift+]', null], dispatchParts: ['shift+]', null],
...@@ -157,7 +157,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -157,7 +157,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Ctrl+§', label: 'Ctrl+§',
ariaLabel: 'Control+§', ariaLabel: 'Control+§',
electronAccelerator: 'Ctrl+/', electronAccelerator: 'Ctrl+/',
userSettingsLabel: 'ctrl+/', userSettingsLabel: 'ctrl+oem_2',
isWYSIWYG: false, isWYSIWYG: false,
isChord: false, isChord: false,
dispatchParts: ['ctrl+/', null], dispatchParts: ['ctrl+/', null],
...@@ -173,7 +173,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -173,7 +173,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Ctrl+Shift+§', label: 'Ctrl+Shift+§',
ariaLabel: 'Control+Shift+§', ariaLabel: 'Control+Shift+§',
electronAccelerator: 'Ctrl+Shift+/', electronAccelerator: 'Ctrl+Shift+/',
userSettingsLabel: 'ctrl+shift+/', userSettingsLabel: 'ctrl+shift+oem_2',
isWYSIWYG: false, isWYSIWYG: false,
isChord: false, isChord: false,
dispatchParts: ['ctrl+shift+/', null], dispatchParts: ['ctrl+shift+/', null],
...@@ -189,7 +189,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -189,7 +189,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Ctrl+K Ctrl+ä', label: 'Ctrl+K Ctrl+ä',
ariaLabel: 'Control+K Control+ä', ariaLabel: 'Control+K Control+ä',
electronAccelerator: null, electronAccelerator: null,
userSettingsLabel: 'ctrl+k ctrl+\\', userSettingsLabel: 'ctrl+k ctrl+oem_5',
isWYSIWYG: false, isWYSIWYG: false,
isChord: true, isChord: true,
dispatchParts: ['ctrl+K', 'ctrl+\\'], dispatchParts: ['ctrl+K', 'ctrl+\\'],
...@@ -285,7 +285,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { ...@@ -285,7 +285,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => {
label: 'Ctrl+, Ctrl+§', label: 'Ctrl+, Ctrl+§',
ariaLabel: 'Control+, Control+§', ariaLabel: 'Control+, Control+§',
electronAccelerator: null, electronAccelerator: null,
userSettingsLabel: 'ctrl+, ctrl+/', userSettingsLabel: 'ctrl+oem_comma ctrl+oem_2',
isWYSIWYG: false, isWYSIWYG: false,
isChord: true, isChord: true,
dispatchParts: ['ctrl+,', 'ctrl+/'], dispatchParts: ['ctrl+,', 'ctrl+/'],
...@@ -322,7 +322,7 @@ suite('keyboardMapper - WINDOWS en_us', () => { ...@@ -322,7 +322,7 @@ suite('keyboardMapper - WINDOWS en_us', () => {
let mapper: WindowsKeyboardMapper; let mapper: WindowsKeyboardMapper;
suiteSetup((done) => { suiteSetup((done) => {
createKeyboardMapper('win_en_us').then((_mapper) => { createKeyboardMapper(true, 'win_en_us').then((_mapper) => {
mapper = _mapper; mapper = _mapper;
done(); done();
}, done); }, done);
...@@ -412,7 +412,7 @@ suite('keyboardMapper - WINDOWS por_ptb', () => { ...@@ -412,7 +412,7 @@ suite('keyboardMapper - WINDOWS por_ptb', () => {
let mapper: WindowsKeyboardMapper; let mapper: WindowsKeyboardMapper;
suiteSetup((done) => { suiteSetup((done) => {
createKeyboardMapper('win_por_ptb').then((_mapper) => { createKeyboardMapper(false, 'win_por_ptb').then((_mapper) => {
mapper = _mapper; mapper = _mapper;
done(); done();
}, done); }, done);
...@@ -471,7 +471,7 @@ suite('keyboardMapper - WINDOWS por_ptb', () => { ...@@ -471,7 +471,7 @@ suite('keyboardMapper - WINDOWS por_ptb', () => {
suite('misc', () => { suite('misc', () => {
test('issue #23513: Toggle Sidebar Visibility and Go to Line display same key mapping in Arabic keyboard', () => { test('issue #23513: Toggle Sidebar Visibility and Go to Line display same key mapping in Arabic keyboard', () => {
const mapper = new WindowsKeyboardMapper({ const mapper = new WindowsKeyboardMapper(false, {
'KeyB': { 'KeyB': {
'vkey': 'VK_B', 'vkey': 'VK_B',
'value': 'لا', 'value': 'لا',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册