Windows build number: Microsoft Windows [Version 10.0.18363.535]
Windows Terminal version (if applicable): NA
Any other software? No
После установки формы курсора в Properties->Terminal
, скрытие и последующее отображение курсора путем установки Console.CursorVisible
на false
а затем true
приводит к восстановлению формы курсора до устаревший стиль в хосте консоли.
Следующая простая программа на C # может показать проблему:
using System;
using System.Text;
namespace cursorShape
{
class Program
{
static void Main(string[] args)
{
const string prompt = "PROMP> ";
StringBuilder sb = new StringBuilder();
int top = Console.CursorTop;
Console.OutputEncoding = Encoding.UTF8;
Console.Write(prompt);
while (true)
{
var key = Console.ReadKey();
if (key.Key == ConsoleKey.Q)
{
break;
}
sb.Append(key.KeyChar);
Console.CursorVisible = false; // Hide the cursor before rewriting
Console.SetCursorPosition(0, top);
Console.Write($"{prompt}{sb}");
Console.SetCursorPosition(Console.CursorLeft, top);
Console.CursorVisible = true; // Show the cursor afterwards
}
}
}
}
Установка Console.CursorVisible
не должна изменять форму курсора.
Форма курсора возвращается с Solid Box
к устаревшему стилю ( Underline
):
Об этих двух проблемах сообщалось в контексте PowerShell + PSReadLine. PSReadLine зависит от Console.CursorVisible
чтобы скрыть и показать курсор во время рендеринга, поэтому форма курсора возвращается.
Ну черт возьми.
Как объяснено в # 409, проблема заключается в том, что вызов SetConsoleCursorInfo
устанавливает размер курсора, а установка размера курсора заставляет форму курсора вернуться к унаследованному стилю (потому что это единственная форма, для которой размер применим AFAIK ).
Достаточно просто "исправить". Мы могли бы просто удалить эту строку из метода SetCursorInformation
:
https://github.com/microsoft/terminal/blob/6f667f48ae109d4291cda1f8d4e977315c0dae8a/src/host/screenInfo.cpp#L1778
Но это изменение поведения общедоступного API, и вполне возможно, что некоторые приложения действительно могут полагаться на это поведение (хотя я думаю, что это маловероятно).
В идеале свойство Console.CursorVisible
должно использовать API, который просто устанавливает видимость и ничего больше, но я не думаю, что такое существует. Лучшее, что вы могли бы сделать, - это использовать последовательность VT, но она, очевидно, не будет работать со старыми версиями Windows.
: tada: Эта проблема устранена в выпуске # 5251, который теперь успешно выпущен как Windows Terminal Preview v0.11.1121.0
.: tada:
Полезные ссылки:
Самый полезный комментарий
: tada: Эта проблема устранена в выпуске # 5251, который теперь успешно выпущен как
Windows Terminal Preview v0.11.1121.0
.: tada:Полезные ссылки: