Example #1
0
    async Task IKeyPressHandler.OnKeyDown(KeyPress key, CancellationToken cancellationToken)
    {
        if (!EnoughRoomToDisplay(this.codePane))
        {
            return;
        }

        var completionListTriggered = configuration.KeyBindings.TriggerCompletionList.Matches(key.ConsoleKeyInfo);

        completionListTriggeredOnKeyDown = completionListTriggered;
        lastSpanToReplaceOnKeyDown       = null;

        if (IsOpen)
        {
            var documentText  = codePane.Document.GetText();
            int documentCaret = codePane.Document.Caret;
            var spanToReplace = await promptCallbacks.GetSpanToReplaceByCompletionkAsync(documentText, documentCaret, cancellationToken).ConfigureAwait(false);

            lastSpanToReplaceOnKeyDown = spanToReplace;

            switch (key.ObjectPattern)
            {
            case Home or(_, Home):
            case End or(_, End):
            case (Shift, LeftArrow or RightArrow or UpArrow or DownArrow or Home or End) or
                    (Control | Shift, LeftArrow or RightArrow or UpArrow or DownArrow or Home or End) or
                    (Control, A):
                Close();

                return;

            case LeftArrow or RightArrow:
                int caretNew = documentCaret + (key.ConsoleKeyInfo.Key == LeftArrow ? -1 : 1);
                if (caretNew < spanToReplace.Start || caretNew > spanToReplace.Start + spanToReplace.Length)
                {
                    Close();
                    return;
                }
                break;

            case Escape:
                Close();
                key.Handled = true;
                return;

            default:
                break;
            }
        }
        else
        {
            if (completionListTriggered)
            {
                if (codePane.Selection is null)
                {
                    Open();
                }
                key.Handled = true;
            }
            return;
        }

        Debug.Assert(IsOpen);
        if (FilteredView.IsEmpty)
        {
            if (completionListTriggered)
            {
                Close();
                Open();
                key.Handled = true;
            }
            return;
        }

        //completion list is open and there are some items
        switch (key.ObjectPattern)
        {
        case DownArrow:
            this.FilteredView.IncrementSelectedIndex();
            key.Handled = true;
            break;

        case UpArrow:
            this.FilteredView.DecrementSelectedIndex();
            key.Handled = true;
            break;

        case var _ when configuration.KeyBindings.TriggerCompletionList.Matches(key.ConsoleKeyInfo):
            key.Handled = true;

            break;

        default:
            if (FilteredView.SelectedItem is null)
            {
                if (configuration.KeyBindings.CommitCompletion.Matches(key.ConsoleKeyInfo))
                {
                    Close();
                }
            }
            else if (configuration.KeyBindings.CommitCompletion.Matches(key.ConsoleKeyInfo, FilteredView.SelectedItem.CommitCharacterRules))
            {
                await InsertCompletion(codePane, FilteredView.SelectedItem, cancellationToken).ConfigureAwait(false);

                key.Handled = char.IsControl(key.ConsoleKeyInfo.KeyChar);
            }
            break;
        }
    }