diff --git a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs index 30c493e..c56e060 100644 --- a/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs +++ b/src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs @@ -33,7 +33,10 @@ public static partial class AnsiConsoleExtensions if (key.Key == ConsoleKey.Tab && autocomplete.Count > 0) { - var replace = AutoComplete(autocomplete, text); + var autoCompleteDirection = key.Modifiers.HasFlag(ConsoleModifiers.Shift) + ? AutoCompleteDirection.Backward + : AutoCompleteDirection.Forward; + var replace = AutoComplete(autocomplete, text, autoCompleteDirection); if (!string.IsNullOrEmpty(replace)) { // Render the suggestion @@ -63,7 +66,7 @@ public static partial class AnsiConsoleExtensions } } - private static string AutoComplete(List autocomplete, string text) + private static string AutoComplete(List autocomplete, string text, AutoCompleteDirection autoCompleteDirection) { var found = autocomplete.Find(i => i == text); var replace = string.Empty; @@ -85,15 +88,38 @@ public static partial class AnsiConsoleExtensions else { // Get the next match - var index = autocomplete.IndexOf(found) + 1; - if (index >= autocomplete.Count) - { - index = 0; - } - - replace = autocomplete[index]; + replace = GetAutocompleteValue(autoCompleteDirection, autocomplete, found); } return replace; } + + private static string GetAutocompleteValue(AutoCompleteDirection autoCompleteDirection, IList autocomplete, string found) + { + var foundAutocompleteIndex = autocomplete.IndexOf(found); + var index = autoCompleteDirection switch + { + AutoCompleteDirection.Forward => foundAutocompleteIndex + 1, + AutoCompleteDirection.Backward => foundAutocompleteIndex - 1, + _ => throw new ArgumentOutOfRangeException(nameof(autoCompleteDirection), autoCompleteDirection, null), + }; + + if (index >= autocomplete.Count) + { + index = 0; + } + + if (index < 0) + { + index = autocomplete.Count - 1; + } + + return autocomplete[index]; + } + + private enum AutoCompleteDirection + { + Forward, + Backward, + } } \ No newline at end of file