4

我正在为自定义脚本语言编写一个 linux shell,我想在用户为单个语句输入的每个后续行之前打印一个“...”,第一行打印一个“>>>” ,然后等待输入。下面是一个例子:

>>> void f() {
...  "this is a test"
... }
>>> 

我正在使用 阅读该行fgets,在我完全阅读后,我打印“...”,然后使用另一个调用重复fgets. 这适用于中等速度的交互式输入。但是如果我将包含换行符的代码粘贴到终端中,我得到的是以下内容

>>> void f() {
 "this is a test"
}
... ... >>> 

“...”的打印太晚了,即使我fflush在将它们打印到stdout. 有谁知道是否有什么特别的事情要做来完成这项工作?

4

2 回答 2

1

如果您关闭stty(1) -echo终端的 echo(请参阅 参考资料),那么您可以完全控制输入何时打印到屏幕上。

我的假设是粘贴导致所有行一次写入终端,并且您的程序永远不会有机会在必要时将输出发送到终端。因此,如果您关闭回显并在用户输入时打印用户输入,您可以在看到换行符时执行特殊处理。

你可以看到irb程序通过运行strace它做了一些非常相似的事情:

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
...
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = 0
于 2011-03-17T23:27:44.907 回答
0

使用 stdio 并没有真正简单的方法 - 您需要使用ncurses之类的东西来控制终端。问题是,当您像这样复制和粘贴多行时,它们都会在一次调用中被拉入 stdin 的读取缓冲区read(2),因此 stdout 没有机会干预并打印干预提示。

于 2011-03-17T23:25:41.987 回答