如何在terminal中编辑现有文本(并移动光标)?
我看过这个demo,打印出一段文字(就像inputsome-command --help
时会得到的那样),然后跳回到文本中的几个关键字,然后改变文本的颜色已经在terminal打印出来了 。
这对我来说似乎很疯狂。 他们是怎么做到的?
开始思考,我猜stdout
和stdin
在技术上是一个“IOstream”,所以也许这是一个持续variables,跟踪光标的位置? 我记得在构build语言parsing器时做类似的事情。
目标是这样的:假设你在控制台中键入以下内容,并输出一个空白数组,因为在Node.js中,它们都是asynchronous的,我们不希望每次都在控制台中编写asynchronous函数:
$ node app.js > App.User.all() => []
然后当asynchronouscallback执行时,你回去编辑=> []
来包含结果:
$ node app.js > App.User.all() => [#<User id:1>, #<User id:2>...]
即使还有很多其他问题需要解决(至less与这个问题无关),而且我知道你可以定义一个全局的callbackApp.User.all(_c)
像App.User.all(_c)
)。
打印完成后如何编辑terminal输出?
最后发现“演示”:
- https://github.com/asyncly/cdir/blob/223fe0039fade4fad2bb08c2f7affac3bdcf2f89/cdir.js#L24
- http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
-
放置光标:
\033[<L>;<C>H
或\033[<L>;<C>f
(将光标置于L行和C列) - 向上移动光标N行:
\033[<N>A
- 向下移动光标N行:
\033[<N>B
- 向前移动光标N列:
\033[<N>C
- 向后移动光标N列:
\033[<N>D
- 清除屏幕,移动到(0,0):
\033[2J
- 擦除到行尾:
\033[K
- 保存光标位置:
\033[s
- 恢复光标位置:
\033[u
如果你在Mac OX X上工作,我相信程序Eddie会做一些类似于“已经打印完毕后编辑terminal输出”的东西。 (参见“维基百科的Eddie(文本编辑器)”)。
在文件菜单下select“新build”,然后在“设置/文档设置…”下select“shell窗口”。 之后,尝试一些UNIX命令:date,LS,CAL等,然后把你的光标,并编辑这些。
我会尝试与节点,但我不能在Mac OS X 10.5.8下安装它(节点)。