Bash 终端太长时覆盖同一行

Bash 终端太长时覆盖同一行,bash,unicode,terminal,Bash,Unicode,Terminal,在我的终端中,当我在一行末尾打字而不是开始一行时,我的新字符会覆盖同一行的开头 在这个话题上,我见过很多问题,但没有一个对我有帮助。大多数与不正确的括号颜色有关,但据我所知,我的PS1看起来不错 下面是使用bash-x生成的: PS1='\[\033[01;32m\]\w \[\033[1;36m\]☔︎ \[\033[00m\] ' 是的,那实际上是一把雨伞;我有我的Bash提示更新与天气使用了 编辑: 我的BashWeather脚本实际上可以放置几个天气角色中的任何一个,因此,如果我们能够

在我的终端中,当我在一行末尾打字而不是开始一行时,我的新字符会覆盖同一行的开头

在这个话题上,我见过很多问题,但没有一个对我有帮助。大多数与不正确的括号颜色有关,但据我所知,我的
PS1
看起来不错

下面是使用bash-x生成的:

PS1='\[\033[01;32m\]\w \[\033[1;36m\]☔︎ \[\033[00m\] '
是的,那实际上是一把雨伞;我有我的Bash提示更新与天气使用了

编辑: 我的BashWeather脚本实际上可以放置几个天气角色中的任何一个,因此,如果我们能够解决所有这些问题,或者想出其他解决方案,那将是一件非常棒的事情:

☂☃☽☀︎☔︎
如果带雨的雨伞特别有问题,我可以把它换成普通雨伞而不出问题。

这几乎对我有效,因此可能不应该被认为是一个完整的解决方案。这是一个精简的提示,只包含一把伞和一个空格:

PS1='\342\230\[\224\357\270\] '
我使用八进制转义符对伞形字符进行UTF-8编码,将最后三个字节放入
\[…\]
中,这样
bash
就不会认为它们占用屏幕空间。我最初将最后四个字节放入,但至少在我的终端中,有一个显示错误,伞后面跟着一个额外的字符(缺少字符的菱形问号图示符),因此伞确实占用了两个空格

这可能是
bash
和5字节UTF-8序列的问题;使用具有4字节UTF编码的字符不会带来任何问题:

# U+10400 DESERET CAPITAL LETTER LONG I
# (looks like a lowercase delta)
PS1='\360\220\220\200 '
这几乎适用于我,因此可能不应被视为一个完整的解决方案。这是一个精简的提示,只包含一把伞和一个空格:

PS1='\342\230\[\224\357\270\] '
我使用八进制转义符对伞形字符进行UTF-8编码,将最后三个字节放入
\[…\]
中,这样
bash
就不会认为它们占用屏幕空间。我最初将最后四个字节放入,但至少在我的终端中,有一个显示错误,伞后面跟着一个额外的字符(缺少字符的菱形问号图示符),因此伞确实占用了两个空格

这可能是
bash
和5字节UTF-8序列的问题;使用具有4字节UTF编码的字符不会带来任何问题:

# U+10400 DESERET CAPITAL LETTER LONG I
# (looks like a lowercase delta)
PS1='\360\220\220\200 '

正在打印的符号☔︎ 由两个Unicode代码点组成:U+2614(带雨滴的雨伞)和U+FE0E(变体选择器-15)。第二个是零长度限定符,用于在前面的符号上强制使用“文本样式”,而不是“样式”。如果您使用的字体可以区分这两种样式,则以下可能是表情符号版本:☔︉ 否则,您可以在中看到包含文本和表情符号变体的表格(伞位于第3页顶部附近)

理论上,U+FE0E应该被识别为零长度码点,就像任何其他组合字符一样。但是,在
PS1
中用“非打印”转义序列
\[…\]
包围变量选择器不会有任何影响

将独立的变量选择器直接粘贴到文件中有点尴尬,因此我建议使用bash的unicode转义功能:

WEATHERCHAR=$'\u2614\[\ufe0e\]'
#...
PS1=...${WEATHERCHAR}...
请注意,
\[
\]
是在参数扩展之前解释的,因此上文定义的
WEATHERCHAR
不能动态插入到提示符中。另一种方法是使动态插入的字符仅为
$'\u2614'
伞形(或任何形式),并在提示模板中插入
$'\[\ufe0e\]'
,以及终端颜色代码等


当然,完全可能根本不需要变量指示器。这在我的Ubuntu系统上肯定没有什么用处,我使用的终端字体(Deja Vu Sans Mono)在伞周围用一个方框呈现两种变体,这很容易分散注意力,而我的浏览器中使用的字体似乎在呈现伞时完全相同,有变体和没有变体。但是YMMV

正在打印的符号☔︎ 由两个Unicode代码点组成:U+2614(带雨滴的雨伞)和U+FE0E(变体选择器-15)。第二个是零长度限定符,用于在前面的符号上强制使用“文本样式”,而不是“样式”。如果您使用的字体可以区分这两种样式,则以下可能是表情符号版本:☔︉ 否则,您可以在中看到包含文本和表情符号变体的表格(伞位于第3页顶部附近)

理论上,U+FE0E应该被识别为零长度码点,就像任何其他组合字符一样。但是,在
PS1
中用“非打印”转义序列
\[…\]
包围变量选择器不会有任何影响

将独立的变量选择器直接粘贴到文件中有点尴尬,因此我建议使用bash的unicode转义功能:

WEATHERCHAR=$'\u2614\[\ufe0e\]'
#...
PS1=...${WEATHERCHAR}...
请注意,
\[
\]
是在参数扩展之前解释的,因此上文定义的
WEATHERCHAR
不能动态插入到提示符中。另一种方法是使动态插入的字符仅为
$'\u2614'
伞形(或任何形式),并在提示模板中插入
$'\[\ufe0e\]'
,以及终端颜色代码等


当然,完全可能根本不需要变量指示器。这在我的Ubuntu系统上肯定没有什么用处,我使用的终端字体(Deja Vu Sans Mono)在伞周围用一个方框呈现两种变体,这很容易分散注意力,而我的浏览器中使用的字体似乎在呈现伞时完全相同,有变体和没有变体。但是YMMV

这可能是您的区域设置的一个问题,
bash
对提示的长度感到困惑:伞