很难准确解释我正在寻找的内容,因此我制作了一些示例输出来说明我希望终端的行为方式。 (行开头的每个数字表示该行的返回,> 表示输入行。
> me@computer:~$
5. me@computer:~$ cat somefile < command
start of file < output
< output
this < output
is < output
the < output
content < output
of < output
the < output
file < output
< output
end of file < output
4. me@computer:~$
3. me@computer:~$
2. me@computer:~$
1. me@computer:~$ echo this is the first line < command
this is the first line < output
在此示例中,您键入要执行的命令的输入行将始终位于顶部。可以这么说,它将把每个命令及其输出作为“事件”向下推送。因此,如果您 cat 一个文件,它会以相反的顺序输出所有内容,因此每个命令的输出外观不会改变,只是位置不同。
答案1
也许有人已经这样做了(也许没有)。这必须由知道如何收集命令输出并更新屏幕的 shell 来完成。常规终端本身不会执行此操作。
假设有一个程序在每个命令上执行此操作
- 它会接受您的输入命令(可能是多行)。为了简单起见,首先将输入限制为单行。
- 获取文本后,shell 将运行该命令,一次从命令的标准输出中收集一行和错误。
- 当它获取新的输出行时,它必须在屏幕上插入该行,从而下推现有文本。随着读取更多输出,插入点向下移动。 (终端提供低级运营可以提供帮助,但这距离成功还有很长的路要走工作)。
- 如果输出多于屏幕所能容纳的数量,用户可能希望在插入点到达屏幕底部时输出开始向上滚动。
- 当没有更多输出(命令停止)时,shell 将光标移回屏幕顶部。
所有的那在一个简单的程序中是可行的。困难的是命令是否想自己接管屏幕。执行此操作的程序将(您猜对了)写入标准输出和标准错误。而且他们不编写纯文本:他们使用转义序列在屏幕上移动。
如果将此限制为发送终端初始化序列的行为良好的应用程序,则您的 shell 可以(原则上)检测到此情况并暂时放弃,从而允许命令写入屏幕。但表现良好的应用程序并不占大多数,您将有许多有趣的特殊情况需要处理。
答案2
这是一个有趣的想法,但我认为目前还没有任何东西可以做到这一点。有许多相互关联的部分必须协同工作才能做到这一点。
没有太多尝试改变终端的工作方式,因为它们有数十年的增量历史,并且始终以相同的基本方式工作,彻底改变这一点将破坏现有应用程序的分配。
也就是说,编写一个简单的 ncurses 应用程序来执行您想要的操作并不是很难,但它只能在基本命令上运行,任何需要成熟终端的操作都会失败(例如 vim、nano、screen、top 等)。支持他们将是一项大量的工作。
然而,最近在创建现代终端应用程序方面进行了一些尝试,其中一些允许您直接显示图像/视频;例如术语。我见过的最激进的是黑屏您可能对此感兴趣。它并不完全是您正在寻找的东西,并且仍处于相当早期的开发阶段(您可能会遇到问题),但可能会为您希望它的工作方式提供一些相同的优势(突出显示命令,可以很容易地看到命令的输出开始/停止等)。
答案3
如果所有这些想象的设计都是为了帮助您更自然地阅读终端,那么您是否考虑过以相反的方式解决问题?
- 提示总是在底部,
- 旧的命令和输出在屏幕上流动。
这基本上意味着您重用终端的原始行为,唯一的区别是您希望启动终端并立即将提示推到底部。
我通过以下几行代码实现了这一点~/.bashrc
:
__prompt_to_bottom_line() {
tput cup $LINES
}
alias clear='clear && __prompt_to_bottom_line'
请注意,您需要的方法是有问题的,因为它需要以一种不平凡的方式更改输出行的顺序:
- 命令必须以相反的顺序呈现,
- 但每个命令的输出必须按原始顺序呈现。
我的方法不会受到这种不均匀性的影响,正是因为我所做的就是从一开始就将提示推到底部。
本质上,我的屏幕是tac
你的屏幕(同样,命令的输出,如果是多行的,不是真正的tac
编辑)。