5

我正在尝试查找是否有可能(以及如何做到这一点,如果是的话)使用 zsh 在终端顶部放置一条固定线路。我想在这一行中加入一些系统信息(例如 cpu 使用情况、磁盘可用空间、ram 使用情况等),以保留经典的“滚动行为”。

我会在桌面的窗口终端中使用它。

像这样的东西

任何想法/建议都会非常感激,谢谢!

4

2 回答 2

5

而不是尝试这样做,zsh我建议使用tmux它。如果您在其中设置以下内容,~/tmux.conf它应该具有预期的效果:

set -g status-position top
set -g status-right '#(system-information-command)'
set -g status-intervall 10

它将在顶部放置一个状态栏,在其中打印system-information-command' 输出的第一行并每 10 秒更新一次。

推理:

虽然在终端的第一行从内部打印一些东西很容易,zsh而且——如果需要的话——不断更新它并不是那么困难,但保持滚动行为将非常困难,如果不是不可能的话zsh

原因是回滚缓冲区由终端维护,而不是由zsh. 到终端的任何输出都在光标的当前位置完成。如果在光标位置或之后已经打印了任何内容,它将被覆盖。没有办法插入任何东西。

除非将光标明确设置到某个位置,否则它将位于最后一个输出的末尾,大部分时间位于终端的最底部。如前所述,将光标放在第一行,写一些东西并将其重置到之前的位置非常容易。但是打印状态行之前第一行中的任何内容都将被覆盖。zsh只能写入终端,不能从之前的输出中读取。因此,无论状态栏覆盖什么,都无法恢复。

如果您在终端中向上滚动,先前打印的状态行将与终端的其余内容一起向下移动。如果命令的输出高于终端,则至少会覆盖一行。

tmux是终端多路复用器。它本质上在您的终端内运行一个终端(或更多终端)。zsh然后在其中启动的任何程序都将在“内部”终端中运行。同时状态行将被打印到“外部”终端,并且不会干扰 shell 的输出。

于 2014-10-17T07:55:39.423 回答
2

您可以滥用您的提示在屏幕顶部显示一条固定线。它利用几个 ANSI 转义码来操作光标的位置。

  • \e[s- 保存光标位置
  • \e[u- 恢复光标位置
  • \e[H- 将光标移动到屏幕的左上角

请务必附上任何此类转义序列,以及顶行本身的文本,%{ ... %}这样它们zsh就不会计入提示的大小。

PS1=$'%{\e[s\e[HTOPLINE\e[u%}%# '

请注意,不像bash,zsh不会\e在提示中进行特殊处理,因此请改用$'...'-style 引用。如果您不能(或不想)使用它们,您可以尝试使用Control-输入文字转义字符V Esc(将显示为^[):

PS1='^[[s^[[HTOPLINE^[[u%# '
于 2014-10-18T13:13:32.533 回答