1 概述
作为一个程序员,可以没钱,没车,没房,没老婆,没女朋友。
但是,一定要有一个漂亮骚气的终端。
没错,大骚特骚。
说什么大实话。
先来看看原生的终端:
真漂亮啊。
再看看美化过的:
这才叫终端嘛。
美化过的就是不一样。
如果您也想要这样的终端,那这篇文章要仔细看,同时顺手点个赞。
文章讲述了如何使用zsh+oh-my-zsh,配合主题Powerlevel9k/Powerlevel10k(以下简称p9k/p10k)进行终端美化的过程,不废话了,进入正题。
2 环境
笔者环境:
- Manjaro 20.0
- Xfce
- 自带的Xfce terminal
其他linux基本适用,安装zsh+oh-my-zsh即可,mac用户可以通过homebrew安装zsh+p9k/p10k,至于win用户,自行搜索吧。
3 准备工作
安装zsh+oh-my-zsh。
3.1 zsh
Manjaro/Arch:
sudo pacman -S zsh
Debian系:
sudo apt install zsh
RedHat系:
sudo yum install -y zsh
其他可以来到官方github安装,戳这里。
设为默认shell:
chsh -s $(which zsh)
再把原来的别名复制到
~/.zshrc
3.2 oh-my-zsh
通过脚本安装即可,使用curl或wget:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
#或
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
失败的话可以clone仓库安装,戳这里。
4 安装p9k
4.1 安装字体
推荐使用Nerd-Fonts字体,能显示最全的图标。Nerd-Fonts包含了大量的“图标字体”,如下图(来源官方github):
Manjaro/Arch用户:
sudo pacman -S ttf-nerd-fonts
其他用户可以戳这里clone下载安装。
p9k默认使用的是Powerline Font字体,Manjaro/Arch用户:
sudo pacman -S powerline-fonts
其他可以戳这里clone下来安装。
除此之外官方还建议使用Awesome-Powerline Fonts字体或一些程序员字体(如Source Code Pro等),但是图标可能会显示不全,建议还是使用Nerd-Fonts字体。
安装字体后,在设置p9k主题前,也就是在
~/.zshrc
设置
ZSH_THEME="powerlevel9k/powerlevel9k"
之前,设置模式:
POWERLEVEL9K_MODE='nerdfont-complete'
如果用的是Powerline-Fonts可以不用设置,如果用的是Awesome-fonts,设置:
POWERLEVEL9K_MODE='awesome-fontconfig'
#或
POWERLEVEL9K_MODE='awesome-patched'
4.2 安装p9k
Manjaro/Arch:
sudo pacman -S zsh-theme-powerlevel9k
echo 'source /usr/share/zsh-theme-powerlevel9k/powerlevel9k.zsh-theme' >> ~/.zshrc
其他:
git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
# 修改~/.zshrc
ZSH_THEME="powerlevel9k/powerlevel9k"
5 p9k配置
p9k配置的主要部分就是自定义提示段(Prompt Segments),包括开启/关闭,位置,颜色,图标等。
5.1 开启/关闭提示段
5.1.1 如何使用
具体请看5.2 位置。
5.1.2 开启/关闭整个提示段
关闭左边/右边整个提示段:
#左
POWERLEVEL9K_DISABLE_PROMPT=true
#右
POWERLEVEL9K_DISABLE_RPROMPT=true
5.1.3 系统相关
名字 | 作用 |
---|---|
background_jobs | 后台任务 |
battery | 电池状态 |
context | 用户名+主机名,基于USER环境变量以及SSH状态 |
date | 日期 |
dir | 当前工作目录 |
dir_writable | 目录可写状态,可写时为空,不可写时出现一个锁 |
disk_usage | 当前分区的磁盘使用百分比 |
history | 历史命令的记录数量 |
host | 主机名 |
ip | 内网ip |
vpn_ip | vpn ip |
public_ip | 公网ip |
load | 机器的平均负载 |
os_icon | 操作系统图标,支持的linux有Alpine,AOSC,Arch,CentOS,CoreOS,Debian,Devuan,Elementary,Fedora,Gentoo,Mageia,Manjaro,Mint,NixOS,OpenSUSE,Sabayon,Slackware,Ubuntu |
ram | 内存可用大小 |
root_indicator | 拥有root权限的提示符 |
status | 前一条命令的结果状态码 |
swap | 交换分区使用情况 |
time | 时间 |
user | 当前用户 |
vi_mode | vi模式 |
ssh | ssh状态 |
5.1.4 语言相关
名字 | 作用 |
---|---|
go_version | Go版本 |
node_version | Node.js安装的版本 |
nodeenv | 使用nodeenv显示Node版本 |
nvm | NVM显示Node版本 |
php_version | php版本 |
laravel_version | Laravel版本 |
symfony2_test2 | Symfony2测试类与代码类的比率 |
symfony2_version | Symfony2版本 |
virtualenv | Python VirtualEnv环境 |
anaconda | Anaconda环境 |
pyenv | pyenv version显示的第一个单词,但是如果是system将不会显示 |
chruby | 使用chruby的Ruby环境 |
rbenv | 使用rbenv的Ruby环境 |
rspec_stats | RSpec中测试类与代码类的比率 |
rvm | 使用GEM_HOME环境变量或者MY_RUBY_HOME环境变量显示的Ruby信息 |
rust_version | Rust版本 |
swift_version | Swift版本 |
java_version | Java版本 |
openfoam | OpenFOAM库版本 |
5.1.5 云相关
名字 | 作用 |
---|---|
aws | 当前的AWS配置 |
aws_eb_env | 当前的Elastic Beanstalk环境 |
docker_machine | 当前的Docker Machine |
docker_machine | kubectl配置 |
dropbox | Dropbox目录以及使用dropbox-cli的同步状态 |
5.1.6 其他
名字 | 作用 |
---|---|
vcs | git/hg仓库的信息 |
command_execution_time | 命令执行时间 |
todo | todo.txt文件中任务数量 |
detect_virt | 使用systemd进行虚拟化检测 |
newline | 另起一行 |
custom_command | 自定义命令,需要以custom_开头 |
比如,利用
nmcli device wifi
显示wifi速率,首先添加一个函数:
wifi_rate(){
local rate=$(nmcli device wifi | grep -E "\*" | awk '{print $6}') #awk后面的数字可能每个人不同
echo "\uf0e7 $rate Mbit/s"
}
其次添加自定义提示段(以custom开头):
POWERLEVEL9K_CUSTOM_WIFI_RATE="wifi_rate"
最后在
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
#或
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS
加上即可,演示效果:
需要的话,可以根据信号状态定义不同的颜色:
完整配置文件如下,加上了wifi名字:
set_wifi(){
wifi_signal=$(nmcli device wifi | grep -E "\*" | awk '{print $8}')
POWERLEVEL9K_CUSTOM_WIFI_NAME_FOREGROUND="black"
POWERLEVEL9K_CUSTOM_WIFI_RATE_FOREGROUND="black"
POWERLEVEL9K_CUSTOM_WIFI_BARS_AND_SIGNAL_FOREGROUND="black"
POWERLEVEL9K_CUSTOM_WIFI_NAME_BACKGROUND="green"
POWERLEVEL9K_CUSTOM_WIFI_RATE_BACKGROUND="green"
POWERLEVEL9K_CUSTOM_WIFI_BARS_AND_SIGNAL_BACKGROUND="green"
if [[ $wifi_signal -lt 50 ]] ; then
POWERLEVEL9K_CUSTOM_WIFI_NAME_BACKGROUND="red"
POWERLEVEL9K_CUSTOM_WIFI_RATE_BACKGROUND="red"
POWERLEVEL9K_CUSTOM_WIFI_BARS_AND_SIGNAL_BACKGROUND="red"
elif [[ $wifi_signal -lt 75 ]] ; then
POWERLEVEL9K_CUSTOM_WIFI_NAME_BACKGROUND="yellow"
POWERLEVEL9K_CUSTOM_WIFI_RATE_BACKGROUND="yellow"
POWERLEVEL9K_CUSTOM_WIFI_BARS_AND_SIGNAL_BACKGROUND="yellow"
fi
}
set_wifi
wifi_name(){
local name=$(nmcli device wifi | grep -E "\*" | awk '{print $3}')
echo "\uf502 $name"
}
wifi_rate(){
local rate=$(nmcli device wifi | grep -E "\*" | awk '{print $6}')
echo "\uf0e7 $rate Mbit/s"
}
wifi_bars_and_signal(){
local bars=$(nmcli device wifi | grep -E "\*" | awk '{print $9}')
echo "$bars $wifi_signal %%"
}
POWERLEVEL9K_CUSTOM_WIFI_NAME="wifi_name"
POWERLEVEL9K_CUSTOM_WIFI_RATE="wifi_rate"
POWERLEVEL9K_CUSTOM_WIFI_BARS_AND_SIGNAL="wifi_bars_and_signal"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
custom_wifi_name custom_wifi_rate custom_wifi_bars_and_signal
)
5.2 位置
可以加上
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
使输入的命令显示在新的一行。
POWERLEVEL9K_RPROMPT_ON_NEWLINE=true
让右边的提示段在新的一行。 在
POWERLEVEL9K_LEFT_PROMPT_ELEMETS
#或
POWERLEVEL9K_RIGHT_PROMPT_ELEMETS
中,可以配合newline以及5.1中的提示段自定义位置,比如,笔者的:
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
os_icon date time newline
custom_wifi_rate custom_wifi_bars_and_signal newline
background_jobs ram load swap disk_usage newline
php_version java_version node_version newline
dir dir_writable vcs
)
当然这不是完整的配置文件,还修改了颜色,完整的配置文件在文末给出。
5.3 颜色
修改提示段的前景/背景,直接修改即可,一般的格式为:
POWERLEVEL9K_NAME_STATUS_BACKGROUND=
POWERLEVEL9K_NAME_STATUS_FOREGROUND=
其中NAME为5.1中对应的提示段,比如可以修改:
POWERLEVEL9K_OS_ICON_FOREGROUND="green"
POWERLEVEL9K_PHP_VERSION_BACKGROUND="010"
颜色可以使用一些常见的red/green等等,也可以使用序号,可以查看这张图:
也可以使用如下命令显示颜色:
for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done
STATUS不是每个提示段都有的,列表如下:
提示段 | 状态 |
---|---|
battery | LOW,CHARGING,CHAGED,DISCONNECTED |
context | DEFAULT,ROOT,SUDO,REMOTE,REMOTE_SUDO |
dir | HOME,HOME_SUBFOLDER,DEFAULT,ETC,NOT_WRITABLE |
dir_writable | FORBIDDEN |
disk_usage | NORMAL,WARNING,CRITICAL |
host | LOCAL,REMOTE |
load | CRITICAL,WARNING,NORMAL |
rspec_stats | STATS_GOOD,STATS_AVG,STATS_BAD |
symfony2_test | TESTS_GOOD,TESTS_AVG,TESTS_BAD |
user | DEFAULT,SUDO,ROOT |
vcs | CLEAN,UNTRACKED,MODIFIED |
vi_mode | NORMAL,INSERT,VISUAL |
大部分都可以很容易理解,这里以最简单的为例:
POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='166'
POWERLEVEL9K_DIR_DEFAULT_FOREGROUND='000'
POWERLEVEL9K_DIR_ETC_BACKGROUND='226'
POWERLEVEL9K_DIR_ETC_FOREGROUND='000'
POWERLEVEL9K_DIR_HOME_BACKGROUND='044'
POWERLEVEL9K_DIR_HOME_FOREGROUND='000'
设置home目录,etc目录以及默认目录的前景与背景。
5.4 图标
使用
get_icon_names
可以查看内置的图标。
注意这个和字体有关,如果使用默认的PowerlineFonts或者使用AwesomeFonts可能不会完整显示所有图标,请使用Nerd-Fonts。
戳这里查看Nerd-fonts的部分图标,戳这里搜索所有的图标。
官方的例子是自定义vcs的图标:
POWERLEVEL9K_VCS_BRANCH_ICON=$'\uF126'
F126可以通过上面的网站搜索得到,是一个分支的图标:
其他git相关图标:
名字 | 图标字段 |
---|---|
Github | VCS_GIT_GITHUB_ICON |
BitBucket | VCS_GIT_BITBUCKET_ICON |
GitLab | VCS_GIT_GITLAB_ICON |
其他 | VCS_GIT_ICON |
另外还可以修改提示段前的图标:
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="↱"
POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="↳ "
POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX="xxx"
还可以根据get_icon_names修改默认图标,比如,修改
POWERLEVEL9K_HOME_SUB_ICON=$'\uf74b'
但是直接改icon的话图标会显示得很小,可以在函数中像上面的wifi一样使用echo自定义。
5.5 其他
5.5.1 粘合
可以添加joined使提示段粘合在一起:
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(history status_joined)
修改前:
修改后:
5.5.2 添加新行
POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
每次输入命令后添加一行空行,可以使用
POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT
控制,默认为1。
5.5.3 更多
更多请移步官方文档,太多了,比如电池,自定义充电中或充完电或低电量状态的颜色以及显示状态:
好了,p9k就到这里,下面看看p10k。
6 p9k与p10k
6.1 两者关系
p10k是2019年3月从p9k的仓库fork而来的。p9k已经是一个拥有大量用户的成熟的工程。p10k被分离出来,以更快的速度迭代更新,添加新特性以及改进性能。
p9k与p10k是独立的工程,只能安装其中一个,但是p10k会识别p9k的所有参数。
目前p9k已经不再维护更新,推荐使用p10k。
6.2 提示延迟
p9k已有几个issue反映很慢:
具体内容请查看p9k官方issue,p10k改进了性能,p10k github有一个演示视频,展示了p10k的速度,在Intel i9-7900X+Ubuntu 18.04上,测试提示延迟如下:
(来源官方测试)
相对来说,p9k具有可接受的延迟,如果只是需要当前目录而不需要截断或缩短,p9k可以17ms内渲染完成,p10k可以将其提高30倍的渲染速度,但实际上并不需要,因为延迟变得明显的阀值为50ms。官方建议必须小心使用p9k的配置,因为很容易使得提示变慢,但是p10k在任何配置中几乎都是即时的,可以保持远低于50ms。
另外笔者的系统上也测试过,p9k确实要比p10k慢,添加了很多设置后,p9k在终端中连续按Enter,松手之后还在提示,甚至一个普通的ls也有明显的延迟,但是p10k没有这样的问题,很流畅。
6.3 加载速度
p10k比p9k能更快加载,前提是,zsh版本5.4+。
官方建议使用下面的命令测试:
time (repeat 1000 zsh -dfis <<< 'source ~/powerlevel10k/powerlevel10k.zsh-theme')
但是笔者没有这个文件,怀疑是位置给错了,修改如下:
time (repeat 1000 zsh -dfis <<< 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k/powerlevel10k.zsh-theme')
笔者的系统上耗时如下:
换了p9k后:
time (repeat 1000 zsh -dfis <<< 'source /usr/share/zsh-theme-powerlevel9k/powerlevel9k.zsh-theme')
耗时如下:
不过好像没快多少的样子,可能是zsh版本的问题,装的是目前最新的5.8,可能老一点的版本区别会明显一点。
官方的测试是p10k用了29s,比相同环境下的p9k master分支大约快6倍,比p9k next分支快17倍。笔者认为仅供参考吧,用p10k就对了,毕竟比p9k快。
6.4 其他
- p10k默认只开启vcs中git后端的支持,如果需要svn/hg,需要添加到POWERLEVEL9K_VCS_BACKENDS。但是p10k还没有针对svn/hg优化,所以添加的话会让提示变慢
- p10k不支持POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY=true
- p10k会兼容p9k的所有选项,因此,相同配置下如果p9k与p10k看到的图标不一样,可能是设置了POWERLEVEL9K_MODE的原因,请去掉POWERLEVEL9K_MODE
- p9k不识别ZLE_RPROMPT_INDENT,因此p10相比起p9k会有额外的空格。如果不想要可以设置ZLE_RPROMPT_INDENT=0
- p9k在图标附近有不一致的空格,在p10k已经不存在了,不过可以设置POWERLEVEL9K_LEGACY_ICON_SPACING=true显示与p9k中一样的空格
- p10k修正了p9k的许多bugs,除了修复空格问题等,最主要是极大地提高了速度
7 安装p10k
7.1 安装字体
Manjaro/Arch用户:
sudo pacman -S nerd-fonts-meslo-lg
或手动安装:
7.2 安装p10k
Manjaro/Arch:
sudo pacman -S zsh-theme-powerlevel10k #如果先前安装了p9k这一步会提示冲突
echo 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme' >>! ~/.zshrc
其他:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>! ~/.zshrc
如果打开zsh时提示找不到powerlevel9k.zsh-theme这个文件,请在zshrc中把
#~/.zshrc
source /usr/share/zsh-theme-powerlevel9k/powerlevel9k.zsh-theme
这一行删去。
8 p10k配置
8.1 基本配置
终端输入
p10k configure
就会出现图形化配置向导。首先会问几个问题:
会问三个图标:钻石,锁与Debian,应该是测试有没有安装对应的字体,然后会问图标是否会重叠,接着有四种风格可以选择:
看个人了,笔者选的3 ,接着可以选择:
- 编码(Unicode/ASCII,一般选Unicode)
- 时间(不显示/12小时制/24小时制)
- 分隔符(三角/垂直/斜线/圆角)
- 提示段头部(三角/渐隐/斜线/垂直)
- 提示段尾部(垂直/渐隐/三角/倾斜/圆角)
- 高度(一行/两行)
- 左右提示段连接方式(无/点状连接/实线连接)
- 提示段旁的命令提示符(无/左/右/左+右)
- 颜色(最亮/亮/暗/最暗)
- 空格(稀疏/紧密)
- 图标(少/多)
- 流(简洁/流畅,针对时间等,流畅模式会多一个at与时钟的图标)
- 临时提示(开启/关闭)
- 即时提示模式(关闭/安静模式/啰嗦模式,关闭是已经尝试过即时提示模式,但是不兼容zsh配置,需要关闭,安静模式是zsh初始化时不会打印警告信息,啰嗦模式会在zsh初始化时打印警告信息)
- 覆盖p10k配置文件(如果p10k配置文件已存在,会提示是否覆盖,不覆盖的话也就是相当于此次配置无效,需要覆盖才能生效),覆盖之前原文件会备份
简单配置的效果:
确实比p9k流畅了很多。
8.2 自定义配置
自定义配置与p9k类似,配置文件位置为:
~/.p10k.zsh
由于大部分都是p9k的配置,这里就不重复了,图标,位置大体类似,颜色可以使用如下命令获取:
for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done
使用时直接加上数字即可。
如果用的是彩虹风格,目录可能在提示段中很难看到,可以直接修改配置文件的颜色,或修改终端全局配置的颜色。
剩下的就个人慢慢摸索了,改颜色,改图标,改位置等等。
最后贴一张配置完成的图:
9 配置文件
笔者的配置文件,仅供参考。
9.1 p9k
9.2 p10k
如果觉得文章好看,欢迎点赞。
同时欢迎关注微信公众号:氷泠之路。
来源:oschina
链接:https://my.oschina.net/u/4231975/blog/4276200