使用屏幕时设置 xterm (PuTTY) 窗口标题?

Jam*_*ers 12 putty gnu-screen

我正在尝试screen设置我的xterm标题。我在 之外工作screen,但screen在我开始时保留任何标题。这是我的.bashrc

函数 bash_prompt_command() {
    # $PWD 应该保留多少个字符
    本地 pwdmaxlen=25
    # 表示有dir truncation
    本地 trunc_symbol=".."
    本地目录=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    本地 pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    如果 [ ${pwdoffset} -gt "0" ]
    然后
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    菲

    导出 NEW_PWD
}

PROMPT_COMMAND=bash_prompt_command
# 颜色图表@ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
案例“${TERM}”在
    "xterm")
        标题栏='\[\033]0;\u@\h > ${NEW_PWD}\007\]'
        PS1="${TITLEBAR}\[\e[1;32m\][\e[0;36m\]\u\e[1;32m\]@\e[1;33m\]\h\e[ 1;32m\]] \e[0;37m\]\${NEW_PWD}/ \e[1;32m\]\$ \[\e[0m"
        ;;
    “屏幕”)
        标题栏='\[\033]0;\u@\h > ${NEW_PWD}\007\]'
        ESC='\[\ek\e\\\]'
        PS1="${TITLEBAR}\[\e[1;32m\][\e[0;36m\]\u\e[1;32m\]] \e[0;37m\]\${NEW_PWD} / \e[1;32m\]\$ ${ESC}\[\e[0m"
        ;;
    *)
        PS1="\[\e[1;32m\][\e[0;36m\]\u\e[1;32m\]@\e[1;33m\]\h\e[1;32m\ ]] \e[0;37m\]\${NEW_PWD}/ \e[1;32m\]\$ \[\e[0m"
    ;;
esac

这是我的.screenrc

硬状态总是最后一行
硬状态字符串 '%{= kg}[%{Y}%H%{g}][%= %{= kw}%?%-Lw%?%{=b kR}(%{W}%n-% t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]% {g}[%{B}%m.%d.%Y %{G}%c%{g}]'

termcapinfo xterm|xterms|xs|rxvt ti@:te@
termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

替代屏幕
shelltitle '$ |bash'

我做错了什么?

更新(2010 年 8 月 19 日): 问题是当您设置alwayslastline. 所以我的解决方案是放弃并为我的屏幕会话选择一个预定的、有用的标题。我的更新.bashrc.screenrc可以在这里找到http://bitbucket.org/jsumners/rcfiles/src

小智 7

实际上,有一种方法可以通过屏幕将转义序列直接发送到 xterm。它不容易找到,但从屏幕代码 (src/ansi.c) 中我认为它自 2005 年以来就存在。我在 xterm、Gnome 终端和腻子中使用它。我在 mintty 来源中发现了一个注释,表明它在那里不起作用,因为它们不处理 DCS(除非它最近已修复)。

从下面的屏幕文档(在http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.
Run Code Online (Sandbox Code Playgroud)

ANSI DCS(设备控制字符串)是一个转义码,用于直接发送到终端(我认为这是它多年前的最初目的)。这样的字符串以 ST 转义码(字符串终止符)终止。

包装字符串以在 DCS..ST 块内设置终端的窗口标题,它会通过屏幕并正确更新,即使在 hardstatus alwayslastline 的情况下也是如此。

DCS = \033P,ST = \033\

示例 - 要使用当前工作目录更新窗口标题,请使用

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"
Run Code Online (Sandbox Code Playgroud)

迟到总比不到好!希望这可以帮助某人。

以防万一我对屏幕源更改有误:我正在运行来自 screen-session git 的最新版本,而后者几乎使用了来自 screen-session 的最新版本(有一些特定于 screen-session 的更改)。但是日志消息的日期是 2005 年的屏幕(如果您克隆屏幕 git repo 并使用下面的命令,您可以看到对该提交所做的关于 DCS 处理的更改)。

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c
Run Code Online (Sandbox Code Playgroud)


crb*_*crb 4

屏幕内的转义码不同

屏幕外的这个:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
Run Code Online (Sandbox Code Playgroud)

相当于这个内部屏幕:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'
Run Code Online (Sandbox Code Playgroud)

将您的案例 ${TERM}="screen" 标题栏更改为

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'
Run Code Online (Sandbox Code Playgroud)

会解决你的问题。