From c623e3be0e4a6d6fd14b4db4f25a5e6f96f62a34 Mon Sep 17 00:00:00 2001 From: George Fleming Date: Thu, 21 Apr 2016 16:14:57 -0700 Subject: [PATCH] Add Shift-Tab for reverse traversal --- .../readline.cs | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.PowerShell.CoreConsoleHost/readline.cs b/src/Microsoft.PowerShell.CoreConsoleHost/readline.cs index 3b034656c..9d9e761e8 100644 --- a/src/Microsoft.PowerShell.CoreConsoleHost/readline.cs +++ b/src/Microsoft.PowerShell.CoreConsoleHost/readline.cs @@ -339,7 +339,7 @@ namespace Microsoft.PowerShell.CoreConsoleHost this.OnEnd(); break; case ConsoleKey.Tab: - this.OnTab(); + this.OnTab(!key.Modifiers.HasFlag(ConsoleModifiers.Shift)); break; case ConsoleKey.UpArrow: this.OnUpArrow(nested); @@ -412,7 +412,7 @@ namespace Microsoft.PowerShell.CoreConsoleHost /// /// The Tab key was entered /// - private void OnTab() + private void OnTab(bool forward) { //if the prompt is empty simply return if (String.IsNullOrWhiteSpace(this.buffer.ToString()) || this.buffer.Length == 0){ @@ -420,20 +420,35 @@ namespace Microsoft.PowerShell.CoreConsoleHost } //if the buffer has been modified in any way, get the new command completion - if (previousKeyPress.Key != ConsoleKey.Tab) + if (previousKeyPress.Key == ConsoleKey.Tab) + { + if (cmdCompleteOpt.CompletionMatches.Count == 0) + { + return; + } + + if (forward) + { + tabCompletionPos = (tabCompletionPos < cmdCompleteOpt.CompletionMatches.Count - 1) + ? tabCompletionPos + 1 : 0; + } + else + { + tabCompletionPos = (tabCompletionPos > 0) + ? tabCompletionPos - 1 : cmdCompleteOpt.CompletionMatches.Count -1; + } + } + else { this.preTabBuffer = this.buffer.ToString(); cmdCompleteOpt = CommandCompletion.CompleteInput(this.preTabBuffer, this.current, options, powershell); - } - if (cmdCompleteOpt.CompletionMatches.Count == 0) - { - return; - } + if (cmdCompleteOpt.CompletionMatches.Count == 0) + { + return; + } - if (tabCompletionPos >= cmdCompleteOpt.CompletionMatches.Count) - { - tabCompletionPos = 0; + tabCompletionPos = forward ? 0 : cmdCompleteOpt.CompletionMatches.Count -1; } string tabResult = cmdCompleteOpt.CompletionMatches[tabCompletionPos].CompletionText; @@ -445,8 +460,6 @@ namespace Microsoft.PowerShell.CoreConsoleHost tabResult = GetReplacementTextForDirectory(tabResult, ref moveLeftOneSpace); } - tabCompletionPos++; - //if there is a command for the user before the uncompleted option if (!String.IsNullOrEmpty(tabResult)) {