在 GNU 屏幕上强制标题

gre*_*eth 9 gnu-screen zsh window-title

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

编辑: 这是preexec我在我的.zshrc

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

Mik*_*kel 9

取决于事情是如何设置的,但默认情况下,这样的事情应该可以工作。

settitle() {
    printf "\033k$1\033\\"
}
Run Code Online (Sandbox Code Playgroud)

然后运行:

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
Run Code Online (Sandbox Code Playgroud)

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

TITLE="my title"
Run Code Online (Sandbox Code Playgroud)

并通过运行取消设置标题

TITLE=
Run Code Online (Sandbox Code Playgroud)

不要忘记更改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}"
}
Run Code Online (Sandbox Code Playgroud)

然后您可以将您的更改preexec为:

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


Gil*_*il' 5

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

如果命令在命令运行时显示为窗口标题,则这是由preexec函数(在 zsh 中)或bash 下模拟完成的

如果在每个命令完成时标题发生变化,这由precmdzsh 中的PROMPT_COMMAND函数、bash 中的参数或作为PS1任何 shell中的提示(参数)的一部分来完成。(更改标题的命令是任何应用程序作为终端输出流的一部分发出的转义序列,因此它可以嵌入到提示中。)

在您的 shell 初始化文件 ( , , ...) 中查找类似\e]0;new title\a,\e]2;new title\a或的转义序列。如果没有任何相关内容,则该设置可能位于系统文件中(例如, );然后在您自己的初始化文件中覆盖该参数或函数。\eknew title\e\\~/.bashrc~/.zshrc/etc/bash.bashrc/etc/zsh/zshrc

请参阅Mikel 的答案,了解preexec.