zsh修改提示符,显示路径每一级的首字母,用户和前一命令返回值
zsh修改提示符,显示路径每一级的首字母,用户和前一命令返回值
前提:使用了 oh-my-zsh
,我的主题是默认主题 robbyrussell,我按照这个主题来讲解,使用其他主题请修改对应的 theme 文件。
显示路径每一级的首字母和最后一级目录的全名
默认主题只显示路径最后一级名字,其他的一些主题可能显示完整路径,但那太长了。我只发现主题 fishy 是这样显示的,这也和 fish 命令行相同。
修改方法:
vim ~/.oh-my-zsh/themes/robbyrussell.zsh-theme
添加一个函数
_fishy_collapsed_wd() {
local i pwd
pwd=("${(s:/:)PWD/#$HOME/~}")
if (( $#pwd > 1 )); then
for i in {1..$(($#pwd-1))}; do
if [[ "$pwd[$i]" = .* ]]; then
pwd[$i]="${${pwd[$i]}[1,2]}"
else
pwd[$i]="${${pwd[$i]}[1]}"
fi
done
fi
echo "${(j:/:)pwd}"
}
在 PROMPT 那一行,把表示目录的 %c
(其他主题可能是 %C
,%~
,%2
等)改成 $(_fishy_collapsed_wd)
,重启 zsh 即可。
显示用户
在 PROMPT 前适当加上 %{$fg_bold[blue]%}${USER}
即可。左边的是在设置颜色。
显示上一条命令返回值
这个默认主题,当返回值为 0 时箭头为绿色,非 0 时为红色,我想让他非 0 时显示返回值。
解决方案:PROMPT 适当位置加上 %?
,记得不要写成 $?
因为后者只显示第一个数字(好像是这样,我没仔细查过)。
我的 zsh 主题配置和效果
~/.oh-my-zsh/themes/robbyrussell.zsh-theme
if [ `id -u` -eq 0 ];then
PROMPT="%(?:%{$fg_bold[red]%}root %{$fg_bold[green]%}➜ :%{$fg_bold[red]%}root %{$fg_bold[red]%}%? ➜ )"
else
PROMPT="%(?:%{$fg_bold[blue]%}${USER} %{$fg_bold[green]%}➜ :%{$fg_bold[blue]%}${USER} %{$fg_bold[red]%}%? ➜ )"
fi
_fishy_collapsed_wd() {
local i pwd
pwd=("${(s:/:)PWD/#$HOME/~}")
if (( $#pwd > 1 )); then
for i in {1..$(($#pwd-1))}; do
if [[ "$pwd[$i]" = .* ]]; then
pwd[$i]="${${pwd[$i]}[1,2]}"
else
pwd[$i]="${${pwd[$i]}[1]}"
fi
done
fi
echo "${(j:/:)pwd}"
}
PROMPT+=' %{$fg[yellow]%}$(_fishy_collapsed_wd)%{$reset_color%} $(git_prompt_info)'
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[blue]%}git:(%{$fg[yellow]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"
效果:
root 用户显示为红色: