[英]ncurses in urxvt does not print repeating characters
在urxvt 中運行ncurses程序會擠壓字符串中的重復字符。 例如,我期望"--------"
但我得到"-"
。
我寫了一個小程序來重現這個問題。 代碼如下。
我已經驗證在使用xterm而不是urxvt時輸出是正確的。
這是我第一次使用 ncurses,但是,示例程序和它們一樣簡單。 因此,我認為問題不在於我如何使用 ncurses。 xterm 給出了預期的結果這一事實也支持了這一點。
我在 Arch Linux 上使用 urxvt。 我也在下面提供相關配置。 我在沒有任何額外配置的情況下安裝了 vanilla xterm。 兩者都運行了 zsh。
#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;
}
------
-------
--------
0--------0
xxxxxxxx
---- ----
12345678
--------
01234567
------
-
-
0-0
x
---- ----
12345678
-
01234567
'0'
字符夾在中間。'-'
以及'x'
。printw
和addch
函數觀察到該問題。 相關的聯機幫助頁指出這些函數會移動光標,因此不需要顯式移動光標。 顯然是這樣,否則問題將不僅限於重復字符,而且 xterm 也會發生。$TERM
是xterm-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.