private bool TryGetKeyInput(Key key, ModifierKeys modifierKeys, out VimKeyData vimKeyData) { var virtualKeyModifiers = KeyState.GetVirtualKeyModifiers(modifierKeys); if (_virtualKeyboard.UsesExtendedModifiers) { virtualKeyModifiers |= _virtualKeyboard.VirtualKeyModifiersExtended; } if (_virtualKeyboard.IsCapsLockToggled) { virtualKeyModifiers |= VirtualKeyModifiers.CapsLock; } // First just check and see if there is a direct mapping var keyState = new KeyState(key, virtualKeyModifiers); if (_keyStateToVimKeyDataMap.TryGetValue(keyState, out vimKeyData)) { return(true); } // Next consider only the shift key part of the requested modifier. We can // re-apply the original modifiers later keyState = new KeyState(key, virtualKeyModifiers & VirtualKeyModifiers.Shift); if (_keyStateToVimKeyDataMap.TryGetValue(keyState, out vimKeyData) && vimKeyData.KeyInputOptional != null) { // Reapply the modifiers var keyInput = KeyInputUtil.ApplyModifiers(vimKeyData.KeyInputOptional, ConvertToKeyModifiers(modifierKeys)); vimKeyData = new VimKeyData(keyInput, vimKeyData.TextOptional); return(true); } // Last consider it without any modifiers and reapply keyState = new KeyState(key, VirtualKeyModifiers.None); if (_keyStateToVimKeyDataMap.TryGetValue(keyState, out vimKeyData) && vimKeyData.KeyInputOptional != null) { // Reapply the modifiers var keyInput = KeyInputUtil.ApplyModifiers(vimKeyData.KeyInputOptional, ConvertToKeyModifiers(modifierKeys)); vimKeyData = new VimKeyData(keyInput, vimKeyData.TextOptional); return(true); } return(false); }