oh-my-zsh 特殊字符无法显示 tab补全字符重复
前言
oh-my-zsh是一个用了就会停不下来的东西,但有些主题会导致出现问题。如果你的主题恰好出现了这些问题,本文或许可以帮助到你。
- 特殊字符无法显示
- tab补全命令导致出现重复字符。
特殊字符无法显示
- 比如常用的zsh主题 agnoster.zsh-theme,特殊字符需要安装 fonts-powerline 字体的:
# Debian or Ubuntu
sudo apt-get install fonts-powerline
# Fedora or redhat
sudo dnf install powerline-fonts
# MacOS
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh
cd ..
rm -rf fonts
- 安装完毕后可测试你的终端是否支持该字体:
PS:某些终端如iTerm2需要在设置中选择字体
tab补全命令出现重复字符
有些主题会出现如下情况,当我输入cd命令后,按下tab自动补全,结果多出了一个c,而且怎么也无法删除。
也有些人会多出两个字符,比如下面这个外国网友。
zsh需要知道命令行的宽度,才能知道哪些命令的字符被替换。它假设每个字符占据一个字符位置,除非另有说明。所以造成这个“tab补全命令出现重复字符”的主要原因是zsh错误计算了命令行的宽度。有如下几种可能性会造成这个情况:
- shell和terminal的编码不一致,导致它们对相同字符的宽度识别不一致
- 转义字符导致的宽度不一致。
编码不一:
在 ~/.zshrc 中添加
export LC_CTYPE=en_US.UTF-8
# 或者
export LANG_ALL=en_US.UTF-8
# 或者
export LANG=en_US.UTF-8
别忘了执行:
source ~/.zshrc
如果不能解决问题的话,如下图所示,输入locale -a,查看目前打开了哪些,utf8的都设置一下看看,比如把 export LC_CTYPE=en_US.UTF-8 换成 export LC_CTYPE=C.UTF-8。有些人是通过这种方式解决的。
转义字符:
转义字符是指改变了文本的格式(如颜色)或窗口标题等等效果的字符,它们的宽度为0。他们需要被包在大括号中:%{…%}
。
# 这是 agnoster.zsh-theme 文件中的部分代码
#………………
# Characters
SEGMENT_SEPARATOR="\ue0b0"
PLUSMINUS="\u00b1"
BRANCH="\ue0a0"
DETACHED="\u27a6"
CROSS="\u2718"
LIGHTNING="\u26a1"
GEAR="\u2699"
#………………
# Status:
# - was there an error
# - am I root
# - are there background jobs?
prompt_status() {
local symbols
symbols=()
[[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}$CROSS"
# [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}$LIGHTNING"
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}%{%G$LIGHTNING%}"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$GEAR"
[[ -n "$symbols" ]] && prompt_segment $PRIMARY_FG default " $symbols "
}
可以看到 [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}$LIGHTNING"
表示如果root用户登录,命令行提示符会追加黄色闪电字符
根据我自己的问题情况,修改为了 [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}%{%G$LIGHTNING%}"
,目前来说得到了解决。
如果你所选用的主题出现问题,需要自己手动调试主题文件,或者干脆完全打造自己的命令行提示符。
PS:百度真的不靠谱,找不到合适的回答,要换搜索引擎,你懂得,或者直接去国外平台查。
参考
[3] oh-my-zsh 主页