1 概述

作为一个程序员,可以没钱,没车,没房,没老婆,没女朋友。
但是,一定要有一个漂亮骚气的终端。
没错,大骚特骚。
说什么大实话。
先来看看原生的终端:

真漂亮啊。
再看看美化过的:

真 ● 禁秘技 ● 奥义 ● 终端美化_第1张图片
真 ● 禁秘技 ● 奥义 ● 终端美化_第2张图片
真 ● 禁秘技 ● 奥义 ● 终端美化_第3张图片
这才叫终端嘛。
美化过的就是不一样。
如果您也想要这样的终端,那这篇文章要仔细看,同时顺手点个赞。

文章讲述了如何使用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):
真 ● 禁秘技 ● 奥义 ● 终端美化_第4张图片
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
***_ip *** 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

加上即可,演示效果:
真 ● 禁秘技 ● 奥义 ● 终端美化_第5张图片
需要的话,可以根据信号状态定义不同的颜色:
真 ● 禁秘技 ● 奥义 ● 终端美化_第6张图片
完整配置文件如下,加上了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 
)

真 ● 禁秘技 ● 奥义 ● 终端美化_第7张图片
当然这不是完整的配置文件,还修改了颜色,完整的配置文件在文末给出。

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等等,也可以使用序号,可以查看这张图:
真 ● 禁秘技 ● 奥义 ● 终端美化_第8张图片
也可以使用如下命令显示颜色:

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可以通过上面的网站搜索得到,是一个分支的图标:
真 ● 禁秘技 ● 奥义 ● 终端美化_第9张图片
其他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'

真 ● 禁秘技 ● 奥义 ● 终端美化_第10张图片
但是直接改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 更多

更多请移步官方文档,太多了,比如电池,自定义充电中或充完电或低电量状态的颜色以及显示状态:
真 ● 禁秘技 ● 奥义 ● 终端美化_第11张图片
真 ● 禁秘技 ● 奥义 ● 终端美化_第12张图片
好了,p9k就到这里,下面看看p10k。

6 p9k与p10k

6.1 两者关系

p10k是2019年3月从p9k的仓库fork而来的。p9k已经是一个拥有大量用户的成熟的工程。p10k被分离出来,以更快的速度迭代更新,添加新特性以及改进性能。
p9k与p10k是独立的工程,只能安装其中一个,但是p10k会识别p9k的所有参数。
目前p9k已经不再维护更新,推荐使用p10k。
真 ● 禁秘技 ● 奥义 ● 终端美化_第13张图片

6.2 提示延迟

p9k已有几个issue反映很慢:
真 ● 禁秘技 ● 奥义 ● 终端美化_第14张图片
具体内容请查看p9k官方issue,p10k改进了性能,p10k github有一个演示视频,展示了p10k的速度,在Intel i9-7900X+Ubuntu 18.04上,测试提示延迟如下:
真 ● 禁秘技 ● 奥义 ● 终端美化_第15张图片
(来源官方测试)
相对来说,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
    真 ● 禁秘技 ● 奥义 ● 终端美化_第16张图片
  • p9k在图标附近有不一致的空格,在p10k已经不存在了,不过可以设置POWERLEVEL9K_LEGACY_ICON_SPACING=true显示与p9k中一样的空格
    真 ● 禁秘技 ● 奥义 ● 终端美化_第17张图片
  • p10k修正了p9k的许多bugs,除了修复空格问题等,最主要是极大地提高了速度

7 安装p10k

7.1 安装字体

Manjaro/Arch用户:

sudo pacman -S nerd-fonts-meslo-lg

或手动安装:

  • MesloLGS NF Regular.ttf
  • MesloLGS NF Bold.ttf
  • MesloLGS NF Italic.ttf
  • MesloLGS NF Bold Italic.ttf

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

就会出现图形化配置向导。首先会问几个问题:
真 ● 禁秘技 ● 奥义 ● 终端美化_第18张图片
真 ● 禁秘技 ● 奥义 ● 终端美化_第19张图片
真 ● 禁秘技 ● 奥义 ● 终端美化_第20张图片
真 ● 禁秘技 ● 奥义 ● 终端美化_第21张图片
会问三个图标:钻石,锁与Debian,应该是测试有没有安装对应的字体,然后会问图标是否会重叠,接着有四种风格可以选择:
真 ● 禁秘技 ● 奥义 ● 终端美化_第22张图片
看个人了,笔者选的3 ,接着可以选择:

  • 编码(Unicode/ASCII,一般选Unicode)
  • 时间(不显示/12小时制/24小时制)
  • 分隔符(三角/垂直/斜线/圆角)
  • 提示段头部(三角/渐隐/斜线/垂直)
  • 提示段尾部(垂直/渐隐/三角/倾斜/圆角)
  • 高度(一行/两行)
  • 左右提示段连接方式(无/点状连接/实线连接)
  • 提示段旁的命令提示符(无/左/右/左+右)
  • 颜色(最亮/亮/暗/最暗)
  • 空格(稀疏/紧密)
  • 图标(少/多)
  • 流(简洁/流畅,针对时间等,流畅模式会多一个at与时钟的图标)
  • 临时提示(开启/关闭)
  • 即时提示模式(关闭/安静模式/啰嗦模式,关闭是已经尝试过即时提示模式,但是不兼容zsh配置,需要关闭,安静模式是zsh初始化时不会打印警告信息,啰嗦模式会在zsh初始化时打印警告信息)
  • 覆盖p10k配置文件(如果p10k配置文件已存在,会提示是否覆盖,不覆盖的话也就是相当于此次配置无效,需要覆盖才能生效),覆盖之前原文件会备份

简单配置的效果:
真 ● 禁秘技 ● 奥义 ● 终端美化_第23张图片
确实比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

真 ● 禁秘技 ● 奥义 ● 终端美化_第24张图片
使用时直接加上数字即可。
在这里插入图片描述
如果用的是彩虹风格,目录可能在提示段中很难看到,可以直接修改配置文件的颜色,或修改终端全局配置的颜色。
真 ● 禁秘技 ● 奥义 ● 终端美化_第25张图片
剩下的就个人慢慢摸索了,改颜色,改图标,改位置等等。
最后贴一张配置完成的图:
真 ● 禁秘技 ● 奥义 ● 终端美化_第26张图片

9 配置文件

笔者的配置文件,仅供参考。

9.1 p9k

  • github
  • 码云

9.2 p10k

  • github
  • 码云