Bash PS1自定义提示中的长行重叠


13

我已经配置了一个花哨的两行PS1bash提示符,其中包含服务器名称,时间,用户名和其他有用的变量。

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

在此处输入图片说明

完整的Github源码在这里

问题在于,长行经常缠绕在自己周围,这意味着新行与前一行重叠。

问题是不一致的:有些行正确包装,有些行没有正确包装。

任何想法如何解决这个问题?

Answers:


16

这是我喜欢的两行bash提示PS1。

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

这就是我所做的。如果这是我的颜色:

\e[1;32m

我将其更改为:

\[\e[1;32m\]

本质上,您需要将其包含在以下内容中:

\[$mycolor\]

查看此答案


+1谢谢。奇怪的是,它似乎在Mac上不起作用。
亚当·马坦

您是救生员!至于mac,Adam。这很可能是由于列数所致。尝试将提示设置为仅一个字符串,例如“这是我的提示:”,然后查看问题是否仍然存在。如果是这样,则终端上的列设置太宽或太窄。
亚历克斯·萨默斯

7

在线找到了该解决方案,建议对颜色变量使用方括号:

更改此:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

至:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

我已做出更改 -希望它能按预期工作。


1
不知道这应该实现什么。您需要包装任何不占用空间(ansi-escapes)的东西\[ \],所以不能只用ansi-escape颜色结尾,\]因为如果没有,该怎么办\[。当您放入不可打印的字符时,应将它们包裹起来\[ \](例如PS1='\[\e[32;1m\] green prompt \[\e[0m\] $')。
dylnmc

确实!没有打开\ [,这会给我们Linux用户带来提示。OSX可能有所不同吗?多么奇怪。对于Linux,\ [和\ e [被解释为两种不同的事物。第一个指示bash表示后面的序列不可打印,并且不将其视为提示的显示字符的一部分。\ e [是用于启动ANSI配色方案的转义括号。
亚历克斯·萨默斯

0

对于bash PS1中的长行重叠问题,我的首选解决方案是\n在PS1提示行的末尾添加一个。

例如

在此处输入图片说明

如果您需要我所有其他东西-时间,用户,主机,目录和git branch(!),则可以使用此(mac或linux):

/unix//a/124012/10043


对于git branch您应该使用if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi。这是将git放入脚本并根据我之前阅读的内容评估分支名称时的标准。
dylnmc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.