oh-my-zsh 特殊字符无法显示 tab补全字符重复

本文介绍了在使用oh-my-zsh时遇到的主题问题,如特殊字符显示不出来和tab补全命令出现重复字符。解决方案包括安装fonts-powerline字体,设置正确的LC_CTYPE或LANG环境变量,以及检查和调整主题文件中转义字符的使用。对于转义字符问题,通过修改agnoster.zsh-theme文件解决了闪电符号显示异常的问题。建议遇到类似问题的用户自行调试主题或创建自定义提示符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

oh-my-zsh是一个用了就会停不下来的东西,但有些主题会导致出现问题。如果你的主题恰好出现了这些问题,本文或许可以帮助到你。

  • 特殊字符显示不出
  • tab补全命令导致出现重复字符

特殊字符无法显示

  1. 比如常用的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
  1. 安装完毕后可测试你的终端是否支持该字体:

characters

​ PS:某些终端如iTerm2需要在设置中选择字体

tab补全命令出现重复字符

有些主题会出现如下情况,当我输入cd命令后,按下tab自动补全,结果多出了一个c,而且怎么也无法删除。

image-20210306134738716

也有些人会多出两个字符,比如下面这个外国网友。

image-20210306135111762

zsh需要知道命令行的宽度,才能知道哪些命令的字符被替换。它假设每个字符占据一个字符位置,除非另有说明。所以造成这个“tab补全命令出现重复字符”的主要原因是zsh错误计算了命令行的宽度。有如下几种可能性会造成这个情况:

  1. shell和terminal的编码不一致,导致它们对相同字符的宽度识别不一致
  2. 转义字符导致的宽度不一致。
编码不一:

在 ~/.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。有些人是通过这种方式解决的。

image-20210306152330111

转义字符:

转义字符是指改变了文本的格式(如颜色)或窗口标题等等效果的字符,它们的宽度为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:百度真的不靠谱,找不到合适的回答,要换搜索引擎,你懂得,或者直接去国外平台查。

参考

[1] agnoster-zsh-theme 主页

[2] powerline-fonts 主页

[3] oh-my-zsh 主页

[4] Stack Exchange 相关回答

[5] stack overflow 相关回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值