使用ZSH进行tab自动补全时,残留字符是什么?

45
我在 Arch Linux 中使用 oh-my-zsh,加载了 robbyrussell 主题。当我尝试使用 tab 键自动补全时,会有残留字符附加到提示符上。如果我删除了自动完成的字符,那么这些残留字符不会被删除。
例如,如果我输入:
~ /etc

然后按Tab键,它就会转变为

~ /e/etc/

下面列出了一些选项。即使我删除了 /etc//e 仍然存在,我就卡住了:

~ /e

我无法删除/e。我必须执行一个命令来消除残留字符。

你对这里发生的事情有任何想法吗?


在没有更多信息的情况下,你的提示可能缺少一个或两个字符。例如,请阅读这个问题。你正在使用最新版本的oh-my-zsh吗?你是否修改过提示?我可以从GitHub下载oh-my-zsh来测试,并获得您设置的准确表示吗? :) - simont
6个回答

87

看起来我在地区配置和非UTF8配置方面遇到了问题。

在我的情况下,解决方法是:

export LC_ALL="en_US.UTF-8"

并将其永久添加到 .zshrc 文件中:

echo "export LC_ALL=en_US.UTF-8" >> .zshrc

Ubuntu文档中有更多信息 https://help.ubuntu.com/community/Locale


1
在默认的.zshrc文件中取消以下行的注释似乎对我也有用: export LANG=en_US.UTF-8 - skube
在Manjaro中,我需要更改文件/etc/locale.conf/etc/locale.gen以添加en_US.UTF-8配置并运行locale-gen。这样可以解决我的问题:https://wiki.archlinux.org/index.php/Locale_(Espa%C3%B1ol) - Victor
对于那些像我一样使用 Starship 的 iOS 用户,使用选项卡自动完成时,我也遇到了字符重复的问题。将这个代码添加到我的 zshrc 中就解决了。 - b0nes

32

正如simont所建议的那样,您正在使用的提示符可能使用了不可打印字符(例如颜色转义代码),但没有指示这些字符是不可打印的。因此,在重新绘制提示符时,终端会认为提示符比实际宽度要宽。

您可以使用%{%}分隔符来指示zsh提示符中的字符序列具有零宽度。例如,我的提示符是:

%{%(?.%F{green}.%F{red})%}➜%{%f%}

(?...)是一个三元运算符,用于设置提示符的颜色,并且已经标记为零宽度。同样地,%f重置颜色并且也被标记了起来。

你可以通过更新PS1变量来测试对提示符所做的更改,这样你就可以尝试不同的排列方式,看看哪种方式适合你。

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


2
这就是真正解决问题的答案。我查看了我的自定义zsh主题,并找到了这个确切的问题($fg[red]而不是%{$fg[red]%})。我添加了定界符,现在它按预期工作。谢谢Matthew! - michalvalasek
救命稻草!(查看下面的答案,看看你如何轻松应用这个技巧) - user3196006

9

我遇到了同样的问题,于是在寻求解决方案的过程中发现了这篇文章: https://wiki.archlinux.org/index.php/Locale

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

en_US.UTF-8 UTF-8

在保存文件更改后,在命令行上执行以下命令(作为root用户):

locale-gen

重新启动,它就能正常工作了!(至少对我来说是这样的)

原来是一个本地化问题。运行 locale-gen 没有起作用,直到我删除了某个配置文件并重新运行它。不过,你的建议对于提示很有帮助。谢谢。 - undefined
你可以更具体地说明解决方案,其他用户(包括我)可能对你是如何解决问题感到困惑。 - undefined
我希望我能更具体一些,但我最初是在/etc/locale.gen中从UTF8改为Latin,当我想要改回UTF8时开始出现问题。我删除了很多文件,而且找不到告诉我哪个文件解决了问题的文章。最后,问题出在/etc/locale.gen的设置上,以及以root身份运行locale-gen。我在同一台设备上安装了新的Arch系统,自那以后就再也没有遇到这个问题了。 - undefined

1

我遇到了类似的问题,不过是和promptline有关,解决方法是从我的配置中删除以下内容:

ZLE_PROMPT_INDENT=0

1
我曾经遇到过类似的问题,使用主题 tjkirch_mod。每当我在一个脏的 git repo 中工作并使用 tab 键补全时,行的第一个字符会重复。 更改指示 git repo 状态的字符可以解决我的问题。 将

ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}⚡"

更改为

ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}x"


我在我的Mac(Monterey)的.zshrc文件末尾添加了export ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}!"(在末尾很重要)。问题只出现在我的IDE IntelliJ IDEA Ultimate中,而不是在iTerm2中。我个人更喜欢“!”而不是“x”。我还必须设置:“export LANG=en_US.UTF-8”,如https://dev59.com/XWIk5IYBdhLWcg3wadcD#20969082所述。 - flohall

-2
原来是本地化问题。在删除某个配置文件后重新运行locale-gen才起作用。
不过,您的建议对于提示非常有帮助。谢谢。

2
你可以更具体地说明解决方案,其他像我这样的用户可能会有困难理解你是如何解决问题的。 - Paulo Oliveira
3
我希望我能更具体一些,但我最初将/etc/locale.gen中的字符集从UTF8改为Latin,当我想要改回UTF8时遇到了问题。我删除了很多文件,现在找不到那篇文章告诉我哪个文件解决了我的问题。最后,问题的关键在于确保/etc/locale.gen正确,并以root身份运行locale-gen。我在同一台电脑上安装了新的Arch系统,之后没有再次遇到这个问题。 - Concordus Applications

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接