如何正确设置 GNU Screen 以在硬状态下显示当前正在运行的程序

如何正确设置 GNU Screen 以在硬状态下显示当前正在运行的程序

在 bash 中,要在 GNU Screen 硬状态行中显示当前程序的名称,只需两行配置即可。首先,告诉 screen 提示符的结尾通常是什么样子,并在您坐在 shell 中时为窗口提供默认标题:

shelltitle“$ |bash”

'$ '接下来,将此转义序列放在 PS1 变量中,放在本例中通常终止提示的字符之前:\033k\033\\

在某种程度上,这种技术是有效的。硬状态窗口标题会更新为当前正在运行的程序的名称,然后在执行完成后立即切换回默认标题。然而,一个主要问题是这个转义字符串本身没有被转义,导致命令比初始行长时出现换行问题。

这很烦人,所以我开始寻找解决方案。事实证明,只需转义前一个转义序列即可纠正换行:\[\033k\]\[\033\\\]

太棒了!我的硬状态窗口标题仍然更新为当前正在运行的程序的名称,现在我的长命令可以正确地换行到第二行。但是,使用 PS1 中的这个新转义序列,屏幕会将窗口标题更新为我正在输入的实际命令,而不仅仅是当前程序执行后的名称。

我想知道,有没有人能让它正确工作-即换行和正确更新硬状态窗口标题?

答案1

我认为 screen 不是更新该副本的正确位置。从 shell 配置中执行此操作非常容易。您可以preexec()在 shellrc 文件中定义一个函数,在执行操作之前发送即将运行的内容的详细信息。您可以从那里打印以告诉 screen 更改当前窗口标题。我使用的是 zsh,而不是 bash,因此您的里程会有所不同,但我知道那里也可以做同样的事情。作为参考,在我的 zshrc 文件中,我有类似以下内容:

# If running in screen, set the window title to the command about to be executed
preexec() {
    [ -n "$WINDOW" ] && print -Pn "^[k$2^[\\"
}

# If in screen, blank the window title when displaying the prompt
premd() {
    [ -n "$WINDOW" ] && print -Pn "^[k ^[\\"
}

实际上,我在将命令显示为标题之前对其进行了一些清理。例如,您可以print -Pn "^[k`echo $2|perl -pne 's!\s.*/! !g'|cut -c1-16`^[\\"在上面的 preexec() 中使用,以显示有关即将运行的内容的更清晰的信息。这会剥离到最后一个组件的路径,并执行一些忍者技巧。

答案2

以下是 Bash 的使用说明。我假设您使用用户,因此#用于shelltitle。对于普通用户使用$

.screenrc

hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
shelltitle '# |bash'

.bashrc

PS1='\u@\h [\w] \$ '

if echo $TERM | grep ^screen -q
then
    PS1='\[\033k\033\\\]'$PS1
fi

相关内容