如何在终端中编辑现有文本(并移动光标)?

34

我曾经看到一个演示,它打印出了一个段落的文本(就像在键入 some-command --help 时会得到的那样),然后在已经在终端中打印出来后,跳回到文本中的一些关键字并更改文本颜色。

这对我来说听起来很疯狂。他们是怎么做到的?

开始思考,我想 stdoutstdin 在技术上是一个 "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) 的操作。

如何在终端输出已经打印出来后进行编辑?

2个回答

68
终于找到了那个“演示”:

1
还需要注意的是,最后两个代码(保存光标位置和恢复光标位置)并不被所有终端支持。正如您提供的第二个来源所述:“许多终端模拟器都不支持后两个代码。我知道唯一支持这两个代码的是xterm和nxterm - 即使大多数终端模拟器都基于xterm代码。” - GGG
14
不能在模板字符串或严格模式中使用,但可以用十六进制的\x1b或 Unicode 的\u001b替换八进制的\033 - Jason Goemaat
但是我怎么在光标处输出呢? - undefined

0
如果您正在使用Mac OS X操作系统,我相信Eddie程序可以在终端输出被打印后进行编辑(请参阅“Wikipedia上的Eddie(文本编辑器)”)。
在文件菜单下选择“新建”,然后在“设置/文档设置…”下选择“Shell窗口”。然后尝试一些Unix命令:date、ls、cal等。然后将光标放在需要编辑的地方并进行编辑。
我本来想用Node来尝试的,但是我无法在Mac OS X 10.5.8下安装Node。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接