我正在使用自定义bash提示来显示git分支。
一切都在/etc/bash/bashrc
:
function formattedGitBranch {
_branch="$(git branch 2>/dev/null | sed -e "/^\s/d" -e "s/^\*\s//")"
# tried these:
echo -e "\e[0;91m ($_branch)"
echo -e "\e[0;91m ($_branch) \e[m"
echo -e $'\e[0;91m'"($_branch)"
echo "($_branch)"
echo "$(tput setaf 2) ($_branch) $(tput setaf 9)"
printf "\e[0;91m ($_branch)"
}
# color is set before function call
PS1='\[\033[01;34m\] \[\033[0;91m\]$(formattedGitBranch) \$\[\033[00m\] '
# color is set inside function
PS1='\[\033[01;34m\] $(formattedGitBranch) \$\[\033[00m\] '
问题是当我在函数中为$_branch
设置颜色时,到达EOL时我的提示将被覆盖:
尝试了所有可能的变体tput
,printf
,$''
表示法。
我通过仅在PS1
:
但是...
我正在使用Gentoo Linux。 GNU bash, verze 4.2.37(1)-release (i686-pc-linux-gnu)
答案 0 :(得分:44)
因为每个不可打印的字符都必须由\[
和\]
转义,否则readline无法正确跟踪光标位置。
您必须在提示符中的任何非打印转义序列周围添加
\[
和\]
没有\[ \]
bash会认为构成颜色代码转义序列的字节实际上会占用屏幕上的空间,因此bash将无法知道光标实际位于何处。
\[
开始一系列非打印字符。 (如颜色转义序列)。这个 允许bash正确计算自动换行。
\]
结束一系列非打印字符。 - BashFAQ...注意非打印字符的转义,这些确保读取线可以正确跟踪光标位置。 - ss64.com
function
时解决此问题如果您想在function
内设置颜色,PS
的输出用于PS1='\[ $(formattedGitBranch) \] '
,您有两种选择。
要么转义整个函数调用:
echo
\[
内的replace the non-printing Escape个序列。也就是说,替换:
\]
和\001
与\002
echo -e
(感谢user grawity!)
\[
\]
的 \001
is not aware所以你必须用\002
& function formattedGitBranch { echo -e "\001\e[0;91m\002 ($_branch)"; }
ASCII控制代码,用于将不可打印的字符与可打印的字符分隔开来:
PS1='$(formattedGitBranch) '
{{1}}
答案 1 :(得分:10)
像\e[0;91m
这样的字符串需要额外的引用,以防止bash计算其长度。
将这些字符串括在formattedGitBranch
中的\[
& \]
as,\[\e[0;91m\]
您已在其他地方正确完成。刚刚在formattedGitBranch中错过了它。
答案 2 :(得分:0)
你必须在[\和/]中处理不可打印的字符,否则你可能会把光标放在命令提示符的顶部,就像问题本身一样,所以我找到了一些东西而只是分享它: -
在PS1输出后获取光标在同一行:
几个例子:
PS1='[\u@\h:\w]\$
PS1='[\[\033[0;32m\]\u@\h:\[\033[36m\]\W\[\033[0m\]]\$ '
参考链接:syntax for bash PS1