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, а почему нет, прямо изо рта лошади!