Lap*_*try 9 shell prompt terminal async terminfo
我正在使用一些终端功能在bash
. 我想得到这样的东西:在输出字符串时PROMPT_COMMAND
,保存终端光标位置,打印放置...
并执行其他操作(例如打印其他信息);然后一段时间后回到记忆的位置并打印一些新的东西。PS1
被设计成命令本身放在换行符上,因此异步输出只是终端中的文本。
我发现cup
terminfo 条目将光标移动到给定位置,还有转义码可以获取当前位置(例如,请参阅此问题)。但对我来说,似乎所有这些都在屏幕上使用光标位置,而不是在终端缓冲区中。这意味着在放置新行后,我记住的位置将是错误的。
有没有办法使用终端光标位置来根据缓冲区位置存储和恢复光标位置?您可以假设记住的位置仍然在缓冲区的可见部分(因此您实际上可以将光标放在那里),但它可能会向上移动几行。现在,让我们不考虑竞争条件。如果没有,我会尝试寻找其他技巧。
有zsh
外壳实际上具有异步提示支持,但我实际上不知道它是否会在输出之前用户按下Enter以转到新行。
Tho*_*key 15
您可能使用的大多数终端都实现了用于保存和恢复光标位置的转义序列。这些是终端描述中的sc
(save cursor) 和rc
(restore cursor) 功能,您可以通过tput
(就像cup
)使用它们:
tput sc
tput cup 50 10
echo some stuff
echo more stuff
tput rc
Run Code Online (Sandbox Code Playgroud)
但是,如果您的程序写入了足够多的文本来强制滚动,则恢复的位置仍将位于终端屏幕上的同一位置。它不会随着滚动的文本移动。
顺便说一下,POSIX 只记录了其中的一部分,tput
因为该工具实际上是另一个标准 X/Open Curses 的一部分。手册页的可移植性部分对此进行了总结。
回到问题:没有跟踪缓冲区位置的转义序列(考虑滚动)。为此,您的应用程序必须跟踪发送到屏幕的内容。解决这类问题正是curses 库的用途。在普通的命令行应用程序中,您无能为力。
归档时间: |
|
查看次数: |
4525 次 |
最近记录: |