我的问题可能有一个简单的答案(或根本没有答案),但是什么可能导致 curs_set(0) (使光标不可见)在 tty 上失败,但在终端模拟器上失败?
我的测试代码是最简单的:
#include <ncurses.h>
#include <stdio.h>
int main()
{
initscr(); curs_set(0);
getch();
endwin();
return 0;
}
要么 tty 缺乏禁用光标的能力, 要么 ,用于 tty 的 terminfo 描述中错误定义(或丢失)了禁用光标的代码。具体来说,ncurses 尝试使用“civis”功能。您可以通过“infocmp”命令检查如何以及是否为您的 tty 定义了它。
这个问题的答案包含许多相关细节。
curs_set
手册页说:
curs_set 例程将光标状态设置为 invisible、normal 或 非常明显 可见度分别等于 0、1 或 2。如果 终端支持请求的可见性、先前的光标状态 被退回;否则,返回ERR。
terminfo
手册页中提到:
cursor_invisible civis vi make cursor
invisible
...
cursor_normal cnorm ve make cursor appear
normal (undo
civis/cvvis)
...
cursor_visible cvvis vs make cursor very
visible
linux
终端描述通常是 Linux 虚拟控制台的默认设置,包含必要的字符串:
$ infocmp -1 linux | grep 'c.*vis.*='
civis=\E[?25l\E[?1c,
cvvis=\E[?25h\E[?8c,
如果您将
TERM
设置为其他内容,则这些功能可能不存在。例如:
$ infocmp -1 vt100 | grep 'c.*vis.*='
什么也没找到。