diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index d5d5ee6e4cad62..7e7d838f3238a3 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -7,6 +7,7 @@ import { CharCode } from '../../../../base/common/charCode.js'; import { KeyCode, KeyCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, ScanCode, ScanCodeUtils, isModifierKey } from '../../../../base/common/keyCodes.js'; import { ResolvedKeybinding, KeyCodeChord, SingleModifierChord, ScanCodeChord, Keybinding, Chord } from '../../../../base/common/keybindings.js'; import { OperatingSystem } from '../../../../base/common/platform.js'; +import { hasKey } from '../../../../base/common/types.js'; import { IKeyboardEvent } from '../../../../platform/keybinding/common/keybinding.js'; import { IKeyboardMapper } from '../../../../platform/keyboardLayout/common/keyboardMapper.js'; import { BaseResolvedKeybinding } from '../../../../platform/keybinding/common/baseResolvedKeybinding.js'; @@ -19,6 +20,11 @@ import { IMacLinuxKeyboardMapping, IMacLinuxKeyMapping } from '../../../../platf * - '?' => { keyCode: KeyCode.US_SLASH, shiftKey: true } */ const CHAR_CODE_TO_KEY_CODE: ({ keyCode: KeyCode; shiftKey: boolean } | null)[] = []; +const ELECTRON_SHIFTED_ACCELERATOR_CHARACTERS = '!"#$%&()*+:<>?@^_{|}~'; +const ELECTRON_NAMED_ACCELERATOR_CHARACTERS = new Map([ + [CharCode.Space, 'Space'], + [CharCode.Plus, 'Plus'], +]); export class NativeResolvedKeybinding extends BaseResolvedKeybinding { @@ -909,9 +915,34 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return KeyCodeUtils.toElectronAccelerator(constantKeyCode); } + if (this._OS === OperatingSystem.Macintosh) { + return this._getElectronAcceleratorLabelForUnstableScanCode(chord); + } + return null; } + private _getElectronAcceleratorLabelForUnstableScanCode(chord: ScanCodeChord): string | null { + const mapping = this._codeInfo[chord.scanCode]; + if (!mapping) { + return null; + } + + if (hasKey(mapping, { valueIsDeadKey: true }) && mapping.valueIsDeadKey) { + return null; + } + + const charCode = MacLinuxKeyboardMapper._redirectCharCode(MacLinuxKeyboardMapper.getCharCode(mapping.value)); + const character = String.fromCharCode(charCode); + const isPrintableAscii = charCode >= CharCode.Space && charCode <= CharCode.Tilde; + const isUppercaseLetter = charCode >= CharCode.A && charCode <= CharCode.Z; + if (!isPrintableAscii || isUppercaseLetter || (chord.shiftKey && ELECTRON_SHIFTED_ACCELERATOR_CHARACTERS.includes(character))) { + return null; + } + + return ELECTRON_NAMED_ACCELERATOR_CHARACTERS.get(charCode) ?? character; + } + private _toResolvedKeybinding(chordParts: ScanCodeChord[][]): NativeResolvedKeybinding[] { if (chordParts.length === 0) { return []; diff --git a/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts index fd394866237a35..71c5a987da5c4c 100644 --- a/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/node/macLinuxKeyboardMapper.test.ts @@ -213,7 +213,7 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⇧⌘\'', ariaLabel: 'Shift+Command+\'', - electronAccelerator: null, + electronAccelerator: 'Shift+Cmd+\'', userSettingsLabel: 'shift+cmd+[Minus]', isWYSIWYG: false, isMultiChord: false, @@ -1805,6 +1805,65 @@ suite('keyboardMapper - MAC zh_hant2', () => { }); }); +suite('keyboardMapper - MAC layout-dependent accelerators', () => { + + ensureNoDisposablesAreLeakedInTestSuite(); + + function resolveElectronAccelerator(value: string, withShift: string, shiftKey = false, valueIsDeadKey = false): string | null { + const mapper = new MacLinuxKeyboardMapper(false, { + Equal: { + value, + valueIsDeadKey, + withShift, + withShiftIsDeadKey: false, + withAltGr: '', + withAltGrIsDeadKey: false, + withShiftAltGr: '', + withShiftAltGrIsDeadKey: false, + } + }, false, OperatingSystem.Macintosh); + + const keybinding = mapper.resolveKeyboardEvent({ + _standardKeyboardEventBrand: true, + ctrlKey: false, + shiftKey, + altKey: false, + metaKey: true, + altGraphKey: false, + keyCode: KeyCode.DependsOnKbLayout, + code: 'Equal' + }); + + return keybinding.getElectronAccelerator(); + } + + test('uses the produced character when the scan code has no stable key code', () => { + assert.deepStrictEqual({ + plus: resolveElectronAccelerator('+', ':'), + space: resolveElectronAccelerator(' ', ':'), + digit: resolveElectronAccelerator('1', ':'), + questionMark: resolveElectronAccelerator('?', 'é'), + shiftedApostrophe: resolveElectronAccelerator('\'', '?', true), + shiftedPlus: resolveElectronAccelerator('+', ':', true), + shiftedExclamationMark: resolveElectronAccelerator('!', ':', true), + deadKey: resolveElectronAccelerator('`', ':', false, true), + uppercase: resolveElectronAccelerator('A', ':'), + unsupported: resolveElectronAccelerator('é', 'É'), + }, { + plus: 'Cmd+Plus', + space: 'Cmd+Space', + digit: 'Cmd+1', + questionMark: 'Cmd+?', + shiftedApostrophe: 'Shift+Cmd+\'', + shiftedPlus: null, + shiftedExclamationMark: null, + deadKey: null, + uppercase: null, + unsupported: null, + }); + }); +}); + function _assertKeybindingTranslation(mapper: MacLinuxKeyboardMapper, OS: OperatingSystem, kb: number, _expected: string | string[]): void { let expected: string[]; if (typeof _expected === 'string') { diff --git a/src/vs/workbench/services/keybinding/test/node/mac_de_ch.txt b/src/vs/workbench/services/keybinding/test/node/mac_de_ch.txt index 60627a704dc571..351332f9a95827 100644 --- a/src/vs/workbench/services/keybinding/test/node/mac_de_ch.txt +++ b/src/vs/workbench/services/keybinding/test/node/mac_de_ch.txt @@ -366,14 +366,14 @@ isUSStandard: false ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| Minus | ' | ' | | ' | [Minus] | null | [Minus] | NO | -| Ctrl+Minus | ' | Ctrl+' | | Ctrl+' | ctrl+[Minus] | null | ctrl+[Minus] | NO | -| Shift+Minus | ? | Shift+/ | | Shift+' | shift+[Minus] | null | shift+[Minus] | NO | -| Ctrl+Shift+Minus | ? | Ctrl+Shift+/ | | Ctrl+Shift+' | ctrl+shift+[Minus] | null | ctrl+shift+[Minus] | NO | -| Alt+Minus | ' | Alt+' | | Option+' | alt+[Minus] | null | alt+[Minus] | NO | -| Ctrl+Alt+Minus | ¿ | Ctrl+Alt+' | | Ctrl+Option+' | ctrl+alt+[Minus] | null | ctrl+alt+[Minus] | NO | -| Shift+Alt+Minus | ? | Shift+Alt+/ | | Shift+Option+' | shift+alt+[Minus] | null | shift+alt+[Minus] | NO | -| Ctrl+Shift+Alt+Minus |  | Ctrl+Shift+Alt+/ | | Ctrl+Shift+Option+' | ctrl+shift+alt+[Minus] | null | ctrl+shift+alt+[Minus] | NO | +| Minus | ' | ' | | ' | [Minus] | ' | [Minus] | NO | +| Ctrl+Minus | ' | Ctrl+' | | Ctrl+' | ctrl+[Minus] | Ctrl+' | ctrl+[Minus] | NO | +| Shift+Minus | ? | Shift+/ | | Shift+' | shift+[Minus] | Shift+' | shift+[Minus] | NO | +| Ctrl+Shift+Minus | ? | Ctrl+Shift+/ | | Ctrl+Shift+' | ctrl+shift+[Minus] | Ctrl+Shift+' | ctrl+shift+[Minus] | NO | +| Alt+Minus | ' | Alt+' | | Option+' | alt+[Minus] | Alt+' | alt+[Minus] | NO | +| Ctrl+Alt+Minus | ¿ | Ctrl+Alt+' | | Ctrl+Option+' | ctrl+alt+[Minus] | Ctrl+Alt+' | ctrl+alt+[Minus] | NO | +| Shift+Alt+Minus | ? | Shift+Alt+/ | | Shift+Option+' | shift+alt+[Minus] | Shift+Alt+' | shift+alt+[Minus] | NO | +| Ctrl+Shift+Alt+Minus |  | Ctrl+Shift+Alt+/ | | Ctrl+Shift+Option+' | ctrl+shift+alt+[Minus] | Ctrl+Shift+Alt+' | ctrl+shift+alt+[Minus] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Equal | ^ | | | ^ | [Equal] | null | [Equal] | NO | | Ctrl+Equal | ^ | | | Ctrl+^ | ctrl+[Equal] | null | ctrl+[Equal] | NO | @@ -404,12 +404,12 @@ isUSStandard: false ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| Backslash | $ | | | $ | [Backslash] | null | [Backslash] | NO | -| Ctrl+Backslash | $ | | | Ctrl+$ | ctrl+[Backslash] | null | ctrl+[Backslash] | NO | +| Backslash | $ | | | $ | [Backslash] | $ | [Backslash] | NO | +| Ctrl+Backslash | $ | | | Ctrl+$ | ctrl+[Backslash] | Ctrl+$ | ctrl+[Backslash] | NO | | Shift+Backslash | £ | | | Shift+$ | shift+[Backslash] | null | shift+[Backslash] | NO | | Ctrl+Shift+Backslash | £ | | | Ctrl+Shift+$ | ctrl+shift+[Backslash] | null | ctrl+shift+[Backslash] | NO | -| Alt+Backslash | $ | | | Option+$ | alt+[Backslash] | null | alt+[Backslash] | NO | -| Ctrl+Alt+Backslash | ¶ | | | Ctrl+Option+$ | ctrl+alt+[Backslash] | null | ctrl+alt+[Backslash] | NO | +| Alt+Backslash | $ | | | Option+$ | alt+[Backslash] | Alt+$ | alt+[Backslash] | NO | +| Ctrl+Alt+Backslash | ¶ | | | Ctrl+Option+$ | ctrl+alt+[Backslash] | Ctrl+Alt+$ | ctrl+alt+[Backslash] | NO | | Shift+Alt+Backslash | £ | | | Shift+Option+$ | shift+alt+[Backslash] | null | shift+alt+[Backslash] | NO | | Ctrl+Shift+Alt+Backslash | • | | | Ctrl+Shift+Option+$ | ctrl+shift+alt+[Backslash] | null | ctrl+shift+alt+[Backslash] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -442,32 +442,32 @@ isUSStandard: false ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| Backquote | < | Shift+, | | < | [Backquote] | null | [Backquote] | NO | -| Ctrl+Backquote | < | Ctrl+Shift+, | | Ctrl+< | ctrl+[Backquote] | null | ctrl+[Backquote] | NO | +| Backquote | < | Shift+, | | < | [Backquote] | < | [Backquote] | NO | +| Ctrl+Backquote | < | Ctrl+Shift+, | | Ctrl+< | ctrl+[Backquote] | Ctrl+< | ctrl+[Backquote] | NO | | Shift+Backquote | > | Shift+. | | Shift+< | shift+[Backquote] | null | shift+[Backquote] | NO | | Ctrl+Shift+Backquote | > | Ctrl+Shift+. | | Ctrl+Shift+< | ctrl+shift+[Backquote] | null | ctrl+shift+[Backquote] | NO | -| Alt+Backquote | < | Shift+Alt+, | | Option+< | alt+[Backquote] | null | alt+[Backquote] | NO | -| Ctrl+Alt+Backquote | ≤ | Ctrl+Shift+Alt+, | | Ctrl+Option+< | ctrl+alt+[Backquote] | null | ctrl+alt+[Backquote] | NO | +| Alt+Backquote | < | Shift+Alt+, | | Option+< | alt+[Backquote] | Alt+< | alt+[Backquote] | NO | +| Ctrl+Alt+Backquote | ≤ | Ctrl+Shift+Alt+, | | Ctrl+Option+< | ctrl+alt+[Backquote] | Ctrl+Alt+< | ctrl+alt+[Backquote] | NO | | Shift+Alt+Backquote | > | Shift+Alt+. | | Shift+Option+< | shift+alt+[Backquote] | null | shift+alt+[Backquote] | NO | | Ctrl+Shift+Alt+Backquote | ≥ | Ctrl+Shift+Alt+. | | Ctrl+Shift+Option+< | ctrl+shift+alt+[Backquote] | null | ctrl+shift+alt+[Backquote] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| Comma | , | , | | , | [Comma] | null | [Comma] | NO | -| Ctrl+Comma | , | Ctrl+, | | Ctrl+, | ctrl+[Comma] | null | ctrl+[Comma] | NO | -| Shift+Comma | ; | ; | | Shift+, | shift+[Comma] | null | shift+[Comma] | NO | -| Ctrl+Shift+Comma | ; | Ctrl+; | | Ctrl+Shift+, | ctrl+shift+[Comma] | null | ctrl+shift+[Comma] | NO | -| Alt+Comma | , | Alt+, | | Option+, | alt+[Comma] | null | alt+[Comma] | NO | -| Ctrl+Alt+Comma | « | Ctrl+Alt+, | | Ctrl+Option+, | ctrl+alt+[Comma] | null | ctrl+alt+[Comma] | NO | -| Shift+Alt+Comma | ; | Alt+; | | Shift+Option+, | shift+alt+[Comma] | null | shift+alt+[Comma] | NO | -| Ctrl+Shift+Alt+Comma | » | Ctrl+Alt+; | | Ctrl+Shift+Option+, | ctrl+shift+alt+[Comma] | null | ctrl+shift+alt+[Comma] | NO | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| Period | . | . | | . | [Period] | null | [Period] | NO | -| Ctrl+Period | . | Ctrl+. | | Ctrl+. | ctrl+[Period] | null | ctrl+[Period] | NO | -| Shift+Period | : | Shift+; | | Shift+. | shift+[Period] | null | shift+[Period] | NO | -| Ctrl+Shift+Period | : | Ctrl+Shift+; | | Ctrl+Shift+. | ctrl+shift+[Period] | null | ctrl+shift+[Period] | NO | -| Alt+Period | . | Alt+. | | Option+. | alt+[Period] | null | alt+[Period] | NO | -| Ctrl+Alt+Period | … | Ctrl+Alt+. | | Ctrl+Option+. | ctrl+alt+[Period] | null | ctrl+alt+[Period] | NO | -| Shift+Alt+Period | : | Shift+Alt+; | | Shift+Option+. | shift+alt+[Period] | null | shift+alt+[Period] | NO | -| Ctrl+Shift+Alt+Period | ÷ | Ctrl+Shift+Alt+; | | Ctrl+Shift+Option+. | ctrl+shift+alt+[Period] | null | ctrl+shift+alt+[Period] | NO | +| Comma | , | , | | , | [Comma] | , | [Comma] | NO | +| Ctrl+Comma | , | Ctrl+, | | Ctrl+, | ctrl+[Comma] | Ctrl+, | ctrl+[Comma] | NO | +| Shift+Comma | ; | ; | | Shift+, | shift+[Comma] | Shift+, | shift+[Comma] | NO | +| Ctrl+Shift+Comma | ; | Ctrl+; | | Ctrl+Shift+, | ctrl+shift+[Comma] | Ctrl+Shift+, | ctrl+shift+[Comma] | NO | +| Alt+Comma | , | Alt+, | | Option+, | alt+[Comma] | Alt+, | alt+[Comma] | NO | +| Ctrl+Alt+Comma | « | Ctrl+Alt+, | | Ctrl+Option+, | ctrl+alt+[Comma] | Ctrl+Alt+, | ctrl+alt+[Comma] | NO | +| Shift+Alt+Comma | ; | Alt+; | | Shift+Option+, | shift+alt+[Comma] | Shift+Alt+, | shift+alt+[Comma] | NO | +| Ctrl+Shift+Alt+Comma | » | Ctrl+Alt+; | | Ctrl+Shift+Option+, | ctrl+shift+alt+[Comma] | Ctrl+Shift+Alt+, | ctrl+shift+alt+[Comma] | NO | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Period | . | . | | . | [Period] | . | [Period] | NO | +| Ctrl+Period | . | Ctrl+. | | Ctrl+. | ctrl+[Period] | Ctrl+. | ctrl+[Period] | NO | +| Shift+Period | : | Shift+; | | Shift+. | shift+[Period] | Shift+. | shift+[Period] | NO | +| Ctrl+Shift+Period | : | Ctrl+Shift+; | | Ctrl+Shift+. | ctrl+shift+[Period] | Ctrl+Shift+. | ctrl+shift+[Period] | NO | +| Alt+Period | . | Alt+. | | Option+. | alt+[Period] | Alt+. | alt+[Period] | NO | +| Ctrl+Alt+Period | … | Ctrl+Alt+. | | Ctrl+Option+. | ctrl+alt+[Period] | Ctrl+Alt+. | ctrl+alt+[Period] | NO | +| Shift+Alt+Period | : | Shift+Alt+; | | Shift+Option+. | shift+alt+[Period] | Shift+Alt+. | shift+alt+[Period] | NO | +| Ctrl+Shift+Alt+Period | ÷ | Ctrl+Shift+Alt+; | | Ctrl+Shift+Option+. | ctrl+shift+alt+[Period] | Ctrl+Shift+Alt+. | ctrl+shift+alt+[Period] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Slash | - | - | | - | - | - | [Slash] | | | Ctrl+Slash | - | Ctrl+- | | Ctrl+- | ctrl+- | Ctrl+- | ctrl+[Slash] | | diff --git a/src/vs/workbench/services/keybinding/test/node/mac_zh_hant2.txt b/src/vs/workbench/services/keybinding/test/node/mac_zh_hant2.txt index 17b24363b358cd..ef224c7880d857 100644 --- a/src/vs/workbench/services/keybinding/test/node/mac_zh_hant2.txt +++ b/src/vs/workbench/services/keybinding/test/node/mac_zh_hant2.txt @@ -362,23 +362,23 @@ isUSStandard: false | Shift+Alt+Equal | + | Shift+Alt+= | | Shift+Option+= | shift+alt+= | Shift+Alt+= | shift+alt+[Equal] | | | Ctrl+Shift+Alt+Equal | ± | Ctrl+Shift+Alt+= | | Ctrl+Shift+Option+= | ctrl+shift+alt+= | Ctrl+Shift+Alt+= | ctrl+shift+alt+[Equal] | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| BracketLeft | 【 | [ | 1 | 【 | [BracketLeft] | null | [BracketLeft] | NO | -| Ctrl+BracketLeft | 【 | Ctrl+[ | 1 | Ctrl+【 | ctrl+[BracketLeft] | null | ctrl+[BracketLeft] | NO | -| Shift+BracketLeft | 「 | [ | 2 | Shift+【 | shift+[BracketLeft] | null | shift+[BracketLeft] | NO | -| Ctrl+Shift+BracketLeft | 「 | Ctrl+[ | 2 | Ctrl+Shift+【 | ctrl+shift+[BracketLeft] | null | ctrl+shift+[BracketLeft] | NO | -| Alt+BracketLeft | 【 | Alt+[ | 1 | Option+【 | alt+[BracketLeft] | null | alt+[BracketLeft] | NO | -| Ctrl+Alt+BracketLeft | “ | Ctrl+Alt+[ | 1 | Ctrl+Option+【 | ctrl+alt+[BracketLeft] | null | ctrl+alt+[BracketLeft] | NO | -| Shift+Alt+BracketLeft | 「 | Alt+[ | 2 | Shift+Option+【 | shift+alt+[BracketLeft] | null | shift+alt+[BracketLeft] | NO | -| Ctrl+Shift+Alt+BracketLeft | ” | Ctrl+Alt+[ | 2 | Ctrl+Shift+Option+【 | ctrl+shift+alt+[BracketLeft] | null | ctrl+shift+alt+[BracketLeft] | NO | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -| BracketRight | 】 | ] | 1 | 】 | [BracketRight] | null | [BracketRight] | NO | -| Ctrl+BracketRight | 】 | Ctrl+] | 1 | Ctrl+】 | ctrl+[BracketRight] | null | ctrl+[BracketRight] | NO | -| Shift+BracketRight | 」 | ] | 2 | Shift+】 | shift+[BracketRight] | null | shift+[BracketRight] | NO | -| Ctrl+Shift+BracketRight | 」 | Ctrl+] | 2 | Ctrl+Shift+】 | ctrl+shift+[BracketRight] | null | ctrl+shift+[BracketRight] | NO | -| Alt+BracketRight | 】 | Alt+] | 1 | Option+】 | alt+[BracketRight] | null | alt+[BracketRight] | NO | -| Ctrl+Alt+BracketRight | ‘ | Ctrl+Alt+] | 1 | Ctrl+Option+】 | ctrl+alt+[BracketRight] | null | ctrl+alt+[BracketRight] | NO | -| Shift+Alt+BracketRight | 」 | Alt+] | 2 | Shift+Option+】 | shift+alt+[BracketRight] | null | shift+alt+[BracketRight] | NO | -| Ctrl+Shift+Alt+BracketRight | ’ | Ctrl+Alt+] | 2 | Ctrl+Shift+Option+】 | ctrl+shift+alt+[BracketRight] | null | ctrl+shift+alt+[BracketRight] | NO | +| BracketLeft | 【 | [ | 1 | 【 | [BracketLeft] | [ | [BracketLeft] | NO | +| Ctrl+BracketLeft | 【 | Ctrl+[ | 1 | Ctrl+【 | ctrl+[BracketLeft] | Ctrl+[ | ctrl+[BracketLeft] | NO | +| Shift+BracketLeft | 「 | [ | 2 | Shift+【 | shift+[BracketLeft] | Shift+[ | shift+[BracketLeft] | NO | +| Ctrl+Shift+BracketLeft | 「 | Ctrl+[ | 2 | Ctrl+Shift+【 | ctrl+shift+[BracketLeft] | Ctrl+Shift+[ | ctrl+shift+[BracketLeft] | NO | +| Alt+BracketLeft | 【 | Alt+[ | 1 | Option+【 | alt+[BracketLeft] | Alt+[ | alt+[BracketLeft] | NO | +| Ctrl+Alt+BracketLeft | “ | Ctrl+Alt+[ | 1 | Ctrl+Option+【 | ctrl+alt+[BracketLeft] | Ctrl+Alt+[ | ctrl+alt+[BracketLeft] | NO | +| Shift+Alt+BracketLeft | 「 | Alt+[ | 2 | Shift+Option+【 | shift+alt+[BracketLeft] | Shift+Alt+[ | shift+alt+[BracketLeft] | NO | +| Ctrl+Shift+Alt+BracketLeft | ” | Ctrl+Alt+[ | 2 | Ctrl+Shift+Option+【 | ctrl+shift+alt+[BracketLeft] | Ctrl+Shift+Alt+[ | ctrl+shift+alt+[BracketLeft] | NO | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| BracketRight | 】 | ] | 1 | 】 | [BracketRight] | ] | [BracketRight] | NO | +| Ctrl+BracketRight | 】 | Ctrl+] | 1 | Ctrl+】 | ctrl+[BracketRight] | Ctrl+] | ctrl+[BracketRight] | NO | +| Shift+BracketRight | 」 | ] | 2 | Shift+】 | shift+[BracketRight] | Shift+] | shift+[BracketRight] | NO | +| Ctrl+Shift+BracketRight | 」 | Ctrl+] | 2 | Ctrl+Shift+】 | ctrl+shift+[BracketRight] | Ctrl+Shift+] | ctrl+shift+[BracketRight] | NO | +| Alt+BracketRight | 】 | Alt+] | 1 | Option+】 | alt+[BracketRight] | Alt+] | alt+[BracketRight] | NO | +| Ctrl+Alt+BracketRight | ‘ | Ctrl+Alt+] | 1 | Ctrl+Option+】 | ctrl+alt+[BracketRight] | Ctrl+Alt+] | ctrl+alt+[BracketRight] | NO | +| Shift+Alt+BracketRight | 」 | Alt+] | 2 | Shift+Option+】 | shift+alt+[BracketRight] | Shift+Alt+] | shift+alt+[BracketRight] | NO | +| Ctrl+Shift+Alt+BracketRight | ’ | Ctrl+Alt+] | 2 | Ctrl+Shift+Option+】 | ctrl+shift+alt+[BracketRight] | Ctrl+Shift+Alt+] | ctrl+shift+alt+[BracketRight] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------