真●禁秘技●奥义●终端美化

编程

但是,一定要有一个漂亮骚气的终端。

没错,大骚特骚。

说什么大实话。

先来看看原生的终端:

真漂亮啊。

再看看美化过的:

这才叫终端嘛。

美化过的就是不一样。

如果您也想要这样的终端,那这篇文章要仔细看,同时顺手点个赞。

文章讲述了如何使用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}:+$"

"}; 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 ~/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}:+$"

"}; done

使用时直接加上数字即可。

如果用的是彩虹风格,目录可能在提示段中很难看到,可以直接修改配置文件的颜色,或修改终端全局配置的颜色。

剩下的就个人慢慢摸索了,改颜色,改图标,改位置等等。

最后贴一张配置完成的图:

9 配置文件

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

9.1 p9k

  • github
  • 码云

9.2 p10k

  • github
  • 码云

如果觉得文章好看,欢迎点赞。

同时欢迎关注微信公众号:氷泠之路。

以上是 真●禁秘技●奥义●终端美化 的全部内容, 来源链接: utcz.com/z/516396.html

回到顶部