ncurses в urxvt не печатает повторяющиеся символы

Запуск программы ncurses в urxvt сжимает повторяющиеся символы в строках. Например я ожидаю "--------" но я получаю "-",

Я написал короткую программу, которая воспроизводит проблему. Код ниже.

Я проверил, что вывод является правильным при использовании xterm, а не urxvt.

Это первый раз, когда я работаю с ncurses, однако, пример программы так же прост, как они приходят. Поэтому я не думаю, что проблема в том, как я использую ncurses. Это также подтверждается тем фактом, что xterm дает ожидаемые результаты.

Я использую urxvt на Arch Linux. Я также предоставляю соответствующую конфигурацию ниже. У меня установлен vanilla xterm без дополнительной настройки. У обоих был запущен Zsh.

Пример программы (С)

#include <curses.h>

int main(){
  initscr();
  printw("------\n");        // (1) 6 '-' chars          urxvt: "------"   xterm: "------"
  printw("-------\n");       // (2) 7 '-' chars          urxvt: "-"        xterm: "-------"
  printw("--------\n");      // (3) 8 '-' chars          urxvt: "-"        xterm: "--------"
  printw("0--------0\n");    // (4) 8 '-' between '0'    urxvt: "0-0"      xterm: "0--------0"
  printw("xxxxxxxx\n");      // (5) Replacing '-' with 'x' does not make a difference.
  printw("---- ----\n");     // (6) Two '-' sequences separated by ' ' display correctly.
  printw("12345678\n");      // (7) Strings with different characters display correctly.
  for(int i=0; i<8; i++) addch('-');    // (8) 8 '-' chars      urxvt: "-"   xterm: "--------" 
  addch('\n');
  for(char c='0'; c<'8'; c++) addch(c); // (9) Both display correctly
  addch('\n');
  refresh();
  getch();
  endwin();
  return 0;
}

Вывод xterm (правильный)

------
-------
--------
0--------0
xxxxxxxx
---- ----
12345678
--------
01234567

Выходные данные urxvt (неверно)

------
-
-
0-0
x
---- ----
12345678
-
01234567

наблюдения

  • До 6 повторяющихся символов отображаются правильно.
  • 7 и более повторяющихся символов отображаются как один символ.
  • Эта проблема не возникает, если символы не повторяются, поэтому длина самой строки не является проблемой.
  • Расположение повторяющейся подстроки не имеет значения. В (7) сжатая подстрока была зажата '0' символы на каждом конце.
    • Проблема не в конкретном характере. Бывает с '-' так же как 'x',
  • Проблема наблюдалась с использованием как printw а также addch функции. Соответствующие man-страницы утверждают, что эти функции перемещают курсор, поэтому нет необходимости явно перемещать курсор. Это, очевидно, имеет место, так как в противном случае проблема не будет ограничена повторяющимися символами, а также произойдет с xterm.

Конфигурация urxvt

  • rxvt-unicode v9.22
  • $TERM является xterm-256color

1 ответ

Решение

urxvt не xterm, поэтому $TERM должно быть rxvt-unicode и не xterm-256color,

Я не понял этого до самого конца ввода моего вопроса, когда я добавлял конфигурацию urxvt. Я полагаю, что размышления о том, какая информация может иметь отношение к вопросу SO, могут привести к решению вашей собственной проблемы. Вместо того, чтобы удалять все, я подумал, что, тем не менее, мог бы опубликовать и, возможно, это будет полезно кому-то еще.

Дело в том, что я добавил эту настройку env давным-давно, когда я впервые экспериментировал с Arch Linux и urxvt. Должен признаться, я не особо много думал об этом. Я помню все, что меня беспокоило в то время, когда символы юникода, шрифты и цвета отображались правильно (в дополнение к красивой цветовой гамме). настройка $TERM в xterm-256color казалось, работал в то время, и за все это время, используя систему, она продолжала казаться работающей, до сегодняшнего дня. Конечно, тут и там были глюки, и, возможно, они были результатом этого. Опять же, возможно, они были из-за чего-то еще. Я должен сказать, что довольно удивлен тем, насколько глупой и простой оказалась проблема.

Также интересно видеть странное поведение, к которому привела эта ошибка. Мне все еще интересно узнать, почему именно моя ошибка приводит к поведению, которое я задокументирую в вопросе. Я мог бы вернуться к этому только для удовольствия, когда у меня есть время.

РЕДАКТИРОВАТЬ

Эта точная проблема упоминается в часто задаваемых вопросах ncurses, как указал Thomas Dickey.

..., в середине 2017 года, в обновлении описания терминала xterm добавлен элемент управления ECMA-48 REP (повторяющийся символ). Он был частью xterm с января 1997 года, но описание терминала с использованием этой функции было частью только xterm (не ncurses).

Эмуляторы терминала, которые используют TERM=xterm, но не поддерживают эту функцию xterm, показали ошибки после того, как эта функция была введена в ncurses. На rxvt это не повлияло, так как он не использует TERM=xterm, точнее, так как он не должен использовать TERM=xterm, как я это делал.

REP используется для указания того, что предыдущий символ в потоке данных, если он является графическим символом (представленным одной или несколькими битовыми комбинациями), включая пробел, должен повторяться n раз, где n равно значению Pn. Если символ, предшествующий REP, является контрольной функцией или частью контрольной функции, эффект REP не определен настоящим стандартом. REP - ECMA-048

Я должен также упомянуть, что FAQ по ncurses включает отличную дискуссию о том, почему люди склонны использовать TERM=xterm, а почему нет, прямо изо рта лошади!

Другие вопросы по тегам