使用ZSH填充选项卡时的残余字符

Con*_*ons 33 zsh oh-my-zsh

我在Arch linux中使用oh-my-zsh并加载了robbyrussell主题.当我尝试选项卡完成时,我最终会在提示符后附加补充字符.如果删除自动完成的字符,则不会删除剩余字符.

例如,如果我输入:

~ /etc
Run Code Online (Sandbox Code Playgroud)

然后选项卡,它转向

~ /e/etc/
Run Code Online (Sandbox Code Playgroud)

以下是一系列选项.即使我删除/etc//e遗体,我仍然坚持:

~ /e
Run Code Online (Sandbox Code Playgroud)

我无法删除/e.我必须执行一个命令来摆脱残余角色.

知道这里发生了什么吗?

cor*_*cho 63

我似乎遇到了语言环境配置和非UTF8配置的问题

在我的情况下,修复是:

export LC_ALL="en_US.UTF-8"
Run Code Online (Sandbox Code Playgroud)

并保持永久添加到.zshrc的行:

echo "export LC_ALL=en_US.UTF-8" >> .zshrc
Run Code Online (Sandbox Code Playgroud)

更多信息在Ubuntu doc https://help.ubuntu.com/community/Locale

  • 这应该是公认的答案。不幸的是,投票否定的答案被接受。 (3认同)

Mat*_*len 25

正如simont所建议的那样,您使用的提示可能是使用不可打印的字符(如颜色转义码),但并不表示这些字符是不可打印的.因此,当重新提示提示时,终端认为提示比实际更宽.

您使用%{%}分隔符指示zsh提示符中的字符序列的宽度为零.例如我的提示是:

%{%(?.%F{green}.%F{red})%}?%{%f%}
Run Code Online (Sandbox Code Playgroud)

(?...)是一个三元组,用于设置提示的颜色,并且已标记为表示宽度为零.以同样的方式%f重置颜色并且也已经标记了颜色.

您可以通过更新PS1变量来测试对提示的更改,这样您就可以尝试不同的安排,看看哪些适合您.

你可以用这种方式标记任何字符,所以要小心你的提示太短!

  • 这才是真正解决问题的答案。我查看了我定制的 zsh 主题并发现了这个确切的问题(`$fg[red]` 而不是 `%{$fg[red]%}`)。我添加了分隔符,现在它按预期工作。谢谢马修! (2认同)

Pau*_*ira 6

我有同样的问题,所以在我寻求解决方案时我遇到了这篇文章:https: //wiki.archlinux.org/index.php/Locale

并且,正如所建议的那样,要在系统范围内启用某些语言环境,您只需要取消注释所需的语言环境/etc/locale.gen,例如,在我的情况下:

en_US.UTF-8 UTF-8
Run Code Online (Sandbox Code Playgroud)

保存对文件的更改后,在命令行上执行(以root身份):

locale-gen
Run Code Online (Sandbox Code Playgroud)

重启,它的工作原理!(至少对于我来说)