【发布时间】:2014-12-12 11:06:42
【问题描述】:
我正在尝试查找是否可以使用 zsh 在终端顶部放置一条固定线路(以及如何做,如果是的话)。我想在这一行中加入一些系统信息(例如 cpu 使用情况、磁盘可用空间、ram 使用情况等),以保留经典的“滚动行为”。
我会在桌面的窗口终端中使用它。
任何想法/建议都会非常感激,谢谢!
【问题讨论】:
标签: plugins terminal window zsh oh-my-zsh
我正在尝试查找是否可以使用 zsh 在终端顶部放置一条固定线路(以及如何做,如果是的话)。我想在这一行中加入一些系统信息(例如 cpu 使用情况、磁盘可用空间、ram 使用情况等),以保留经典的“滚动行为”。
我会在桌面的窗口终端中使用它。
任何想法/建议都会非常感激,谢谢!
【问题讨论】:
标签: plugins terminal window zsh oh-my-zsh
我建议不要尝试在 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,因此请改用$'...' 样式的引用。如果您不能(或不想)使用它们,您可以尝试使用 Control-V Esc 键入文字转义字符(将显示为^[):
PS1='^[[s^[[HTOPLINE^[[u%# '
【讨论】:
tmux 还提供了很多除了持久状态栏之外的好处,所以无论如何我都建议查看tmux。