Set the cursor to the place where a user hits tab key (#7023)

This commit is contained in:
Jianyun
2018-06-14 23:04:31 -07:00
committed by Dongbo Wang
parent 69977718db
commit 8805ca20aa
3 changed files with 19 additions and 5 deletions
@@ -97,6 +97,12 @@ namespace Microsoft.PowerShell
// Update the progress pane only when the timer set up the update flag or WriteProgress is completed.
// As a result, we do not block WriteProgress and whole script and eliminate unnecessary console locks and updates.
_progPane.Show(_pendingProgress);
// Reset the cursor back to where it started
if (record.RecordType == ProgressRecordType.Completed)
{
_progPane.Hide();
}
}
}
@@ -99,12 +99,20 @@ namespace Microsoft.PowerShell
//if the cursor is at the bottom, create screen buffer space by scrolling
int scrollRows = rows - ((_rawui.BufferSize.Height - 1) - _location.Y);
for (int i = 0; i < rows; i++)
{
Console.Out.Write('\n');
}
if (scrollRows > 0)
{
// The following can be possibly replaced by Console.Write ("\x1b[" + scrollRows + "S");
// For details, see https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
// Scroll the console screen up by 'scrollRows'
var bottomLocation = _location;
bottomLocation.Y = _rawui.BufferSize.Height;
_rawui.CursorPosition = bottomLocation;
for (int i = 0; i < scrollRows; i++)
{
Console.Out.Write('\n');
}
_location.Y -= scrollRows;
_savedCursor.Y -= scrollRows;
}
@@ -2252,7 +2252,7 @@ namespace System.Management.Automation
{
// Only generate these exceptions if a pipeline has already been declared as the 'writing' pipeline.
// Otherwise, these are probably infrastructure messages and can be ignored.
if (this.PipelineProcessor._permittedToWrite != null)
if (this.PipelineProcessor?._permittedToWrite != null)
{
throw PSTraceSource.NewInvalidOperationException(
PipelineStrings.WriteNotPermitted);