Сбросить терминал после прерывания `read -r -s`

Хороший ответ начинается с объяснения проблемы своими словами, затем выборочно цитируются части, которые имеют отношение к делу. В разделе FAQ по ncurses, представленном @Craig, есть аспект, не описанный подробно, который помогает понять вопрос.

Ссылаясь на раздел Line Graphics страницы руководства terminfo(5) и соответствующий раздел Line Graphics страницы руководства curs_add(3x), библиотека curses имеет предопределенный набор символьных констант с именем ACS_xxxx, которые на различных терминалах рисуются с помощью аналогичных управляющих последовательностей.

Наиболее распространенный вариант основан на VT100, где приложение посылает специальный символ (или управляющую последовательность) для запуска режима линейной графики mode и другой символ (или управляющую последовательность) для завершения линейной графики.

Несколько разработчиков эмуляторов терминалов возражали против понятия режимов при написании текста в режиме UTF-8. Не обращайте внимания на иронию (для запуска/остановки кодировки UTF-8 существуют управляющие последовательности), но в ncurses эта функция поддерживается достаточно эффективно. Чтобы помочь ему решить, как делать построчную графику,

  • он начинает с описания терминала (определяемого переменной окружения), которое может сказать только, как делать построчную графику в стиле VT100.
  • Для UTF-8 он может проверить кодировку локали, проверив другие переменные окружения.

Если ncurses должен использовать только UTF-8 (потому что терминал не поддерживает линейную графику VT100), он использует встроенную таблицу достаточно хороших значений Unicode. Рисование линий с помощью UTF-8 неизбежно в три раза медленнее, чем при использовании линейной графики VT100, просто потому, что на терминал посылается в три раза больше символов.

Все это делает рисование линий UTF-8 "тоже", а не основной задачей библиотеки. В случае OP что-то (вероятно, переменные локали) было неправильно. Fedora инициализировала консоль в режиме UTF-8, а консоль Linux - хорошо известный случай, в котором отсутствует построчная перерисовка VT100, ОП получил странные символы на экране.

Поскольку ncurses интерпретировал среду OP как поддерживающую возможности в описании терминала, он переключился в режим рисования строк VT100 (игнорируемый консолью из-за переопределения режима) и нарисовал символы, которые, как он ожидал, будут отображаться в строки. Поэтому на экране могло появиться следующее:

lqqqqqqqqqqqqqqqk
x  Hello world  x
mqqqqqqqqqqqqqqqj 

а не

┌───────────────┐
│  Hello world  │
└───────────────┘

0
08.02.2019, 14:42
1 ответ

Команда, используемая для перезагрузки терминала, имеет точное название:

reset

Однако это, скорее всего, также очистит терминал.

Вы также можете попробовать

stty echo

, чтобы включить эхо того, что вы печатаете, или

stty sane

, который должен вернуть ваш терминал в нормальное состояние.

Если кажется, что клавиша Enter не работает, вместо нее можно использовать Ctrl+J .

2
28.01.2020, 02:30

Теги

Похожие вопросы