我曾经看过这个演示,它打印了一段文本(就像您在输入
some-command --help
时得到的那样),然后它跳回到文本中的几个关键字并更改了文本颜色,在它已经完成之后在终端中打印出来。
这对我来说似乎很疯狂。他们是怎么做到的?
开始思考它,我猜
stdout
和stdin
在技术上是一个“IO流”,所以也许这是一个跟踪光标位置的持久变量?我记得在构建语言解析器时做了类似的事情。
目标是这样的:假设你在控制台中输入以下内容,它会输出一个空白数组,因为在 Node.js 中,它都是异步的,我们不想每次都在控制台中编写异步函数:
$ node app.js
> App.User.all()
=> []
然后,当异步回调执行时,您返回并编辑
=> []
以包含结果:
$ node app.js
> App.User.all()
=> [#<User id:1>, #<User id:2>...]
即使还有很多其他问题需要解决(与这个问题无关),至少知道如何实现就很棒了。我知道你可以定义一个全局回调并执行类似
App.User.all(_c)
的操作)。
打印后如何编辑终端输出?
终于找到“demo”了:
https://github.com/asyncly/cdir/blob/223fe0039fade4fad2bb08c2f7affac3bdcf2f89/cdir.js#L24
定位光标:
\u001b[<L>;<C>H
或\u001b[<L>;<C>f
(将光标置于L行和C列)
将光标向上移动N行:
\u001b[<N>A
光标向下移动N行:
\u001b[<N>B
将光标向前移动N列:
\u001b[<N>C
光标向后移动N列:
\u001b[<N>D
清屏,移动到(0,0):
\u001b[2J
擦除至行尾:
\u001b[K
保存光标位置:
\u001b[s
恢复光标位置:
\u001b[u
如果您使用的是 Mac OS X,我相信程序 Eddie 会执行类似“在打印终端输出后对其进行编辑”之类的操作。 (参见“维基百科上的艾迪(文本编辑器)”)。
在文件菜单下,选择“新建”,然后在“设置/文档设置...”下选择“Shell 窗口”。之后尝试一些 unix 命令:date、ls、cal 等。然后将光标放在并编辑这些命令。
我本想尝试使用 Node,但无法在 Mac OS X 10.5.8 下安装它(Node)。