private void SwitchModeCommon(string modeName, bool isSilent = false)
        {
            bool before = _currentKeybinds.IsEnabledWindowsKeybinds;

            if (_keybindsDic.ContainsKey(modeName))
            {
                _currentKeybinds = _keybindsDic.FirstOrDefault(x => x.Key == modeName).Value;
            }
            else
            {
                if (_keybindsDic.ContainsKey(_settings.Mode))
                {
                    _currentKeybinds = _keybindsDic[_settings.Mode];
                }
                else
                {
                    _currentKeybinds = _keybindsDic[Consts.DefaultMode];
                }
            }
            var keybinds = _currentKeybinds.Keybinds;

            if (_currentKeybinds.IsPrefix)
            {
                _command = (_, keysState) =>
                {
                    if (keybinds.Contains(keysState))
                    {
                        keybinds.Execute(keysState, false);
                    }
                    SwitchMode(_settings.Mode, true);
                    _command = null;
                };
            }

            if (before && !_currentKeybinds.IsEnabledWindowsKeybinds)
            {
                if (_currentKeySet.Keys.Any(x => x.IsModifiersKey()))
                {
                    var keys = _currentKeySet.Keys.Where(x => x.IsModifiersKey()).ToArray();
                    KeyboardAPI.KeyboardOperation.KeyUp(keys);
                }
            }
        }
        public void LoadKeybinds(IKeyboardPluginContext context)
        {
            _keybindsDic.Clear();
            foreach (var keybinds in _settings.KeybindsInMode)
            {
                var defaultKeybinds = context.Keybinds;
                defaultKeybinds = KeyboardAPI.CreateKeybindManager();
                var keybindStorage = new KeybindStorage();
                var oneShotDefined = new Dictionary <KeySet, bool>();
                foreach (var keybind in keybinds.Value.Keybinds)
                {
                    if (keybind.InputKeys == null)
                    {
                        continue;
                    }
                    var keyset           = new KeySet(keybind.InputKeys);
                    var canDefineOneShot = keybind.CanDefineOneShot;
                    if (canDefineOneShot)
                    {
                        oneShotDefined.Add(keyset, canDefineOneShot);
                    }
                    switch (keybind.Type)
                    {
                    case CommandType.SwapKey:
                        if (canDefineOneShot)
                        {
                            keybindStorage.OneShotKeybinds.Add(keyset, () =>
                            {
                                var keys = keybind.OneShot;
                                if (_stateController.Mode == Mode.Visual && ContainsMovingKey(keys))
                                {
                                    KeyboardAPI.KeyboardOperation.SendKeys(new[] { Key.RightShift }.Concat(keys).ToArray());
                                    return;
                                }
                                KeyboardAPI.KeyboardOperation.SendKeys(keys);
                            }, KeyState.Down, true);
                        }
                        defaultKeybinds.Add(keyset, () =>
                        {
                            var keys     = keybind.OutputKeys;
                            var isVisual = _stateController.Mode == Mode.Visual && ContainsMovingKey(keys);
                            if (isVisual)
                            {
                                keys = new[] { Key.RightShift }.Concat(keys).ToArray();
                            }
                            KeyboardAPI.KeyboardOperation.KeyDown(keys);
                            if (isVisual)
                            {
                                KeyboardAPI.KeyboardOperation.KeyUp(Key.RightShift);
                            }
                        }, KeyState.Down, true);
                        defaultKeybinds.Add(keyset, () =>
                        {
                            var keys = keybind.OutputKeys;
                            KeyboardAPI.KeyboardOperation.KeyUp(keys);
                        }, KeyState.Up, true);
                        break;

                    case CommandType.RunEmbeddedCommand:
                        defaultKeybinds.Add(keyset, ParseCommand(keybind.CommandText, keybind.InputKeys), KeyState.Down, true);
                        break;

                    case CommandType.RunUIAssistantCommand:
                        defaultKeybinds.Add(keyset, () =>
                        {
                            var command = keybind.CommandText;
                            if (KeybindsManiacs.UIAssistantAPI.PluginManager.Exists(command))
                            {
                                KeybindsManiacs.UIAssistantAPI.PluginManager.Execute(command);
                            }
                            else
                            {
                                UIAssistantAPI.NotificationAPI.NotifyWarnMessage("Plugin Error", string.Format(KeybindsManiacs.UIAssistantAPI.LocalizationAPI.Localize(TextID.CommandNotFound), command));
                            }
                        }, KeyState.Down, true);
                        break;

                    //case CommandType.RunExtensionCommand:
                    //    break;
                    default:
                        break;
                    }
                }
                keybindStorage.IsEnabledWindowsKeybinds = keybinds.Value.IsEnabledWindowsKeybinds;
                keybindStorage.IsPrefix       = keybinds.Value.IsPrefix;
                keybindStorage.OneShotDefined = oneShotDefined;
                keybindStorage.Keybinds       = defaultKeybinds;
                _keybindsDic.Add(keybinds.Key, keybindStorage);
            }
            SwitchMode(_settings.Mode, true);
        }