簡體   English   中英

urxvt 中的 ncurses 不打印重復字符

[英]ncurses in urxvt does not print repeating characters

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

urxvt 不是 xterm,所以$TERM應該是rxvt-unicode而不是xterm-256color

直到我輸入問題的最后,當我添加 urxvt 配置時,我才弄清楚這一點。 我想考慮將哪些信息放入 SO 問題可能會導致解決您自己的問題。 與其刪除所有內容,我還是想我還是發布一下,也許它對其他人有用。

問題是,我在很久很久以前第一次嘗試 Arch Linux 和 urxvt 時添加了 env 設置。 我必須承認,我並沒有花太多時間考慮它。 我記得當時我所關心的只是正確顯示 unicode 字符、字體和顏色(除了漂亮的配色方案)。 $TERM設置$TERM xterm-256color在當時似乎有效,並且在使用該系統的所有時間里,它似乎繼續有效,直到今天。 當然,這里和那里都有小故障,也許它們就是這樣的結果。 再說一次,也許他們是由於其他原因。 我不得不說我對這個問題竟然如此愚蠢和簡單感到很有趣。

看到這個錯誤導致的奇怪行為也很有趣。 我仍然很想知道為什么我的錯誤會導致我在問題中記錄的行為。 當我有時間的時候,我可能會回到這個只是為了踢球。

編輯

正如Thomas Dickey所指出的,ncurses 的常見問題解答中提到了這個確切的問題。

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

一旦將此功能引入 ncurses,使用 TERM=xterm 但不支持此 xterm 功能的終端仿真器就會出現錯誤。 rxvt 不受影響,因為它不使用 TERM=xterm,或者更確切地說,它不應該使用 TERM=xterm,就像我一直在做的那樣。

REP用於表示數據流中的前一個字符,如果是包含SPACE的圖形字符(由一個或多個位組合表示),則重復n次,其中n等於Pn的值。 如果 REP 前面的字符是控制功能或控制功能的一部分,則 REP 的效果不在本標准中定義。 REP - ECMA-048

我還應該提到,ncurses 常見問題解答包括一個關於為什么人們傾向於使用 TERM=xterm 以及為什么不應該直接從馬嘴里說出來的精彩討論!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM