我正在使用自定义 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
:
But..
- 我想知道为什么它会覆盖我的提示
- 使用函数时如何解决这个问题
我正在使用 Gentoo Linux。GNU bash, verze 4.2.37(1)-release (i686-pc-linux-gnu)
1)我想知道为什么它会覆盖我的提示
因为每个不可打印的字符都必须通过转义\[
and \]
否则readline无法正确跟踪光标位置。
你必须把\[
and \]
提示中任何非打印转义序列周围。
如果没有\[ \]
bash 会认为构成颜色代码转义序列的字节实际上会占用屏幕上的空间,因此 bash 将无法知道光标实际在哪里。
\[
开始一系列非打印字符。 (如颜色转义序列)。这
允许 bash 正确计算自动换行。
\]
结束非打印字符序列。
--BashFAQ
...注意非打印字符的转义,这些确保 readline 可以正确跟踪光标位置。 --ss64.com
2)如何解决这个问题function
is used
如果你想在 a 中设置颜色function
其输出用于PS
你有两个选择。
-
要么转义整个函数调用:
PS1='\[ $(formattedGitBranch) \] '
-
Or 替换非打印Escape里面的序列echo
。即替换:
\[
and \]
with \001
\002
(谢谢用户引力!)
-
echo -e
不知道bash 的\[
\]
所以你必须用这些替换\001
& \002
用于分隔不可打印字符和可打印字符的 ASCII 控制代码:
function formattedGitBranch { echo -e "\001\e[0;91m\002 ($_branch)"; }
PS1='$(formattedGitBranch) '
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)