在 GNU 屏幕上强制显示标题

在 GNU 屏幕上强制显示标题

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

编辑: 这是preexec我在我的中找到的功能.zshrc

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

答案1

取决于如何设置,但默认情况下,类似的东西应该可以工作。

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

然后运行:

settitle NEWTITLE

屏幕标题文档GNU 屏幕常见问题解答更多细节。

给定的Ctrl+仅在下一个命令之前更改它,它可能由(所有 shell)或/ (仅 bash)或/ (仅 zsh)A A设置。$PS1$PROMPT_COMMANDDEBUG trapprecmdpreexec

您应该寻找与它一起或之后出现的任何地方\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

在旁边

您甚至可以通过不对和进行硬编码来将其扩展到所有终端(例如xterm,等) 。gnome-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

答案2

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

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

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

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

米克尔的回答中的可重写标题设置preexec

相关内容