如何正确设置GNU Screen以在hardstatus中显示当前正在运行的程序


3

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

shelltitle "$ |bash"

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

这种技术很有用。 hardstatus窗口标题更新为当前正在运行的程序的名称,然后在执行完成后立即切换回默认标题。但是,一个主要问题是这个转义字符串本身没有转义,导致命令长于初始行的换行问题。

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

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

我想知道,有没有人得到这个正常工作 - 即换行和正确更新hardstatus窗口标题?


我不确定我理解你的意思是“屏幕更新我正在键入的实际命令的窗口标题,而不仅仅是当前程序执行后的名称”。如果你这样做,例如, echo test; less somefile 这将是 echo 它显示为窗口标题而不是 less。这是你想要的吗? less 显示而不是?
Dennis Williamson

我试图修复反斜杠重序列的格式,请确保我做对了。请注意,在这种情况下预览是一个小小的错误;反引号的效果比 <pre>。像丹尼斯一样,我不明白你想要达到的目的,你能举个例子吗?
Gilles

@Gilles:你有正确的反斜杠。
Dennis Williamson

例如:如果我输入'less somefile',则hardstatus中的gnu屏幕窗口标题将显示为“less”。这是对的。但是,如果我输入一个长命令,即'cat path / to / some / file&gt;&gt; / path / to / some / new_file&amp;&amp; chmod 755 / path / to / some / new_file',当我输入命令时,gnu screen hardstatus窗口标题将包含while命令行,而不仅仅是'cat'或'chmod'。使用未转义的序列并没有发生这种情况,虽然这不是一个主要问题,但我希望能找到一种完整性的方法来补救它。
johnny_bgoode

Answers:


4

我不认为屏幕是更新该副本的正确位置。你的shell配置真的很容易。你可以定义一个 preexec() 函数在你的shellrc文件中发送它之前运行的详细信息。您可以从那里打印告诉屏幕更改当前窗口标题。我使用的是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()中显示关于将要运行的内容的更清晰的信息。这剥夺了最后一个组件的路径,并做了几个忍者技巧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.