zsh配置
配置zsh作为日常使用的终端shell
linux
linux下配置zsh比较简单, 基本上都能用包管理器和git进行安装
install zsh
直接使用命令行就能安装zsh
ubuntu:
sudo apt install zsharch
# 使用pacman sudo pacman -S zsh # 使用yay或者paru yay/paru -S zsh
配置zsh为当前用户默认shell
查看当前shell:
设置zsh为当前用户默认shell:
安装oh-my-zsh
oh-my-zsh官网提供两种方式进行简单安装
或者使用github镜像
安装时会选择使用omz的.zshrc
替换原有的, 同时原来的.zshrc
会进行备份变成.zshrc.pre-oh-my-zsh
zsh plugins
个人一般只用zsh-syntax-highlighting
和zsh-autosuggestions
, 其他的就不做考虑
使用git将插件clone到本地omz插件目录
或者使用github镜像
在.zshrc
中启用插件, 找到这一行
添加插件
重新source一下就行
配置powerlevel10k
本来之前用的是omz不加主题, 搭配starship, 但是有点繁琐了, 所以就直接拿powerlevel10k
来用了
同样使用git把主题clone到本地omz目录
或者使用github镜像
完成之后修改.zshrc
重新source一下.zshrc
就能看到p10k的引导界面, 根据引导进行设置即可
windows
window之前用的pwsh加starship, 也还行, 但是偶然想着能不能统一用zsh
配置过程比linux要繁琐一点
安装git
安装git没什么好说, 可以直接上官网下载
这里推荐找个国内镜像比如清华源, 在主页右边常用软件包安装程序中可以找到
唯一需要注意的是在安装时需要选择向window terminal添加git-bash的profile
安装完成后把git-bash设置成默认shell的过程不多赘述
安装zsh
git-bash为windows提供了一个bash环境, zsh需要额外安装
zsh可以直接在msys2找到包

下载名为zsh-$version$-x86_64.pkg.tar.zst
的包, 版本截至文章编写时为5.9-4
两次解压后得到文件夹, 目录结构如下
将整个文件夹覆盖到git安装目录, 再次打开git-bash即可调用zsh
由于git-bash下没有chsh命令, 所以只能通过修改.zshrc来让每次启动时自动切换到zsh
在.bashrc
中加入如下内容(文件的末尾)
install oh-my-zsh
omz在git-bash的环境下安装方式相同, 参照上面linux的安装方法即可
解决conda和mamba的hook问题
在windows上使用bash或zsh这类shell时, 不可避免会遇到换行符的问题
如果按照上面的内容安装完了zsh之后使用conda和mamba进行init, 会出现^M
也就是回车导致zsh解析失败, powerlevel10k的instant prompt功能失效
问题定位
在使用conda和mamba进行zsh的init后, .zshrc中会添加两端hook, 启用conda和mamba的对应功能
每次打开zsh会报错
omz检测到了在zsh初始化时的输出, 在报错信息后紧接着两行
也就是脚本中包含了windows的回车, conda和mamba的init过程失败, 导致zsh无法解析从而产生输出, 影响了powerlevel10k的instant prompt功能
回看.zshrc, 其中确实包含了两行eval
具体内容时conda和mamba各自调用了自己的hook, 生成
了自己的临时hook脚本, 交由eval
来执行
但由于conda和mamba属于windows程序, 生成hook脚本过程中添加的换行符全部都为windows换行
eval在执行hook脚本时无法解析其中的回车符(^M)从而发生了错误
上面的内容可以通过下面的方法来验证
回显中会包含大量^M
临时解决方案是在对应的命令结尾加上管道符将生成的hook脚本交由dos2unix
来处理
使用dos2unix替换原来的windows换行为unix换行, 再交由eval来执行
但是, 替换后仍然发生报错
发现竟然还有^M
?
于是对生成的hook脚本进行检查, 发现在conda的hook脚本中包含一个eval
也就是说在hook脚本中又生成了一条临时命令交由eval来执行, 毫无疑问这里生成的内容包含^M
于是对conda的hook命令再做修改, 使用正则将hook脚本中对应的内容进行修改, 也就是加上dos2unix
原以为万事大吉, 结果依旧报错, 这回是python
python在执行hook时无法解析'uf253\'(默认使用gbk)
所以这里直接在.zshrc环境变量添加一条
问题解决
最终方案
将conda和mamba的hook命令进行替换
并添加一条环境变量(在.zshrc的对应位置, conda和mamba的hook执行之前)