在 Cygwin 上更改标题而不更改提示

在 Cygwin 上更改标题而不更改提示

我有以下 shell 脚本函数这个网站这允许我更改 Putty 和 Cygwin 中的标题。在连接到 Linux 主机的 Putty 中,它会更改标题并保持提示不变。但在 Cygwin 中,它更改了标题,然后提示符变成了纯粹的 $ 或 # 符号。

我想为 Cygwin 创建一个版本,更改标题但保留提示不变。 (我知道在在这里发布之前我应该​​尝试自己创建一个,但我总是发现提示字符串令人困惑。)

编辑: 更具体地说,在 Cygwin 中,我喜欢默认提示符user@hostname后跟当前目录。我想保留那个提示。

编辑二: 我并不关心默认 Cygwin 提示符的颜色是否被保留,如果这会让事情变得更容易的话。我至少想要提示中的目录。

这是我所拥有的:

function wtitle {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=`echo $PS1 | sed -r 's/^\\\\\[.+\\\\\]//g'`
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

`

答案1

请加

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$'

作为 ~/.bashrc 中的最后一行并再次登录或只是运行

source ~/.bashrc

答案2

我认为OP要求的是设置终端模拟器运行的窗口的标题。我对 PS1 的引用感到困惑,因为我只需运行这个就能实现这一点......

printf '\e]2;%s\a' "My Title"

至少这适用于 mintty 2.7 (+ Cygwin 2.8)。 (也许自从问题最初发布以来,情况已经发生了变化。)

答案3

如果登录到某个 SSH 服务器后标题根本没有更新,请尝试从 cygwin 安装 OpenSSH 软件包。

对我来说,cygwin 使用的是 OpenSSH 的某些 Windows 10 Pro 内部版本,该版本不会通过 SSH 堆栈将标题转义字符传回。

发布此内容可能是为了防止有人花一个小时在这上面

答案4

你有两个问题:

  1. 您应该始终引用 shell 变量,除非您有充分的理由不这样做,并且您确定您知道自己在做什么。echo $PS1应该如此echo "$PS1"。这会导致提示丢失末尾的空格;即,它变成$而不是。在某些情况下,它可能会导致其他问题。
  2. Bash 使用\[...\]来分隔转义序列;即,不作为提示的一部分出现在屏幕上的字符。这包括设置窗口标题的转义序列,还包括在(可见)提示内更改颜色的转义序列。你的脚本确实

    s/ ^ \\\\\[ .+ \\\\\] //g
    

    (为了清楚起见添加了空格)。乍一看,这似乎是试图删除全部 \[……\]序列。 (其实有它不这样做的原因。)主要问题是.+匹配最长的可能字符串任何人物。这意味着它会删除从第\[一个序列的开头\]到最后一个序列的结尾的所有内容\[-\]换句话说,直到最后一个颜色变化为止的所有内容。

    我们只想删除转义序列来设置窗口标题。我们通常会改变.+(其中.火柴任何字符)到除 之外的字符串]。但这是因为设置窗口标题的转义序列这一事实而变得复杂包含],所以我们需要通过 第二 ]:

    s/^\\\\\[[^]]+][^]]+\\\\\]//g
    

    我稍后会在上下文中展示这一点......

  3. 这不是问题本身,但是`……`是过时的语法。建议您使用$(...)代替。有些帖子似乎表明它们在功能上是可以互换的。他们不是;适用不同的引用/转义规则。幸运的是,在这种情况下这对我们有利。当我们切换到 $(...时),我们可以更改sed命令以使用更少的反斜杠。
  4. 另一个问题:function不鼓励使用关键字。请参阅下文了解首选语法。

因此,将以上所有内容放在一起,我们得到:

wtitle() {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=$(echo "$PS1" | sed -r 's/^\\\[[^]]+][^]]+\\\]//g')
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

可以说,即使这样也并不完美。它取决于PS1将窗口标题转义序列作为第一件事的现有值。

相关内容