ncurses' has_colors() returns 错误。问题是什么?

ncurses' has_colors() returns false. What is the problem?

我想在 ncurses 模式下使用颜色属性。但是如题中所述,has_colors() returns false,意思是终端不支持颜色操作。但是使用 printf() 和 ansi 颜色代码(不是在 ncurses 模式下),我可以打印彩色文本。我认为这意味着终端支持颜色操作。我错了吗?有什么问题?

这是我使用的代码:

int main()
{
    initscr();

    if (has_colors() == false)
    {
        endwin();
        printf("No color support!\n");
        return -1;
    }

    start_color();
    init_pair(1, COLOR_RED, COLOR_BLACK);

    attron(COLOR_PAIR(1));
    printw("This is a test!");
    attroff(COLOR_PAIR(1));

    endwin();

    return 0;
}

ncurses 中的终端配置有两种风格,具体取决于 ncurses 是使用 terminfo 支持还是 termcap 支持编译的。

无论如何,has_colors() 是一个函数,它根据您用于 TERM 环境变量的值查询 curses 数据库(一个基于终端行为的终端控制数据库)。

xterm 可能不包含任何颜色控件,并且可能是什么导致您的终端软件无法显示颜色。只需将 TERM 变量更改为:

TERM=xterm-color

然后重试。该终端定义包括颜色支持并使 has_colors() 到 return true.

编辑

来自我自己的 termcap 文件(基于 FreeBSD 12.1 系统):

