如何在C中写入输入部分?

问题描述

我正在尝试用 C 为学校项目编写一个迷你 shell,我想要做的是做一种命令历史记录(就像在 shell 中一样),当我按下 UP 键时,它会将之前的输入写入输入部分,DOWN则相反,等等...,你可以在按回车之前编辑它发送给程序,像这样(对不起英文不好):[]代表用户光标

my_shell$ some input wrote by me
my_shell$ []
my_shell$ some other input
my_shell$ []
and Now if I press UP
my_shell$ some other input[]
If I press UP again
my_shell$ some input wrote by me[]

我可以使用 termcaps 和其他一些函数 isatty,ttyname,ttyslot,ioctl,getenv,tcsetattr,tcgetattr,tgetent,tgetflag,tgetnum,tgetstr,tgoto,tputs

问题是我看不懂 ioctltty 函数的文档,我找不到关于这些函数的很好解释的教程和示例,我也找不到文档我想用它们做什么。

有人能以一种可以理解的方式向我解释这些功能吗?我应该如何将它们应用于我正在尝试做的事情(我正在寻找一种 Linux-MacOs 兼容方式) 感谢您的帮助。

解决方法

您要问的是非平凡的,需要大量的工作。基本上,您需要做的是使用 tcsetattr 将终端置于非规范模式,在该模式下终端的输入行缓冲被禁用,并且每次击键都会立即返回而不是等待换行符。然后,您必须自己处理每个击键,包括退格/删除和向上/向下箭头。由于您要进行行编辑,因此您可能还必须禁用回显并自己执行回显。

您需要自己维护当前行缓冲区,并且您还需要一个数据结构来存储所有较旧的输入行(历史记录),当点击向上箭头时,您需要擦除您当前为输入缓冲的内容,并将其从屏幕上擦除,然后将历史记录复制到您当前的缓冲区并将其回显到终端。

另一个复杂的问题是像向上箭头和向下箭头这样的键不是 ascii 的一部分,因此不会被读取为单个字节 - 相反,它们将是多字节转义序列(可能以 ESC ({ {1}}) 字符)。您可以使用 '\x1b' 查询终端数据库以找出它们是什么,或者只是对您的 shell 进行硬编码以使用 ANSI sequences,这几乎是您现在看到的所有终端都使用的。