Linux终端控制与ANSI转义序列

这篇具有很好参考价值的文章主要介绍了Linux终端控制与ANSI转义序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

在Windows系统中,我们可以通过系统提供的接口操作控制台缓冲区的显示。那么在linux平台应该如何实现呢?答案就是ANSI转义序列
在计算机系统中,ANSI转义码(或转义序列)是一种使用带内信号控制视频文本终端的格式、颜色和其他输出选项的方法。
为了编码这种格式化信息,特定的字节序列被嵌入到文本中,终端将查找并将其解释为命令,而不是字符代码。

2 CSI

实际上,ANSI转义序列的范围比较大,包括ASCII码表中的被称为Control characters 控制字符(C0代码)之外,还包括了ESC字符开头的C1代码。
而这里介绍的就是C1代码中最常用的部分CSI序列
ANSI转义序列中以 ESC [ 开头的叫作 Control Sequence Introducer,简写为 CSI
以 CSI 开头的指令有很多,大致可分四类:光标控制、屏幕控制、和字符渲染(Graphic Rendition)指令。
CSI序列的语法如下所示:

0x1B + "[" + [[0-9]*[;]] + <fun>
  • 开始,0x1B 是ansi escape code开始的标准
  • 其次,[ 是CSI (Control Sequence Introducer)
  • 然后,中间部分由0个或者多个数字组成,是函数的参数,多个参数之间由分号进行分割
  • 最终,一个字母代表需要调用的函数名

CSI (Control Sequence Introducer) 各部分的字符范围如下:

组成部分 字符范围 ASCII
参数字节 0x30–0x3F 0–9:;<=>?
中间字节 0x20–0x2F 空格、!"#$%&’()*+,-./
最终字节 0x40–0x7E @A–Z[]^_`a–z{
2.1 光标控制
控制码 说明
\033[nA 光标上移 n(默认1) 行 <<若至屏幕顶端则无效>>
\033[nB 光标下移 n (默认1)行 <<若至屏幕底端则无效>>
\033[nC 光标前移 n (默认1)列 <<若至屏幕右端则无效>>
\033[nD 光标后退 n (默认1)列 <<若至屏幕左端则无效>>
\033[nE 光标下移 n (默认1)行 <<非标准>>
\033[nF 光标上移 n (默认1)行 <<非标准>>
\033[nG 光标移动至当前行n(默认1)列 <<非标准>>
\033[x;yH 光标移动至x行y列(默认从1开始,左上角)
\033[s 保存光标位置
\033[u 取出保存的光标位置来使用
\033[?25l 隐藏光标
\033[?25h 显示光标
2.2 屏幕控制
控制码 说明
\033[nJ 清除指定范围屏幕。0:光标位置至屏幕末尾;1:光标位置至屏幕开头;2:全屏幕
\033[nK 擦除行中指定范围列。0:光标位置至行尾;1:光标位置至行头;2:整行
\033[nS 整页向上滚动n行。<<非标准>>
\033[nT 整页向下滚动n行。<<非标准>>
2.3 字符渲染

字符渲指令全称 Select Graphic Rendition,简写为 SGR。其格式为 CSI n m,以数字开头,并以 m 结尾,n 的取值范围是 0-107。又可以分成两类,一类控制字符显示样式,另一类控制显示颜色。

代码 含义
0 所有属性 OFF,即返回正常显示模式 (Normal)
1 粗体(Bold)/高亮度显示 (Bright)
3 斜体(未广泛支持)
4 下划线
5 闪烁显示
7 反显(前景色与背景色交换)
39 默认前景色
49 默认背景色

设置颜色:

前景 背景 颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色

3 示例

3.1 清除屏幕
  printf("\x1b[2J"); // 清屏幕
  printf("\x1b[?25l"); // 设置光标不可见
3.2 禁用回显
  struct termios setting;
  tcgetattr(STDIN_FILENO, &setting); // 禁用回显
  setting.c_lflag &= ~ECHO;
  tcsetattr(STDIN_FILENO, TCSANOW, &setting);
3.3 获取标准输入
  fd_set io;
  FD_SET(STDIN_FILENO, &io);
  timeval timeout = {sec, usec};
  select(STDIN_FILENO + 1, &io, NULL, NULL, &timeout); // 监听标准输入

  char cmd[10] = {0};
  read(STDIN_FILENO, cmd, sizeof(cmd)); // read读取标准输入避免循环getc阻塞
3.4 数据输出到屏幕
  printf("\x1b[2;1H"); // 光标定位至第二行开头
  printf("\x1b[30;47m"); // 设置白底黑字
  fill(header, strlen(header)); // 输出
  printf("\x1b[39;49m"); // 设置默认颜色

// 光标移动至指定行的行首
void move(int y) { printf("\x1b[%d;1H", y); }

// 输出字符串同时清除光标后的列
void print(const char* str) { printf("%s\x1b[K", str); }

4 完整示例

平台实现简单的进程信息查看。simple_taskmgr文章来源地址https://www.toymoban.com/news/detail-728477.html

到了这里,关于Linux终端控制与ANSI转义序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • R语言【cli】——ansi_strtrim():截断ANSI字符串

    Package  cli  version 3.6.0 此函数类似于base::strtrim(),但可以正确处理ANSI样式的字符串。它还增加了……(如果允许Unicode字符,则为对应的Unicode字符)到截断字符串的末尾。 参数【x】 :ANSI字符串的字符向量。 参数【width】 :截断到的宽度。 参数【ellipsis】 :要追加到截断字符

    2024年01月23日
    浏览(42)
  • R语言【cli】——ansi_nzchar():检查是否存在ANSI语句

    Package  cli  version 3.6.0 参数【x】 :Charcater向量。其他对象使用base::as.character()进行转换。 参数【...】 :传入base::nzchar()。

    2024年01月21日
    浏览(49)
  • R语言【cli】——ansi_strsplit():分割ANSI命令彩色字符串

    Package  cli  version 3.6.0 这是base::strsplit()的彩色版本。它的工作方式与原版几乎一样,只不过保留了子字符串的色彩。 参数【x】 :字符向量,可能是ANSI样式的,或者是强制转换为字符的向量。 参数【split】 :长度为1的字符向量(或可以强制为1的对象)包含用于分割的正则表达

    2024年01月22日
    浏览(48)
  • R语言【cli】——ansi_html():将ANSI格式文本转换为HTML

    Package  cli  version 3.6.0 参数【x】 :输入字符向量。 参数【escape_reserved】 :是否转义HTML中保留的字符(、和)。 参数【csi】 :如何处理非sgr ANSI序列,要么“keep”,要么“drop”它们。 字符向量的HTML。

    2024年01月22日
    浏览(50)
  • R语言【cli】——ansi_grep(),ansi_grepl():与base::grep()和base::grepl()类似,但针对的是ANSI字符串

    Package  cli  version 3.6.0 第一个ANSI序列将使用ansi_strip()剥离 参数【pattern】 :字符标量、正则表达式或固定字符串(如果fixed = TRUE),要搜索的模式。其他对象将使用as.character()强制执行。 参数【x】 :要搜索的字符向量。其他对象将使用as.character()强制执行。 参数【ignore.case,

    2024年01月20日
    浏览(49)
  • R语言【cli】——ansi_strip():抹除字符串中所有的ANSI标记

    Package  cli  version 3.6.0 输入可以是cli_ansi_string类,这也从结果中删除。 参数【string】 :输入字符串。 参数【sgr】 :是否移除SGR(样式化)控制序列。 参数【csi】 :非sgr控制序列是否移除。 参数【link】 :是否移除ANSI超链接。 清理干净后的字符串。注意,ansi_strip()总是放弃

    2024年01月21日
    浏览(44)
  • R语言【cli】——ansi_substr():ANSI彩色字符串的子字符串

    Package  cli  version 3.6.0 这是base::substr()的颜色感知副本。它的工作原理与原来的完全相同,但保留了子字符串中的颜色。在计算字符串中的位置时,忽略ANSI转义序列。 参数【x】 :字符向量,可能是ANSI样式的,或者是强制转换为字符的向量。 参数【start】 :起始索引或索引

    2024年01月22日
    浏览(47)
  • R语言【cli】——ansi_nchar():计数ANSI彩色字符串中的字符数

    Package  cli  version 3.6.0 这是utf8_nchar()的颜色感知版本。默认情况下,它计算Unicode字形簇,而不是代码点。 参数【x】 :字符向量,可能是ANSI样式的,或者是要强制字符化的向量。如果转换为UTF-8。 参数【type】 :是否对字素(字符)、码点、字节进行计数,还是计算字符串的显

    2024年01月23日
    浏览(49)
  • R语言【cli】——ansi_has_any():检查字符串里是否存在ANSI格式

    Package  cli  version 3.6.0 参数【string】 :要检查的字符串。它也可以是字符向量 参数【sgr】 :是否查找SGR(样式化)控制序列。 参数【csi】 :是否查找非sgr控制序列。 参数【link】 :是否查找ANSI超链接。 逻辑向量,对于具有某种ANSI样式的字符串为TRUE。

    2024年01月20日
    浏览(52)
  • R语言【cli】——ansi_strwrap():将ANSI样式的字符串包装为一定的宽度

    Package  cli  version 3.6.0 这个函数类似于base::strwrap(),但它适用于ANSI样式的字符串,并且保持样式不变。 参数【x】 :ANSI字符串。 参数【width】 :换行到的宽度。 参数【indent】 :每段第一行的缩进。 参数【exdent】 :缩进每段后面的行。 参数【simplify】 :是否在单个字符向

    2024年01月22日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包