urxvt 中的 ncurses 不打印重复字符
ncurses in urxvt does not print repeating characters
运行 ncurses 程序 urxvt squeezes 字符串中的重复字符.例如,我期望 "--------"
但我得到 "-"
.
我写了一个重现问题的小程序。代码如下。
我已经验证使用 xterm 而不是 urxvt.
时输出是正确的
这是我第一次使用 ncurses,但是示例程序非常简单。因此,我认为问题不太可能出在我使用 ncurses 的方式上。这也得到了 xterm 给出预期结果这一事实的支持。
我在 Arch Linux 上使用 urxvt。我也在下面提供相关配置。我在没有任何额外配置的情况下安装了 vanilla xterm。两者都有 zsh 运行.
示例程序 (C)
#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
函数都观察到该问题。相关的联机帮助页指出这些函数移动光标,因此不需要显式移动光标。显然是这种情况,否则问题将不仅限于重复字符,而且 xterm 也会发生。
urxvt 配置
- rxvt-unicode v9.22
$TERM
是 xterm-256color
urxvt 不是 xterm,所以 $TERM
应该是 rxvt-unicode
而不是 xterm-256color
。
直到输入我的问题的最后,当我添加 urxvt 配置时,我才弄明白这一点。我想考虑哪些信息可能与 SO 问题相关可以解决您自己的问题。与其删除所有内容,我想我还是 post 可能对其他人有用。
问题是,我在很久很久以前第一次尝试使用 Arch Linux 和 urxvt 时添加了 env 设置。我必须承认,我并没有花太多时间思考它。我记得当时我所关心的只是正确显示 unicode 字符、字体和颜色(除了漂亮的配色方案)。将 $TERM
设置为 xterm-256color
当时似乎有效,并且在使用该系统的所有时间里,它似乎一直有效,直到今天。当然,到处都有小故障,也许它们就是这个的结果。话又说回来,也许他们是由于其他原因。我不得不说我对这个问题原来是多么愚蠢和简单感到很有趣。
看到此错误导致的奇怪行为也很有趣。我仍然很想知道为什么我的错误会导致我在问题中记录的行为。有空的时候我可能会 return 玩这个。
编辑
ncurses 的 FAQ, as pointed out by Thomas Dickey.
中提到了这个确切的问题
..., in mid-2017, an update to the xterm terminal description added the ECMA-48 REP (repeat character) control. It was part of xterm since January 1997, but a terminal description using the feature was part of xterm only (not ncurses).
使用 TERM=xterm 但不支持此 xterm 功能的终端仿真器在将此功能引入 ncurses 后出现错误。 rxvt 未受影响,因为它不使用 TERM=xterm,或者更确切地说,因为它不应该像我一直在做的那样使用 TERM=xterm。
REP is used to indicate that the preceding character in the data stream, if it is a graphic character (represented by one or more bit combinations) including SPACE, is to be repeated n times, where n equals the value of Pn. If the character preceding REP is a control function or part of a control
function, the effect of REP is not defined by this Standard. REP - ECMA-048
我还应该提到,ncurses 常见问题解答包括关于为什么人们倾向于使用 TERM=xterm 以及为什么不应该直接从马口中直接讨论的精彩讨论!
运行 ncurses 程序 urxvt squeezes 字符串中的重复字符.例如,我期望 "--------"
但我得到 "-"
.
我写了一个重现问题的小程序。代码如下。
我已经验证使用 xterm 而不是 urxvt.
时输出是正确的这是我第一次使用 ncurses,但是示例程序非常简单。因此,我认为问题不太可能出在我使用 ncurses 的方式上。这也得到了 xterm 给出预期结果这一事实的支持。
我在 Arch Linux 上使用 urxvt。我也在下面提供相关配置。我在没有任何额外配置的情况下安装了 vanilla xterm。两者都有 zsh 运行.
示例程序 (C)
#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
函数都观察到该问题。相关的联机帮助页指出这些函数移动光标,因此不需要显式移动光标。显然是这种情况,否则问题将不仅限于重复字符,而且 xterm 也会发生。
urxvt 配置
- rxvt-unicode v9.22
$TERM
是xterm-256color
urxvt 不是 xterm,所以 $TERM
应该是 rxvt-unicode
而不是 xterm-256color
。
直到输入我的问题的最后,当我添加 urxvt 配置时,我才弄明白这一点。我想考虑哪些信息可能与 SO 问题相关可以解决您自己的问题。与其删除所有内容,我想我还是 post 可能对其他人有用。
问题是,我在很久很久以前第一次尝试使用 Arch Linux 和 urxvt 时添加了 env 设置。我必须承认,我并没有花太多时间思考它。我记得当时我所关心的只是正确显示 unicode 字符、字体和颜色(除了漂亮的配色方案)。将 $TERM
设置为 xterm-256color
当时似乎有效,并且在使用该系统的所有时间里,它似乎一直有效,直到今天。当然,到处都有小故障,也许它们就是这个的结果。话又说回来,也许他们是由于其他原因。我不得不说我对这个问题原来是多么愚蠢和简单感到很有趣。
看到此错误导致的奇怪行为也很有趣。我仍然很想知道为什么我的错误会导致我在问题中记录的行为。有空的时候我可能会 return 玩这个。
编辑
ncurses 的 FAQ, as pointed out by Thomas Dickey.
中提到了这个确切的问题..., in mid-2017, an update to the xterm terminal description added the ECMA-48 REP (repeat character) control. It was part of xterm since January 1997, but a terminal description using the feature was part of xterm only (not ncurses).
使用 TERM=xterm 但不支持此 xterm 功能的终端仿真器在将此功能引入 ncurses 后出现错误。 rxvt 未受影响,因为它不使用 TERM=xterm,或者更确切地说,因为它不应该像我一直在做的那样使用 TERM=xterm。
REP is used to indicate that the preceding character in the data stream, if it is a graphic character (represented by one or more bit combinations) including SPACE, is to be repeated n times, where n equals the value of Pn. If the character preceding REP is a control function or part of a control function, the effect of REP is not defined by this Standard. REP - ECMA-048
我还应该提到,ncurses 常见问题解答包括关于为什么人们倾向于使用 TERM=xterm 以及为什么不应该直接从马口中直接讨论的精彩讨论!