【问题标题】:ncurses in urxvt does not print repeating charactersurxvt 中的 ncurses 不打印重复字符
【发布时间】:2017-09-30 22:08:41
【问题描述】:

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

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

我已验证使用 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' 都会发生这种情况。
  • 使用printwaddch 函数都发现了该问题。相关的联机帮助页声明这些函数会移动光标,因此不需要显式移动光标。显然是这样,否则问题将不仅限于重复字符,xterm 也会发生。

urxvt 配置

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

【问题讨论】:

    标签: c ncurses urxvt


    【解决方案1】:

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

    直到我输入问题的最后,当我添加 urxvt 配置时,我才弄清楚这一点。我想考虑将哪些信息放入 SO 问题中可能会导致解决您自己的问题。与其删除所有内容,我想我还是发帖吧,也许它会对那里的其他人有用。

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

    看到这个错误导致的奇怪行为也很有趣。我仍然很想知道为什么我的错误会导致我在问题中记录的行为。当我有时间的时候,我可能会回到这个只是为了好玩。

    编辑

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

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

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

    REP用于表示数据流中的前一个字符,如果是包含SPACE的图形字符(由一个或多个位组合表示),则重复n次,其中n等于Pn的值。如果 REP 前面的字符是控制功能或控制的一部分 REP 的作用在本标准中没有定义。 REP - ECMA-048

    我还应该提到,ncurses 常见问题解答包含一个关于人们为什么倾向于使用 TERM=xterm 以及为什么不应该使用的精彩讨论,直接从马嘴里说出来!

    【讨论】:

    • 这是一个FAQ
    • 正是我想要的。非常感谢。
    • 当我回复你时,我没有意识到你是 ncurses 的开发者/维护者。就像我在问题中所说的那样,我对 ncurses 很陌生。这让我能够很好地了解 API 的设计有多好,以及一切都多么容易理解和使用。当我决定研究 ncurses 时,我正在开发一种工具来帮助诊断机械键盘的按键颤动问题,并且(除了 TERM 麻烦)一切都很顺利。所以也谢谢你:)
    • @ThomasDickey 我应该在发帖前花时间好好看看你的网站。哇!感谢您提供所有代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多