urxvt中的ncurses不会打印重复的字符

urxvt中运行ncurses程序 挤压字符串中的重复字符。 例如,我希望"--------"但我得到"-"

我写了一个简短的程序来重现这个问题。 代码如下。

我已经validation了使用xterm而不是urxvt时输出是正确的。

这是我第一次使用ncurses,但是,示例程序就像它们一样简单。 因此,我认为问题不在于我如何使用ncurses。 xterm提供了预期的结果,这也支持了这一点。

我在Arch Linux上使用urxvt。 我也在下面提供相关配置。 我安装了vanilla xterm,没有任何其他配置。 两者都运行zsh。

示例程序(C)

 #include  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'
  • 使用printwaddch函数观察到了这个问题。 相关联的联机帮助页声明这些函数会移动光标,因此不需要显式移动光标。 显然就是这种情况,否则问题不仅限于重复字符,而且xterm也会发生。

urxvt配置

  • rxvt-unicode v9.22
  • $TERMxterm-256color

urxvt不是xterm,所以$TERM应该是rxvt-unicode而不是xterm-256color

直到键入我的问题的最后,当我添加urxvt配置时,我才意识到这一点。 我想,考虑将哪些信息与SO问题相关可以导致解决自己的问题。 而不是删除所有内容,我认为我可能会发布,但也许它会对那里的其他人有用。

问题是,我添加了env设置很久很久以前,当我第一次尝试使用Arch Linux和urxvt时。 我必须承认,我并没有花太多时间思考它。 我记得当时我关心的是unicode字符,字体和颜色正确显示(除了漂亮的配色方案)。 将$TERM设置$TERM xterm-256color似乎在当时工作,并且在所有这些时间使用该系统,它继续似乎工作,直到今天。 当然,这里和那里都有小故障,也许它们就是这样的结果。 然后,也许他们是由于其他原因。 我不得不说我对这个问题变得多么愚蠢和简单而感到好笑。

看到这个错误导致的奇怪行为也很有趣。 我仍然很想知道为什么我的错误会导致我在问题中记录的行为。 当我有一些时间时,我可能会因为踢球而回到这里。

编辑

正如Thomas Dickey所指出的那样,ncurses的FAQ中提到了这个确切的问题。

…,在2017年中期,对xterm终端描述的更新添加了ECMA-48 REP(重复字符)控件。 它是自1997年1月以来xterm的一部分,但使用该function的终端描述仅是xterm的一部分(不是ncurses)。

使用TERM = xterm但不支持此xtermfunction的终端仿真程序在将此function引入ncurses后会出现错误。 rxvt没有受到影响,因为它不使用TERM = xterm,或者更确切地说,因为它不应该使用TERM = xterm,就像我一直在做的那样。

REP用于指示数据流中的前一个字符,如果它是包括SPACE的图形字符(由一个或多个位组合表示),则重复n次,其中n等于Pn的值。 如果REP之前的字符是控制function或控制function的一部分,则本标准不定义REP的效果。 REP – ECMA-048

我还应该提一下,ncurses常见问题包括一个很好的讨论,关于为什么人们倾向于使用TERM = xterm,以及为什么他们不应该直接从马的口中使用!