在GNU屏幕上强制显示标题


9

默认情况下,屏幕会话的标题是输入的最后一个命令的名称,这对我来说很好,但是在某些情况下,我想更改它。我知道命令Ctrl- A A,但是它只会更改标题直到下一个命令为止,并且我希望它保留在那里直到我决定其他方式为止。

编辑: 这是preexec我在我发现的功能.zshrc

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek$CMD\e\\"
fi

Answers:


9

取决于事物的设置方式,但是默认情况下,类似的事情应该起作用。

settitle() {
    printf "\033k$1\033\\"
}

然后运行:

settitle NEWTITLE

有关更多详细信息,请参见屏幕标题文档GNU屏幕常见问题解答

给定Ctrl+ A A只会更改它,直到下一条命令为止,它可能是由$PS1(所有shell)或$PROMPT_COMMAND/ DEBUG trap(仅bash)或precmd/ preexec(仅zsh)设置的。

你应该找任何地方,\e\033显示带有k或者\\之后,基本上就像我settitle上面的例子。

更新

你说你有习俗preexec

为什么不将其更改为此:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   echo -n "\ek${TITLE:-$CMD}\e\\"
fi

然后,您可以通过运行以下命令来设置自定义标题:

TITLE="my title"

并通过运行取消设置标题

TITLE=

不要忘记进行更改precmd$PS1必要时也要进行更改。

在旁边

你甚至可以此扩大到所有终端(例如xtermgnome-terminal通过不硬编码等)\ek\e\\

这是我的方法:

terminit()
{
    # determine the window title escape sequences
    case "$TERM" in
    aixterm|dtterm|putty|rxvt|xterm*)
        titlestart='\033]0;'
        titlefinish='\007'
        ;;
    cygwin)
        titlestart='\033];'
        titlefinish='\007'
        ;;
    konsole)
        titlestart='\033]30;'
        titlefinish='\007'
        ;;
    screen*)
        # status line
        #titlestart='\033_'
        #titlefinish='\033\'
        # window title
        titlestart='\033k'
        titlefinish='\033\'
        ;;
    *)
        if type tput >/dev/null 2>&1
        then
            if tput longname >/dev/null 2>&1
            then
                titlestart="$(tput tsl)"
                titlefinish="$(tput fsl)"
            fi
        else
            titlestart=''
            titlefinish=''
        fi
        ;;
    esac
}


# or put it inside a case $- in *i* guard
if test -t 0; then
    terminit
fi

# set the xterm/screen/etc. title
settitle()
{
    test -z "${titlestart}" && return 0

    printf "${titlestart}$*${titlefinish}"
}

然后,您可以将其更改preexec为:

if [[ "$TERM" == "screen" ]]; then
   local CMD=${1[(wr)^(*=*|sudo|-*)]}
   settitle "${TITLE:-$CMD}"
fi

您提供的命令与完全相同Ctrl-A A。关于提示,您的意思是$PS1每当我不想更改标题时就必须进行修改?
gregseth

我的意思是检查它不包含ESC k东西ESC \。同上PROMPT_COMMAND。
Mikel

ESC可以书面\e\033
Mikel

屏幕标题docs链接应具有必要的信息
Mikel

5

如果您的窗口标题反映了当前正在窗口中运行的应用程序,那是因为您的外壳正在这样做。如果这样做,是因为您的发行版,系统管理员或您对其进行了配置。

如果命令在运行时显示为窗口标题,则由preexec函数(在zsh中)或其在bash下仿真来完成

如果在每个命令完成时标题都更改了,则可以通过precmdzsh中的PROMPT_COMMAND函数,bash中的参数或PS1在任何shell中作为提示(参数)的一部分来完成。(更改标题的命令是任何应用程序发出的转义序列,作为终端输出流的一部分,因此可以将其嵌入提示中。)

看起来像一个转义序列\e]0;new title\a\e]2;new title\a\eknew title\e\\在你的shell初始化文件(~/.bashrc~/.zshrc,...)。如果有什么相关的设置可以在系统文件(例如/etc/bash.bashrc/etc/zsh/zshrc); 然后在您自己的初始化文件中覆盖该参数或函数。

有关中的可覆盖标题设置,请参见Mikel的答案preexec


谢谢,您说得很清楚。我确实preexec在.zshrc中找到了定义的函数。关键是,这就是我大部分时间想要的行为。我希望能够在一个特定的屏幕上即时禁用它。preexec手动设置标题时,可能会有一个变量可以进入该函数,或者类似的东西?
gregseth

@gregseth:总体上很难解释,但是如果您发布preexec函数,我或其他人可能会建议一个简单的更改。
吉尔(Gilles)'所以

我想提一提preexec,但是格雷格没有说他在用zsh。那会教我的。;-)
Mikel

@Mikel:我的解释比您的解释要好,但是您的新preexec设计比我的要好。
吉尔(Gilles)'所以

我同意。:-)我最初的答案是试图教OP自己寻找答案。您的帮助更加立即。无论哪种方式,我们都赢了。
Mikel
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.