真●禁秘技●奥义●终端美化
但是,一定要有一个漂亮骚气的终端。
没错,大骚特骚。
说什么大实话。
先来看看原生的终端:
真漂亮啊。
再看看美化过的:
这才叫终端嘛。
美化过的就是不一样。
如果您也想要这样的终端,那这篇文章要仔细看,同时顺手点个赞。
文章讲述了如何使用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-powerlevel9kecho "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}:+$""}; 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
或手动安装:
- 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 ~/powerlevel10kecho "source ~/powerlevel10k/powerlevel10k.zsh-theme" >>! ~/.zshrc
如果打开zsh时提示找不到powerlevel9k.zsh-theme这个文件,请在zshrc中把
#~/.zshrcsource /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}:+$""}; done
使用时直接加上数字即可。
如果用的是彩虹风格,目录可能在提示段中很难看到,可以直接修改配置文件的颜色,或修改终端全局配置的颜色。
剩下的就个人慢慢摸索了,改颜色,改图标,改位置等等。
最后贴一张配置完成的图:
9 配置文件
笔者的配置文件,仅供参考。
9.1 p9k
- github
- 码云
9.2 p10k
- github
- 码云
如果觉得文章好看,欢迎点赞。
同时欢迎关注微信公众号:氷泠之路。
以上是 真●禁秘技●奥义●终端美化 的全部内容, 来源链接: utcz.com/z/516396.html