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

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

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

函数 bash_prompt_command() {
    # $PWD 应保留多少个字符
    本地密码最大长度=25
    # 表示目录被截断
    本地 trunc_symbol=".."
    本地目录=${PWD##*/}
    密码最大长度=$(( ( 密码最大长度 < ${#dir} ) ? ${#dir} : 密码最大长度 ))
    NEW_PWD=${PWD/#$HOME/\~}
    本地密码偏移=$((${#NEW_PWD} - 密码最大长度))
    如果 [ ${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”)
        TITLEBAR='\[\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"
        ;;
    “屏幕”)
        TITLEBAR='\[\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"
    ;;
埃萨克

这是我的.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'

启用 altscreen
shelltitle'$|bash'

我做错了什么?

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

答案1

屏幕内的转义代码不同

屏幕外面是这样的:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

相当于这个内部屏幕:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

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

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

将解决你的问题。

答案2

实际上,有一种方法可以通过 screen 直接将转义序列发送到 xterm。这种方法很难找到,但从 ​​screen 代码 (src/ansi.c) 来看,我认为它从 2005 年就存在了。我在 xterm、Gnome Terminal 和 putty 中都用过它。我在 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.

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

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

DCS = \033P, ST = \033\

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

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

迟做总比不做好!希望这对某些人有帮助。

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

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c

答案3

crb 有点道理,但是

a) 他使用的转义码对我不起作用。应该是\033k而不是\033_。请screen (1)参阅"TITLES (naming windows)"。因此应该是:

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

b) 这种转义仅用于设置 screen 窗口的标题。一个 screen 实例可以有多个窗口,每个窗口都有一个名称,即在转义序列中显示的hardstatus内容。captiont

c) 如果您在以下位置为 xterm 设置了正确的 terminfo,则正常的 bash 转义可以工作.screenrc

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(这也works on my machine适用于腻子)

因此,为了为屏幕窗口和 putty/xterm 标题设置正确的标题,我使用类似以下的方法:

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

以供参考: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

答案4

过去两周我搜索了许多论坛,但没有找到以下问题的答案:

如何将所有命令输出到Putty标题?

需要它让其他程序知道服务器上的某些作业何时完成以及是否正确完成。Plink stdout 和 stdin 无法正常工作,我对等待延迟进行了许多调整,并且某些命令对其他命令无效。无法在该服务器上安装 XSEL 和 XCLIP。

解决方案如下:

  1. 在文件中获取命令输出。
  2. 将该文件回显到标题。

在 putty 客户端和 suse 服务器上它看起来像这样:

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

希望有人能用这个。当然,它不适用于所有服务器类型和 putty 客户端设置,但这个想法应该可以很好地发挥作用。

相关内容