终端在太长时间覆盖相同的线路

时间:2014-04-07 20:13:26

标签: bash unicode terminal

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

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

以下是使用bash -x

生成的
PS1='\[\033[01;32m\]\w \[\033[1;36m\]☔︎ \[\033[00m\] '

是的,这实际上是雨伞;我使用script I wrote对天气进行了Bash提示更新。

编辑: 我的BashWeather脚本实际上可以放置几个天气字符中的任何一个,所以如果我们可以解决所有这些问题,或者想出一些其他解决方案,那将是很好的:

☂☃☽☀︎☔︎

如果下雨的雨伞特别成问题,我可以毫无问题地将其更改为普通雨伞。

2 个答案:

答案 0 :(得分:4)

正在打印的符号☔︎由两个Unicode代码点组成:U + 2614(UMBRELLA WITH RAIN DROPS)和U + FE0E(VARIATION SELECTOR-15)。其中第二个是零长度限定符,用于在前面的符号上强制执行“文本样式”,而不是“emoji样式”。如果您使用字体查看此字体可以区分这两种样式,则以下可能是表情符号版本:☔︉否则,您可以在Working Group document N4182中看到一个文本和表情符号变体表(伞位于顶部附近)第3页)。

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

将隔离的变体选择器直接粘贴到文件中有点尴尬,所以我建议使用bash的unicode-escape功能:

WEATHERCHAR=$'\u2614\[\ufe0e\]'
#...
PS1=...${WEATHERCHAR}...

请注意,\[\]在参数扩展之前被解释,因此上面定义的WEATHERCHAR无法动态插入到提示中。另一种方法是使动态插入的字符只是$'\u2614'伞(或其他),并在提示模板中插入$'\[\ufe0e\]'以及终端颜色代码等。

当然,根本不需要变量指标。它在我的Ubuntu系统上确实没有任何有用的区别,我使用的终端字体(Deja Vu Sans Mono)使用围绕伞的盒子呈现两种变体,这简直让人分心,而我的浏览器中使用的字体似乎渲染了伞同样有和没有变体。但是YMMV。

答案 1 :(得分:1)

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

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 '