将终端输入线保留在终端顶部?

将终端输入线保留在终端顶部?

很难准确解释我正在寻找的内容,因此我制作了一些示例输出来说明我希望终端的行为方式。 (行开头的每个数字表示该行的返回,> 表示输入行。

>   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编辑)。

相关内容