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

观察

urxvt 配置

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 以及为什么不应该直接从马口中直接讨论的精彩讨论!