【问题标题】:Bash completion on prompt is broken with current PS1 [closed]当前的 PS1 破坏了提示时的 Bash 完成 [关闭]
【发布时间】:2018-08-08 17:25:56
【问题描述】:

我认为我在PS1 中转义序列的方式有问题。事实上,我知道这就是问题所在。我的问题是我没有正确逃避什么?

declare __host='\[\e[30;102m\] \h \[\e[0m\]';
declare __dir='\[\e[1;97;44m\] \w \[\e[22m\]';
declare __arrow='\[\e[1m\]▸ \[\e[0m\]';

function __git_status() {
  local info;
  info=$(__git_info);

  [[ $? -eq 0 ]] && printf "\e[30;43m%s" "$info";
}

export PS1="$__host$__dir"'$(__git_status)'"$__arrow ";

诀窍是根据前面是__dir 还是__git_status 来为箭头着色。像这样:

【问题讨论】:

标签: bash prompt


【解决方案1】:

printf 中的转义码缺少 \[...\] 包装器。

顺便说一句,我还将排除与$?function 关键字的无用显式比较。

__git_status() {
  local info
  info=$(__git_info) &&
    printf '\\[\e[30;43m\\]%s' "$info"
}

还要注意格式字符串周围的单引号和双反斜杠的切换(有关详细信息,请参阅 cmets;感谢 Charles Duffy 的指导)。

Shell 脚本在语句之间需要任一分号或换行符,您不需要两者都需要。

【讨论】:

  • 我试过了。然后它最终在我的 PS1 中看起来像这样:imgur.com/ZLeVcjG.png
  • 链接似乎已损坏。但我猜printf 也会吃一层反斜杠;更新的答案。
  • 确实如此,但是您要确保反斜杠使其一直加倍到printf(理想情况下,不依赖于根本无法识别潜在转义序列的后备行为考虑到以下字符不是定义明确的序列的后半部分)。使用双引号会使水变得混乱——读者需要考虑两个扩展阶段以及它们如何相互作用,而在单引号中,反斜杠总是绝对字面意思。
  • 确实,谢谢;更新为单引号。
  • 我认为这也行不通:imgur.com/XuebaCX.png
【解决方案2】:

感谢您的要点。您的问题的答案似乎是 printf 不想知道非打印字符上的 \[ \] 转义。

__git_status() {
  local info
  info=$(__git_info) &&
    printf '\e[30;43m%s' "$info"
}

在您的 PS1 设置下非常适合我,并且在确定提示长度方面不会有问题。我唯一的问题是 CentOS 不知道如何在终端打印 =(

【讨论】:

  • 这不会产生预期的结果。我想保留上一个块的颜色以用于箭头部分。你所做的是在最后转义了序列,所以现在箭头不知道以前的颜色。
  • ...为什么不直接使用\[\e[1;97;44m\] 将箭头颜色设置为与目录颜色相同,而不是您当前的颜色?
  • __dir 有蓝色背景。 __git_status 有黄色背景。如果在 git repo 中,则箭头应具有黄色背景以匹配 __git_status(如 OP 中的屏幕截图)。但是,如果我不在 git repo 中,那么箭头的背景应该使用来自 __dir 的蓝色;
  • 哦......如果你只是拿出\e[m(我编辑了我的答案)它对我来说就像这样。
  • 好的,所以,使用它,然后打开你的 bash 提示符并在历史记录中查看以前的命令。事情对你来说很奇怪吗?就像,历史记录中的命令不能像这样正确显示?这发生在 git repo 中。
【解决方案3】:

解决办法是改变:

info=$(__git_info) && printf '\e[30;43m%s' "$info"

info=$(__git_info) && printf '\1\e[30;43m\2%s' "$info"

这是因为在执行我的 __git_status 函数之前,bash 在内部将提示的特殊字符 [ 和 ] 替换为 ASCII 1 和 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2012-12-14
    • 2023-01-08
    • 1970-01-01
    相关资源
    最近更新 更多