【问题标题】:How to get/set cursor visibility without using libtinfo/libncurses?如何在不使用 libtinfo/libncurses 的情况下获取/设置光标可见性?
【发布时间】:2018-05-03 08:38:15
【问题描述】:

google了很多,发现curs_set()putp(tigetstr() )可以用来隐藏/显示tty光标。我想尽量减少对其他库的依赖,所以我想知道是否可以在不使用libtinfo/libncurses 或调用外部命令(如settermtput)的情况下做到这一点。有没有ioctl() 的命令?

【问题讨论】:

  • 相关:stackoverflow.com/q/2649733/2371524 -- 这是终端的一项功能,虽然终端转义序列有一些标准,但仍有很多变化。如果您希望您的程序可靠运行,只需使用库即可。
  • @ThomasDickey - 与评论中提到的 Felix Palmen 相同。我正在尝试尽量减少对其他库的依赖。
  • printf("\033[?25l"); //不可见 printf("\033[?25h"); //可见在我的终端中工作

标签: c unix ncurses tty


【解决方案1】:

基本上有三种方法:

  1. 如果您的程序仅在控制台终端上执行(例如,因为机器未连接网络),或者仅在大多数常见终端上执行,您可以假定 UTF-8 字符集和ANSI escape codes

    这意味着要隐藏光标,您可以将"\033[?25l" 打印到终端,并打印"\033[?25h" 以显示光标。
     

  2. 要获得适当的终端支持,请使用 terminfo 库。

    您可以直接读取 terminfo 数据库,但这毫无意义,因为如果安装了它,您还有用于访问它的 curses 函数 (tgetent()/tgetnum()/tgetflag())。

    您还应该让您的程序具有区域设置感知能力,并使用例如iconv() 在字符集之间进行转换,而不是假定为 UTF-8。
     

  3. 使用 curses 或 ncursesw(支持宽字符)。

【讨论】:

  • 提到 UTF8 是否意味着 ANSI 转义序列可能不适用于其他语言环境?
  • @pynexj :不,这两者基本上是不相关的。到终端的字符流由两部分组成:控制终端的项目(例如更改/移动光标)和要显示的实际“有效负载”字符。控制序列大部分以 ESC 开头,经常';' 结尾。“有效负载”字符只是显示为终端认为它们应该看起来的样子。 (这可能是 utf8 和/或某种编码)
  • @pynexj:无论使用何种语言环境或字符集,转义序列始终相同。只是如果您关心用户使用的是什么终端,您还应该考虑他们可能使用不同的语言环境,并且可能使用 UTF-8 以外的字符集作为可见内容。否则就像在没有先清洁表面的情况下粉刷表面:总体结果往往不令人满意。
  • 转义码被翻转。隐藏光标应该是:\033[?25l。并显示:\033[?25h.
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2017-10-20
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多