public QueueDebugView(HistoryQueue <T> queue) { if (queue == null) { throw new ArgumentNullException("queue"); } this._queue = queue; }
private void DelayedOneTimeInitialize() { // Delayed initialization is needed so that options can be set // after the constuctor but have an affect before the user starts // editing their first command line. For example, if the user // specifies a custom history save file, we don't want to try reading // from the default one. if (_engineIntrinsics != null) { var historyCountVar = _engineIntrinsics.SessionState.PSVariable.Get("MaximumHistoryCount"); if (historyCountVar != null && historyCountVar.Value is int) { _options.MaximumHistoryCount = (int)historyCountVar.Value; } } _historyFileMutex = new Mutex(false, GetHistorySaveFileMutexName()); _history = new HistoryQueue <HistoryItem>(Options.MaximumHistoryCount); _currentHistoryIndex = 0; bool readHistoryFile = true; try { if (_options.HistorySaveStyle == HistorySaveStyle.SaveNothing && Runspace.DefaultRunspace != null) { using (var ps = System.Management.Automation.PowerShell.Create(RunspaceMode.CurrentRunspace)) { ps.AddCommand("Microsoft.PowerShell.Core\\Get-History"); foreach (var historyInfo in ps.Invoke <HistoryInfo>()) { AddToHistory(historyInfo.CommandLine); } readHistoryFile = false; } } } catch { } if (readHistoryFile) { ReadHistoryFile(); } _killIndex = -1; // So first add indexes 0. _killRing = new List <string>(Options.MaximumKillRingCount); _breakHandlerGcHandle = GCHandle.Alloc(new BreakHandler(_singleton.BreakHandler)); NativeMethods.SetConsoleCtrlHandler((BreakHandler)_breakHandlerGcHandle.Target, true); _singleton._readKeyWaitHandle = new AutoResetEvent(false); _singleton._keyReadWaitHandle = new AutoResetEvent(false); _singleton._closingWaitHandle = new ManualResetEvent(false); _singleton._requestKeyWaitHandles = new WaitHandle[] { _singleton._keyReadWaitHandle, _singleton._closingWaitHandle }; _singleton._threadProcWaitHandles = new WaitHandle[] { _singleton._readKeyWaitHandle, _singleton._closingWaitHandle }; // This is for a "being hosted in an alternate appdomain scenario" (the // DomainUnload event is not raised for the default appdomain). It allows us // to exit cleanly when the appdomain is unloaded but the process is not going // away. if (!AppDomain.CurrentDomain.IsDefaultAppDomain()) { AppDomain.CurrentDomain.DomainUnload += (x, y) => { _singleton._closingWaitHandle.Set(); _singleton._readKeyThread.Join(); // may need to wait for history to be written }; } _singleton._readKeyThread = new Thread(_singleton.ReadKeyThreadProc) { IsBackground = true }; _singleton._readKeyThread.Start(); }
private void SetOptionsInternal(SetPSReadlineOption options) { if (options.ContinuationPrompt != null) { Options.ContinuationPrompt = options.ContinuationPrompt; } if (options._continuationPromptForegroundColor.HasValue) { Options.ContinuationPromptForegroundColor = options.ContinuationPromptForegroundColor; } if (options._continuationPromptBackgroundColor.HasValue) { Options.ContinuationPromptBackgroundColor = options.ContinuationPromptBackgroundColor; } if (options._emphasisBackgroundColor.HasValue) { Options.EmphasisBackgroundColor = options.EmphasisBackgroundColor; } if (options._emphasisForegroundColor.HasValue) { Options.EmphasisForegroundColor = options.EmphasisForegroundColor; } if (options._errorBackgroundColor.HasValue) { Options.ErrorBackgroundColor = options.ErrorBackgroundColor; } if (options._errorForegroundColor.HasValue) { Options.ErrorForegroundColor = options.ErrorForegroundColor; } if (options._historyNoDuplicates.HasValue) { Options.HistoryNoDuplicates = options.HistoryNoDuplicates; } if (options._historySearchCursorMovesToEnd.HasValue) { Options.HistorySearchCursorMovesToEnd = options.HistorySearchCursorMovesToEnd; } if (options._addToHistoryHandlerSpecified) { Options.AddToHistoryHandler = options.AddToHistoryHandler; } if (options._commandValidationHandlerSpecified) { Options.CommandValidationHandler = options.CommandValidationHandler; } if (options._maximumHistoryCount.HasValue) { Options.MaximumHistoryCount = options.MaximumHistoryCount; if (_history != null) { var newHistory = new HistoryQueue <HistoryItem>(Options.MaximumHistoryCount); while (_history.Count > Options.MaximumHistoryCount) { _history.Dequeue(); } while (_history.Count > 0) { newHistory.Enqueue(_history.Dequeue()); } _history = newHistory; _currentHistoryIndex = _history.Count; } } if (options._maximumKillRingCount.HasValue) { Options.MaximumKillRingCount = options.MaximumKillRingCount; // TODO - make _killRing smaller } if (options._editMode.HasValue) { Options.EditMode = options.EditMode; // Switching/resetting modes - clear out chord dispatch table _chordDispatchTable.Clear(); SetDefaultBindings(Options.EditMode); } if (options._showToolTips.HasValue) { Options.ShowToolTips = options.ShowToolTips; } if (options._extraPromptLineCount.HasValue) { Options.ExtraPromptLineCount = options.ExtraPromptLineCount; } if (options._dingTone.HasValue) { Options.DingTone = options.DingTone; } if (options._dingDuration.HasValue) { Options.DingDuration = options.DingDuration; } if (options._bellStyle.HasValue) { Options.BellStyle = options.BellStyle; } if (options._completionQueryItems.HasValue) { Options.CompletionQueryItems = options.CompletionQueryItems; } if (options.WordDelimiters != null) { Options.WordDelimiters = options.WordDelimiters; } if (options._historySearchCaseSensitive.HasValue) { Options.HistorySearchCaseSensitive = options.HistorySearchCaseSensitive; } if (options._historySaveStyle.HasValue) { Options.HistorySaveStyle = options.HistorySaveStyle; } #region vi if (options._viModeIndicator.HasValue) { Options.ViModeIndicator = options.ViModeIndicator; } #endregion if (options.HistorySavePath != null) { Options.HistorySavePath = options.HistorySavePath; if (_historyFileMutex != null) { _historyFileMutex.Dispose(); } _historyFileMutex = new Mutex(false, GetHistorySaveFileMutexName()); _historyFileLastSavedSize = 0; } if (options.ResetTokenColors) { Options.ResetColors(); } if (options._tokenKind.HasValue) { if (options._foregroundColor.HasValue) { Options.SetForegroundColor(options.TokenKind, options.ForegroundColor); } if (options._backgroundColor.HasValue) { Options.SetBackgroundColor(options.TokenKind, options.BackgroundColor); } } }
private void DelayedOneTimeInitialize() { // Delayed initialization is needed so that options can be set // after the constuctor but have an affect before the user starts // editing their first command line. For example, if the user // specifies a custom history save file, we don't want to try reading // from the default one. if (_options.MaximumHistoryCount == 0) { // Initialize 'MaximumHistoryCount' if it's not defined in user's profile. var historyCountVar = _engineIntrinsics?.SessionState.PSVariable.Get("MaximumHistoryCount"); _options.MaximumHistoryCount = (historyCountVar?.Value is int historyCountValue) ? historyCountValue : PSConsoleReadLineOptions.DefaultMaximumHistoryCount; } if (_options.PromptText == null && _engineIntrinsics?.InvokeCommand.GetCommand("prompt", CommandTypes.Function) is FunctionInfo promptCommand) { var promptIsPure = null == promptCommand.ScriptBlock.Ast.Find(ast => ast is CommandAst || ast is InvokeMemberExpressionAst, searchNestedScriptBlocks: true); if (promptIsPure) { var res = promptCommand.ScriptBlock.InvokeReturnAsIs(Array.Empty <object>()); string evaluatedPrompt = res as string; if (evaluatedPrompt == null && res is PSObject psobject) { evaluatedPrompt = psobject.BaseObject as string; } if (evaluatedPrompt != null) { int i; for (i = evaluatedPrompt.Length - 1; i >= 0; i--) { if (!char.IsWhiteSpace(evaluatedPrompt[i])) { break; } } if (i >= 0) { _options.PromptText = new [] { evaluatedPrompt.Substring(i) }; } } } } _historyFileMutex = new Mutex(false, GetHistorySaveFileMutexName()); _history = new HistoryQueue <HistoryItem>(Options.MaximumHistoryCount); _recentHistory = new HistoryQueue <string>(capacity: 5); _currentHistoryIndex = 0; bool readHistoryFile = true; try { if (_options.HistorySaveStyle == HistorySaveStyle.SaveNothing && Runspace.DefaultRunspace != null) { using (var ps = System.Management.Automation.PowerShell.Create(RunspaceMode.CurrentRunspace)) { ps.AddCommand("Microsoft.PowerShell.Core\\Get-History"); foreach (var historyInfo in ps.Invoke <HistoryInfo>()) { AddToHistory(historyInfo.CommandLine); } readHistoryFile = false; } } } catch { } if (readHistoryFile) { ReadHistoryFile(); } _killIndex = -1; // So first add indexes 0. _killRing = new List <string>(Options.MaximumKillRingCount); _singleton._readKeyWaitHandle = new AutoResetEvent(false); _singleton._keyReadWaitHandle = new AutoResetEvent(false); _singleton._closingWaitHandle = new ManualResetEvent(false); _singleton._requestKeyWaitHandles = new WaitHandle[] { _singleton._keyReadWaitHandle, _singleton._closingWaitHandle, _defaultCancellationToken.WaitHandle }; _singleton._threadProcWaitHandles = new WaitHandle[] { _singleton._readKeyWaitHandle, _singleton._closingWaitHandle }; // This is for a "being hosted in an alternate appdomain scenario" (the // DomainUnload event is not raised for the default appdomain). It allows us // to exit cleanly when the appdomain is unloaded but the process is not going // away. if (!AppDomain.CurrentDomain.IsDefaultAppDomain()) { AppDomain.CurrentDomain.DomainUnload += (x, y) => { _singleton._closingWaitHandle.Set(); _singleton._readKeyThread.Join(); // may need to wait for history to be written }; } _singleton._readKeyThread = new Thread(_singleton.ReadKeyThreadProc) { IsBackground = true, Name = "PSReadLine ReadKey Thread" }; _singleton._readKeyThread.Start(); }
private void SetOptionsInternal(SetPSReadLineOption options) { if (options.ContinuationPrompt != null) { Options.ContinuationPrompt = options.ContinuationPrompt; } if (options._historyNoDuplicates.HasValue) { Options.HistoryNoDuplicates = options.HistoryNoDuplicates; } if (options._historySearchCursorMovesToEnd.HasValue) { Options.HistorySearchCursorMovesToEnd = options.HistorySearchCursorMovesToEnd; } if (options._addToHistoryHandlerSpecified) { Options.AddToHistoryHandler = options.AddToHistoryHandler; } if (options._commandValidationHandlerSpecified) { Options.CommandValidationHandler = options.CommandValidationHandler; } if (options._maximumHistoryCount.HasValue) { Options.MaximumHistoryCount = options.MaximumHistoryCount; if (_history != null) { var newHistory = new HistoryQueue <HistoryItem>(Options.MaximumHistoryCount); while (_history.Count > Options.MaximumHistoryCount) { _history.Dequeue(); } while (_history.Count > 0) { newHistory.Enqueue(_history.Dequeue()); } _history = newHistory; _currentHistoryIndex = _history.Count; } } if (options._maximumKillRingCount.HasValue) { Options.MaximumKillRingCount = options.MaximumKillRingCount; // TODO - make _killRing smaller } if (options._editMode.HasValue) { Options.EditMode = options.EditMode; // Switching/resetting modes - clear out chord dispatch table _chordDispatchTable.Clear(); SetDefaultBindings(Options.EditMode); } if (options._showToolTips.HasValue) { Options.ShowToolTips = options.ShowToolTips; } if (options._extraPromptLineCount.HasValue) { Options.ExtraPromptLineCount = options.ExtraPromptLineCount; } if (options._dingTone.HasValue) { Options.DingTone = options.DingTone; } if (options._dingDuration.HasValue) { Options.DingDuration = options.DingDuration; } if (options._bellStyle.HasValue) { Options.BellStyle = options.BellStyle; } if (options._completionQueryItems.HasValue) { Options.CompletionQueryItems = options.CompletionQueryItems; } if (options.WordDelimiters != null) { Options.WordDelimiters = options.WordDelimiters; } if (options._historySearchCaseSensitive.HasValue) { Options.HistorySearchCaseSensitive = options.HistorySearchCaseSensitive; } if (options._historySaveStyle.HasValue) { Options.HistorySaveStyle = options.HistorySaveStyle; } if (options._viModeIndicator.HasValue) { Options.ViModeIndicator = options.ViModeIndicator; } if (options.ViModeChangeHandler != null) { if (Options.ViModeIndicator != ViModeStyle.Script) { throw new ParameterBindingException("ViModeChangeHandler option requires ViModeStyle.Script"); } Options.ViModeChangeHandler = options.ViModeChangeHandler; } if (options.HistorySavePath != null) { Options.HistorySavePath = options.HistorySavePath; _historyFileMutex?.Dispose(); _historyFileMutex = new Mutex(false, GetHistorySaveFileMutexName()); _historyFileLastSavedSize = 0; } if (options._ansiEscapeTimeout.HasValue) { Options.AnsiEscapeTimeout = options.AnsiEscapeTimeout; } if (options.PromptText != null) { Options.PromptText = options.PromptText; } if (options.Colors != null) { IDictionaryEnumerator e = options.Colors.GetEnumerator(); while (e.MoveNext()) { if (e.Key is string property) { Options.SetColor(property, e.Value); } } } }
private void SetOptionsInternal(SetPSReadLineOption options) { if (options.ContinuationPrompt != null) { Options.ContinuationPrompt = options.ContinuationPrompt; } if (options._historyNoDuplicates.HasValue) { Options.HistoryNoDuplicates = options.HistoryNoDuplicates; } if (options._historySearchCursorMovesToEnd.HasValue) { Options.HistorySearchCursorMovesToEnd = options.HistorySearchCursorMovesToEnd; } if (options._addToHistoryHandlerSpecified) { Options.AddToHistoryHandler = options.AddToHistoryHandler; } if (options._commandValidationHandlerSpecified) { Options.CommandValidationHandler = options.CommandValidationHandler; } if (options._maximumHistoryCount.HasValue) { Options.MaximumHistoryCount = options.MaximumHistoryCount; if (_history != null) { var newHistory = new HistoryQueue <HistoryItem>(Options.MaximumHistoryCount); while (_history.Count > Options.MaximumHistoryCount) { _history.Dequeue(); } while (_history.Count > 0) { newHistory.Enqueue(_history.Dequeue()); } _history = newHistory; _currentHistoryIndex = _history.Count; } } if (options._maximumKillRingCount.HasValue) { Options.MaximumKillRingCount = options.MaximumKillRingCount; // TODO - make _killRing smaller } if (options._editMode.HasValue) { Options.EditMode = options.EditMode; // Switching/resetting modes - clear out chord dispatch table _chordDispatchTable.Clear(); SetDefaultBindings(Options.EditMode); } if (options._showToolTips.HasValue) { Options.ShowToolTips = options.ShowToolTips; } if (options._extraPromptLineCount.HasValue) { Options.ExtraPromptLineCount = options.ExtraPromptLineCount; } if (options._dingTone.HasValue) { Options.DingTone = options.DingTone; } if (options._dingDuration.HasValue) { Options.DingDuration = options.DingDuration; } if (options._bellStyle.HasValue) { Options.BellStyle = options.BellStyle; } if (options._completionQueryItems.HasValue) { Options.CompletionQueryItems = options.CompletionQueryItems; } if (options.WordDelimiters != null) { Options.WordDelimiters = options.WordDelimiters; } if (options._historySearchCaseSensitive.HasValue) { Options.HistorySearchCaseSensitive = options.HistorySearchCaseSensitive; } if (options._historySaveStyle.HasValue) { Options.HistorySaveStyle = options.HistorySaveStyle; } if (options._viModeIndicator.HasValue) { Options.ViModeIndicator = options.ViModeIndicator; } if (options.ViModeChangeHandler != null) { if (Options.ViModeIndicator != ViModeStyle.Script) { throw new ParameterBindingException("ViModeChangeHandler option requires ViModeStyle.Script"); } Options.ViModeChangeHandler = options.ViModeChangeHandler; } if (options.HistorySavePath != null) { Options.HistorySavePath = options.HistorySavePath; _historyFileMutex?.Dispose(); _historyFileMutex = new Mutex(false, GetHistorySaveFileMutexName()); _historyFileLastSavedSize = 0; } if (options._ansiEscapeTimeout.HasValue) { Options.AnsiEscapeTimeout = options.AnsiEscapeTimeout; } if (options.PromptText != null) { Options.PromptText = options.PromptText; } if (options._predictionSource.HasValue) { if (_console is PlatformWindows.LegacyWin32Console && options.PredictionSource != PredictionSource.None) { throw new ArgumentException(PSReadLineResources.PredictiveSuggestionNotSupported); } bool notTest = ReferenceEquals(_mockableMethods, this); if ((options.PredictionSource & PredictionSource.Plugin) != 0 && Environment.Version.Major < 5 && notTest) { throw new ArgumentException(PSReadLineResources.PredictionPluginNotSupported); } Options.PredictionSource = options.PredictionSource; } if (options._predictionViewStyle.HasValue) { WarnWhenWindowSizeTooSmallForView(options.PredictionViewStyle, options); Options.PredictionViewStyle = options.PredictionViewStyle; _prediction.SetViewStyle(options.PredictionViewStyle); } if (options.Colors != null) { IDictionaryEnumerator e = options.Colors.GetEnumerator(); while (e.MoveNext()) { if (e.Key is string property) { Options.SetColor(property, e.Value); } } } }
public QueueDebugView(HistoryQueue <T> queue) { this._queue = queue ?? throw new ArgumentNullException(nameof(queue)); }