标签:debian pre 相对 环境 track kconfig rvm chage 命令执行
1 概述作为一个程序员,可以没钱,没车,没房,没老婆,没女朋友。
但是,一定要有一个漂亮骚气的终端。没错,大骚特骚。  说什么大实话。
先来看看原生的终端:
真漂亮啊。 
再看看美化过的:



这才叫终端嘛。 
美化过的就是不一样。
如果您也想要这样的终端,那这篇文章要仔细看,同时顺手点个赞。
文章讲述了如何使用zsh+oh-my-zsh,配合主题Powerlevel9k/Powerlevel10k(以下简称p9k/p10k)进行终端美化的过程,不废话了,进入正题。
笔者环境:
其他linux基本适用,安装zsh+oh-my-zsh即可,mac用户可以通过homebrew安装zsh+p9k/p10k,至于win用户,自行搜索吧。
安装zsh+oh-my-zsh。
Manjaro/Arch:
sudo pacman -S zshDebian系:
sudo apt install zshRedHat系:
sudo yum install -y zsh其他可以来到官方github安装,戳这里。
设为默认shell:
chsh -s $(which zsh)再把原来的别名复制到
~/.zshrc通过脚本安装即可,使用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仓库安装,戳这里。
推荐使用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‘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"p9k配置的主要部分就是自定义提示段(Prompt Segments),包括开启/关闭,位置,颜色,图标等。
具体请看5.2 位置。
关闭左边/右边整个提示段:
#左
POWERLEVEL9K_DISABLE_PROMPT=true
#右
POWERLEVEL9K_DISABLE_RPROMPT=true| 名字 | 作用 | 
|---|---|
| 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状态 | 
| 名字 | 作用 | 
|---|---|
| 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库版本 | 
| 名字 | 作用 | 
|---|---|
| aws | 当前的AWS配置 | 
| aws_eb_env | 当前的Elastic Beanstalk环境 | 
| docker_machine | 当前的Docker Machine | 
| docker_machine | kubectl配置 | 
| dropbox | Dropbox目录以及使用dropbox-cli的同步状态 | 
| 名字 | 作用 | 
|---|---|
| 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 
)可以加上
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 
)
当然这不是完整的配置文件,还修改了颜色,完整的配置文件在文末给出。
修改提示段的前景/背景,直接修改即可,一般的格式为:
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目录以及默认目录的前景与背景。
使用
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自定义。
可以添加joined使提示段粘合在一起:
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(history status_joined)修改前:
修改后:
POWERLEVEL9K_PROMPT_ADD_NEWLINE=true每次输入命令后添加一行空行,可以使用
POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT控制,默认为1。
更多请移步官方文档,太多了,比如电池,自定义充电中或充完电或低电量状态的颜色以及显示状态:

好了,p9k就到这里,下面看看p10k。
p10k是2019年3月从p9k的仓库fork而来的。p9k已经是一个拥有大量用户的成熟的工程。p10k被分离出来,以更快的速度迭代更新,添加新特性以及改进性能。
p9k与p10k是独立的工程,只能安装其中一个,但是p10k会识别p9k的所有参数。
目前p9k已经不再维护更新,推荐使用p10k。
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没有这样的问题,很流畅。
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快。


Manjaro/Arch用户:
sudo pacman -S nerd-fonts-meslo-lg或手动安装:
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这一行删去。
终端输入
p10k configure就会出现图形化配置向导。首先会问几个问题:



会问三个图标:钻石,锁与Debian,应该是测试有没有安装对应的字体,然后会问图标是否会重叠,接着有四种风格可以选择:
看个人了,笔者选的3 ,接着可以选择:
简单配置的效果:
确实比p9k流畅了很多。
自定义配置与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
使用时直接加上数字即可。
如果用的是彩虹风格,目录可能在提示段中很难看到,可以直接修改配置文件的颜色,或修改终端全局配置的颜色。
剩下的就个人慢慢摸索了,改颜色,改图标,改位置等等。
最后贴一张配置完成的图:
笔者的配置文件,仅供参考。
标签:debian pre 相对 环境 track kconfig rvm chage 命令执行
原文地址:https://blog.51cto.com/14415843/2494693