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

前言

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 相关回答

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
oh-my-zsh 是一个开源的、社区驱动的 zsh 配置管理框架,它提供了一系列的插件、主题和自定义选项,使得用户可以轻松地定制和管理自己的 zsh 终端环境。它旨在提供一个更强大、更易用的终端工具。 而 oh-my-zsh-git 是 oh-my-zsh 在 GitHub 上的一个 fork 版本,它基于原版的 oh-my-zsh,对其进行了一些修改和扩展。oh-my-zsh-git 主要的目的是为了扩展和增强原版 oh-my-zsh 的功能,并从社区中收集和整合更多的插件和主题。 具体来说,oh-my-zsh-git 与 oh-my-zsh 的区别主要体现在以下几个方面: 1. 功能扩展:oh-my-zsh-git 在原版 oh-my-zsh 的基础上增加了一些功能和工具,使得终端使用起来更加方便和高效。 2. 插件和主题:oh-my-zsh-git 提供了更多的插件和主题选项,且会持续更新和增加。用户可以根据自己的需求选择和使用不同的插件和主题。 3. 扩展性:oh-my-zsh-git 更加注重可扩展性,用户可以自定义添加新的插件和主题,或者根据自己的需要修改现有的插件和主题。 4. 社区支持:oh-my-zsh-git 的社区活跃度较高,用户能够得到更多的帮助和支持,同时也能够贡献自己的代码和改进。 综上所述,oh-my-zsh-git 是在 oh-my-zsh 基础上进行的一些改进和扩展,提供了更多的插件和主题选项,同时注重用户的自定义和扩展能力。用户可以根据自己的需求选择采用哪个版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值