xterm-clear:\
        :te=\E[?1049l:ti=\E[?1049h:\
        :tc=xterm-new:
xterm-new|modern xterm:\
        :@7=\EOF:@8=\EOM:F1=\E[23~:F2=\E[24~:K2=\EOE:Km=\E[M:\
        :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
        :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kI=\E[2~:\
        :kN=\E[6~:kP=\E[5~:kd=\EOB:kh=\EOH:kl=\EOD:kr=\EOC:ku=\EOA:\
        :tc=xterm-basic:
#
# This chunk is used for building the VT220/Sun/PC keyboard variants.
xterm-basic|modern xterm common:\
        :am:bs:km:mi:ms:ut:xn:AX:\
        :Co#8:co#80:kn#12:li#24:pa#64:\
        :AB=\E[4%dm:AF=\E[3%dm:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
        :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\E[L:\
        :as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
        :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\
        :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\
        :kD=\E[3~:kb=^H:ke=\E[?1l\E>:ks=\E[?1h\E=:kB=\E[Z:le=^H:md=\E[1m:\
        :me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:op=\E[39;49m:\
        :rc=\E8:rs=\E[!p\E[?3;4l\E[4l\E>:sc=\E7:se=\E[27m:sf=^J:\
        :so=\E[7m:sr=\EM:st=\EH:\
        :ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?12l\E[?25h:vi=\E[?25l:vs=\E[?12;25h:

# The xterm-new description has all of the features, but is not completely
# compatible with vt220.  If you are using a Sun or PC keyboard, set the
# sunKeyboard resource to true:
#       + maps the editing keypad
#       + interprets control-function-key as a second array of keys, so a
#         12-fkey keyboard can support vt220's 20-fkeys.
#       + maps numeric keypad "+" to ",".
#       + uses DEC-style control sequences for the application keypad.
#
xterm-vt220|xterm emulating vt220:\
        :*6=\E[4~:@7=\E[4~:K2=\EOu:Km=\E[M:kH=\E[4~:kh=\E[1~:\
        :tc=xterm-basic:

xterm-24|xterms|vs100|24x80 xterm:\
        :li#24:tc=xterm-old:
xterm-65|65x80 xterm:\
        :li#65:tc=xterm-old:
xterm-bold|xterm with bold for underline:\
        :so=\E[7m:us=\E[1m:tc=xterm-old:
xterm-boldso|xterm with bold for standout:\
        :se=\E[m:so=\E[1m:tc=xterm-old:
xterm-mono|monochrome xterm:\
        :ut@:\
        :Co@:NC@:kn#20:pa@:\
        :AB@:AF@:Sb@:Sf@:op@:st@:tc=xterm-old:
#
# Alternate terminal description that "works" for interactive shells such as
# tcsh and bash.
xterm-noapp|xterm with cursor keys in normal mode:\
        :kd=\E[B:ke=\E>:kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:te@:ti@:\
        :tc=xterm:
#
# This should work for the commonly used "color xterm" variations (XFree86
# xterm, color_xterm, nxterm, rxvt).  Note that it does not set 'bce', so for
# XFree86 and rxvt, some applications that use colors will be less efficient,
# and in a few special cases (with "smart" optimization) the wrong color will
# be painted in spots.
xterm-color|generic "ANSI" color xterm:\
        :Co#8:NC@:pa#64:\
        :AB=\E[4%dm:AF=\E[3%dm:ac=:op=\E[m:tc=xterm-r6:
#
# These aliases are for compatibility with the terminfo; termcap cannot provide
# the extra features such as color initialization, but termcap applications
# still want the names.
xterm-16color|xterm alias 1:\
        :tc=xterm-new:

xterm-88color|xterm alias 2:\
        :Co#88:pa#7744:tc=xterm-256color:

xterm-256color|xterm alias 3:\
        :Co#256:pa#32767:\
        :AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new:

xterm-nrc|xterm alias 4:\
        :tc=xterm:
xterm-rep|xterm alias 5:\
        :tc=xterm:
xterm-xmc|xterm alias 6:\
        :sg#1:tc=xterm:
#
# An 8-bit description is doable with termcap, but there are probably no
# termcap (or BSD curses) applications that are able to use it.
#
# Add the capability to "clear the screen" after exiting vi, more/less, etc.
#
xterm-8bit-clear:\
        :te=3?1049l:ti=3?1049h:ue=324m:\
        :tc=xterm-8bit:
xterm-8bit|xterm terminal emulator 8-bit controls (X Window System):\
        :am:km:mi:ms:xn:\
        :co#80:it#8:li#24:\
        :AL=3%dL:DC=3%dP:DL=3%dM:DO=3%dB:IC=3%d@:\
        :K2=7y:Km=3M:LE=3%dD:RI=3%dC:UP=3%dA:\
        :ae=\E(B:al=3L:as=\E(0:bl=^G:bt=3Z:cd=3J:ce=3K:\
        :cl=3H32J:cm=3%i%d;%dH:cr=^M:cs=3%i%d;%dr:\
        :ct=33g:dc=3P:dl=3M:do=^J:ei=34l:ho=3H:\
        :im=34h:\
        :is=\E[62"p\E G3m3?7h\E>\E73?1;3;4;6l34l3r\E8:\
        :k1=311~:k2=312~:k3=313~:k4=314~:k5=315~:\
        :k6=317~:k7=318~:k8=319~:k9=320~:kD=33~:\
        :kI=32~:kN=36~:kP=35~:kb=^H:kd=7B:\
        :ke=3?1l\E>:kh=31~:kl=7D:kr=7C:ks=3?1h\E=:\
        :ku=7A:le=^H:mb=35m:md=31m:me=3m:mr=37m:\
        :nd=3C:rc=\E8:sc=\E7:se=327m:sf=^J:so=37m:sr=5:\
        :st=0:ta=^I:ue=324m:\
        :up=3A:us=34m:vb=3?5h3?5l:ve=3?25l3?25h:\
        :vs=3?12;25h:vi=3?25l:
#
xterm-hp|xterm with hpterm function keys:\
        :@7=\EF:k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\
        :k8=\Ew:kC=\EJ:kD=\EP:kI=\EQ:kN=\ES:kP=\ET:kd=\EB:kh=\Eh:\
        :kl=\ED:kr=\EC:ku=\EA:tc=xterm-basic:
#
xterm-sco|xterm with SCO function keys:\
        :@7=\E[F:F1=\E[W:F2=\E[X:F3=\E[Y:F5=\E[a:F6=\E[b:F7=\E[c:\
        :F8=\E[d:F9=\E[e:FA=\E[f:FB=\E[g:FC=\E[h:FD=\E[i:FE=\E[j:\
        :FF=\E[k:ac=:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:\
        :k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:k;=\E[V:kD=7:kI=\E[L:\
        :kN=\E[G:kP=\E[I:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\
        :tc=xterm-basic:
#
xterm-vt52|xterm emulating vt52:\
        :bs:\
        :co#80:it#8:li#24:\
        :ae=\EG:as=\EF:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
        :cr=^M:do=\EB:ho=\EH:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
        :le=\ED:nd=\EC:nw=^M^J:sf=^J:sr=\EI:ta=^I:up=\EA:
#
xterm-sun|xterm with Sun functionkeys:\
        :%1=\E[196z:&8=\E[195z:@0=\E[200z:@5=\E[197z:@7=\E[220z:\
        :F1=\E[192z:F2=\E[193z:K2=\E[218z:Km=\E[M:k1=\E[224z:\
        :k2=\E[225z:k3=\E[226z:k4=\E[227z:k5=\E[228z:k6=\E[229z:\
        :k7=\E[230z:k8=\E[231z:k9=\E[232z:k;=\E[233z:kD=\E[3z:\
        :kI=\E[2z:kN=\E[222z:kP=\E[216z:kh=\E[214z:\
        :tc=xterm-basic:
#
# vi may work better with this entry, because vi doesn't use insert mode much.
# |xterm-ic|xterm-vi|xterm with insert character instead of insert mode:\
xterm-ic|xterm-vi|xterm with insert char:\
        :mi@:\
        :IC=\E[%d@:ei@:ic=\E[@:im@:tc=xterm:
#
# Compatible with the X11R6.3 xterm
#
# Add the capability to "clear the screen" after exiting vi, more/less, etc.
#
xterm-r6-clear:\
        :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:ue=\E[m:\
        :tc=xterm-r6:
xterm-r6|xterm-old|X11R6 xterm:\
        :am:bs:km:mi:ms:pt:xn:\
        :co#80:kn#20:li#24:\
        :*6=\E[4~:@0=\E[1~:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
        :DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:\
        :F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:\
        :FA=\E[34~:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:\
        :as=^N:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\
        :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:eA=\E)0:ei=\E[4l:\
        :ho=\E[H:im=\E[4h:\
        :is=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:\
        :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\
        :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\
        :kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:\
        :ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
        :ku=\EOA:md=\E[1m:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:\
        :rc=\E8:rs=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:\
        :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
        :ue=\E[m:up=\E[A:us=\E[4m:
#
# Compatible with the R5 xterm
#
# Add the capability to "clear the screen" after exiting vi, more/less, etc.
#
xterm-r5-clear:\
        :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:ue=\E[m:\
        :tc=xterm-r5:
xterm-r5|X11R5 xterm X11R5:\
        :am:bs:km:mi:ms:pt:xn:\
        :co#80:kn#4:li#24:\
        :@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
        :IC=\E[%d@:UP=\E[%dA:al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
        :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\
        :ei=\E[4l:ho=\E[H:im=\E[4h:\
        :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l:\
        :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:kb=^H:kd=\EOB:\
        :ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
        :ku=\EOA:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:rc=\E8:\
        :rs=\E>\E[?1;3;4;5;6l\E[4l\E[?7h\E[m\E[r\E[2J\E[H:\
        :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
        :up=\E[A:us=\E[4m:
#
# Customization begins here.
xterm-xfree86|xterm terminal emulator (XFree86):\
        :tc=xterm-new:
#
# This is the only entry which you should have to customize, since "xterm"
# is widely used for a variety of incompatible terminal emulations including
# color_xterm and rxvt.
xterm|X11 terminal emulator:\
        :tc=xterm-new:
#       :tc=xterm-r6: