/// <summary> /// Handle Tab key, by autocompleting the command /// </summary> void HandleTab() { string searchWord; if (buffer.ToString().Contains(' ')) { searchWord = buffer.ToString().Split(' ').Last(); } else { searchWord = buffer.ToString(); } // Send the word string to Auto tab handler string[] results = TabHelper.GetTabOptions(searchWord.ToLower()); if (results == null || results.Length == 0) { return; } int count = results.Length; bool flagDone = false; // if there is just one matching string, print it to string. if (results.Length == 1) { WriteText(results[0]); } else { int countDisplayedOptions = -1; int p = 0; // find the first character that differs from user entered string for (p = 0; p < results[0].Length; p++) { char c = results[0][p]; for (int i = 1; i < count; i++) { if (results[i].Length < p) { DisplayTabOptions(countDisplayedOptions, results, searchWord); flagDone = true; break; } if (results[i][p] != c) { DisplayTabOptions(countDisplayedOptions, results, searchWord); flagDone = true; break; } } if (!flagDone) { countDisplayedOptions = p; } else { break; } } // Handle the case when the command string is a subset of another existing command string // Eg. setbladepowerlimit is a subset of setbladepowerlimiton/off if (!flagDone) { countDisplayedOptions = p - 1; DisplayTabOptions(countDisplayedOptions, results, searchWord); } } }
/// <summary> /// Handle tab auto completion /// </summary> private static void HandleTab() { // Get the word last entered in buffer separated by a space. string text = Encoding.UTF8.GetString(_userCommandInput.ToArray(), 0, _userCommandInput.Count); string prefix = null; if (text.ToString().Contains(' ')) { prefix = text.ToString().Split(' ').Last(); } else { prefix = text.ToString(); } // Send the word string to Auto tab handler string[] completions = TabHelper.GetTabOptions(prefix.ToLower()); if (completions == null) { return; } int ncompletions = completions.Length; if (ncompletions == 0) { return; } // if there is just one matching string, print it to string. if (completions.Length == 1) { InsertTextAtCursor(completions[0]); AddToBuffer(completions[0]); } else { int last = -1; // find the first character that differs from user entered string for (int p = 0; p < completions[0].Length; p++) { char c = completions[0][p]; for (int i = 1; i < ncompletions; i++) { if (completions[i].Length < p) { goto mismatch; } if (completions[i][p] != c) { goto mismatch; } } last = p; } mismatch: // if first time and there is string that matches, add to screen // example: User entered wcscli -getc followed by tab // we can complete it by wcscli -getchassis and also provide other // options: -getchassisinfo -getchassishealth -getchassisattentionledstatus -getchassismanagerstatus -getchassismanagerassetinfo // following code handles above scenario if (last != -1) { InsertTextAtCursor(completions[0].Substring(0, last + 1)); AddToBuffer(completions[0].Substring(0, last + 1)); } // Insert New line EchoBytesToSerial(0x0A); for (int i = 0; i < _userCommandInput.Count + (WcsCliConstants.consoleString.Length + 1); i++) { EchoBytesToSerial(0x1b); EchoBytesToSerial(0x5b); EchoBytesToSerial(0x44); } int count = 0; // Print all options to screen foreach (string s in completions) { InsertTextAtCursor(prefix); count = count + prefix.Length; InsertTextAtCursor(s); count = count + s.Length; InsertTextAtCursor(new string(' ', 1)); count = count + 1; } // Calculate cursor position int charToRemove = count % window_width; // Insert New line EchoBytesToSerial(0x0A); // Move cursor left for (int i = 0; i < charToRemove; i++) { EchoBytesToSerial(0x1b); EchoBytesToSerial(0x5b); EchoBytesToSerial(0x44); } // print WCSCLI prompt InsertTextAtCursor(WcsCliConstants.consoleString + " " + ""); InsertTextAtCursor(Encoding.UTF8.GetString(_userCommandInput.ToArray(), 0, _userCommandInput.Count)); } }