我正在尝试查找是否有可能(以及如何做到这一点,如果是的话)使用 zsh 在终端顶部放置一条固定线路。我想在这一行中加入一些系统信息(例如 cpu 使用情况、磁盘可用空间、ram 使用情况等),以保留经典的“滚动行为”。
我会在桌面的窗口终端中使用它。
任何想法/建议都会非常感激,谢谢!
而不是尝试这样做,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 的输出。
您可以滥用您的提示在屏幕顶部显示一条固定线。它利用几个 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%# '