Please enable Javascript to view the contents

Powerlevel9k:zsh下最棒的Powerline主题

 ·  ☕ 7 分钟

p9k-logo

Powerlevel9k 简介

Powerlevel9k主题可以用于 vanilla ZSH 或 ZSH 框架,如 oh-my-ZSH、 Prezto、 Antigen 等等。

Powerlevel9k的四个主要目标:

  • 开箱即用:让用户无需过多配置即可拥有一个让人眼前一亮的主题
  • 极易定制:为那些想调整提示符的用户,提供更加语义化和模块化的方式直接在 ~/.zshrc 中进行配置。Powerlevel9k将提示符分割成不同的分段,用户可以使用这些内置的分段来自由组合最终的提示符。
  • 提供丰富的配置分段(Segments):内置分段涵盖使用场景非常多;从表示计算机状态的分段到单元测试覆盖率的分段再到 AWS 实例的分段,都有提供。
  • 保证主题渲染的速度:Powerlevel9k 尽可能优化代码以提高执行速度

这是我的个人配置效果:

cmder-zsh-p9k-20191215153654.png

安装 Powerlevel9k

涉及两个步骤:

安装 Powerline 字体:

寻找字体是一件很伤心的事情,这里我推荐Ubuntu Mono Nerd Font Complete (Win用户选择带有Windows的字体文件)、 DejaVu Sans Mono Nerd Font Complete 、 (等距)更纱黑体

通常配置文件中会有这么一项配置 POWERLEVEL9K_MODE,它的值受字体和字体安装的方式的影响,值与字体之间不对应显示时可能会达不到效果:

POWERLEVEL9K_MODE='nerdfont-complete'

对应的关系如下:

Configuration value Description
default 对于常规的 powerline字体(如果您需要一个图标较少的终端)
awesome-fontconfig If you use Awesome Terminal Fonts with fontconfig, without the named icons.
awesome-mapped-fontconfig If you use Awesome Terminal Fonts with fontconfig, including named icons (e.g. $CODEPOINT_OF_AWESOME_CHECK).
awesome-patched If you use Awesome Terminal Fonts with a pre-patched font.
nerdfont-complete If you use Nerdfonts in complete variant.(选择这个简单的
nerdfont-fontconfig If you use Nerdfonts in a fontconfig setup.

我们选择简单一点的 nerdfont-complete ,在 Linux中我们这样操作:

1
2
3
4
# Linux 中:
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts 
curl -fLo "DejaVu Sans Mono Nerd Font Complete.ttf" https://github.com/ryanoasis/nerd-fonts/blob/master/patched-fonts/DejaVuSansMono/Regular/complete/DejaVu%20Sans%20Mono%20Nerd%20Font%20Complete.ttf

Windows中我们直接下载字体文件,双击安装即可。

如果需要使用 fontconfig 程序进行安装,那么先通过 apt-get install fontconfig 安装 fontconfig 程序,再点击上面字体链接查看如何安装该字体的说明。

安装 P9k 主题:

  • 安装 zsh

    1
    
    sudo apt install zsh
    
  • 安装 Oh-My-Zsh

    1
    
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    
  • 安装P9k

    1
    
    git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
    
  • 配置 oh-my-zsh :编辑 ~/.zshrc 修改zsh的主题

    1
    
    ZSH_THEME="powerlevel9k/powerlevel9k"
    

修改终端字体: 修改终端所使用的字体为 你安装的某 nerd font 字体。

重启终端: 修改完成 重启终端或 source ~/.zshrc 使配置生效。

P9k要求,zsh 最小版本: 5.1

提示符定制方式

提示符由最基本的 分段 (segments) 构成

我们直接在 zsh 的配置文件 ~/.zshrc 中对其进行定制,下面是一个简单配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 配置zsh 当前使用的主题
ZSH_THEME="powerlevel9k/powerlevel9k"
# P9k 使用的模式
POWERLEVEL9K_MODE='nerdfont-complete'
# 显示在左边的提示元素(分段位于括号中并以空格隔开)
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir dir_writable vcs vi_mode)
# 显示在右边的提示元素(分段)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status)
# 左侧提示符是否显示两行(光标显示在下一行)
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
如有问题请参考后文给出的故障排查链接

寻找可用分段

系统状态:

  • background_jobs - 后台作业的指示器
  • battery - 电池状态
  • context - 您的用户名和主机,基于 $USER 和 SSH 状态的条件化
  • date - 系统日期
  • dir - 你当前的工作目录
  • dir_writable - 如果您对当前文件夹没有写权限,则显示锁定图标
  • disk_usage - 当前分区的磁盘使用情况
  • history - 当前行的命令号
  • host - 您当前的主机名
  • ip - 显示当前 IP 地址
  • vpn_ip - 显示当前的 VPN 地址
  • public_ip - 显示你的公共IP地址
  • load - 机器的平均负载
  • os_icon - 操作系统图标
  • ram - 显示空闲内存
  • root_indicator - 指示用户是否具有超级用户状态
  • status - 前一个命令的返回代码
  • swap - 打印当前交换文件大小
  • time - 系统时间
  • user - 你现在的用户名
  • vi_mode - 提示符的 Vi 编辑模式 (正常 | 插入)
  • ssh - 指示您是否处于 SSH 会话中

开发环境部分:

  • vcs - git 存储库相关信息

编程语言相关:

  • GoLang Segments:
    • go_version - Go版本号
  • Javascript / Node.js Segments:
    • node_version - Node.js 版本号
    • nodeenv - 显示 node 版本和环境
    • nvm - 略
  • PHP Segments:
    • php_version - 显示当前的 PHP 版本
  • Python Segments:
  • Java Segments:
    • java_version - 显示当前的 Java 版本

Cloud Segments:

  • AWS Segments:
    • aws - The current AWS profile, if active.
    • aws_eb_env - The current Elastic Beanstalk Environment.
  • docker_machine - The current Docker Machine.
  • kubecontext - The current context of your kubectl configuration.
  • dropbox - Indicates Dropbox directory and syncing status using dropbox-cli

其他:

  • custom_command - 创建一个自定义段来显示任意命令的输出
  • command_execution_time - 显示当前命令执行时间
  • todo - Shows the number of tasks in your todo.txt tasks file.
  • detect_virt - Virtualization detection with systemd
  • newline - Continues the prompt on a new line. - 在新行上继续提示符
  • openfoam - 显示当前 sourced 环境

提示符基本定制

让提示符显示两行:

1
2
3
4
# 左侧提示符是否显示两行(光标显示在下一行)
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
# 右侧提示符是否显示两行
POWERLEVEL9K_RPROMPT_ON_NEWLINE=true

也可以使用 newline 分段将分段列表分成多行,比如

1
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir newline vcs)

设置提示符前缀,比如

1
2
3
4
# 第一行左提示符前缀(一般设置为空)
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="↱"
# 最后一行左提示符前缀符号(一般设置为 $)
POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="↳ "

在提示符上方插入一空行以保持间距:

1
POWERLEVEL9K_PROMPT_ADD_NEWLINE=true

禁用右侧提示符:

1
POWERLEVEL9K_DISABLE_RPROMPT=true

Stylizing Your Prompt · Powerlevel9k/powerlevel9k Wiki 必看

获取和设置颜色值

直接在终端运行下面的语句,获取颜色值(颜色数值)

1
for code ({000..255}) print -P -- "$code: %F{$code}最左侧三位数字即颜色值Text Color%f"

一些终端仿真器允许您自定义终端使用的颜色。 P9k 提供了两个命令,您可以使用它们打印出模拟器使用的 颜色名称颜色数值,以帮助您进行自定义;也可以直接使用获取到的 颜色名称

1
2
getColorCode background
getColorCode foreground

设置颜色值:

POWERLEVEL9K_分段名称_FOREGROUND='red'
POWERLEVEL9K_分段名称_BACKGROUND='blue'

也可以更改 P9k 的整体配色方案,比如设置为 light :

POWERLEVEL9K_COLOR_SCHEME='light'

背景色值设置为 none 表示不需要背景

将两个分段连接在一起

可以为分段添加 _joined 后缀的形式,将两个分段显示为一个;添加了 _joined 后缀的分段(即使是自定义的分段)将会和它前一个分段连接在一起。请确保这两个分段都能正常显示,否则,可能会得到不想要的结果。

例如,如果要在右侧提示符中将statusbackground_jobs连接在一起,可以这样设置

1
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs_joined)

设置图标

可以通过使用 p9k 提供的下例方法,列出主题中包含的所有图标的名称

get_icon_names

例如,如果您想对分段分隔符使用不同的字形,则可以使用以下方法轻松实现:

POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR=$'\uE0B1'
POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR=$'\uE0B3'

其中 $ 环境变量前缀,\uE0B1 为该图标的码点。

您可以使用相同的方法在提示符中添加或删除间距。例如,如果您想删除 vcs段中 “分支” 图标之后的空格,则只需在该图标的码点之后添加一个空格即可(没有测试,这是删除还是增加?):

1
POWERLEVEL9K_VCS_BRANCH_ICON=$'\uF126 '

比如系统图标经常会显示不下,可以通过添加空格的方式来增加间距

1
2
POWERLEVEL9K_WINDOWS_ICON:=' '
POWERLEVEL9K_LINUX_UBUNTU_ICON=' '

使用icons_test 分段,测试图标上色效果,它将会列出所有上色的图标:

1
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(icons_test)

定制分段

你也可以修改分段的默认样式和显示格式。

更改最左侧的符号:

1
2
3
4
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX=""
POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX="▶ "
POWERLEVEL9K_DISABLE_RPROMPT=true
POWERLEVEL9K_PROMPT_ON_NEWLINE=true

定制日期 date:

变量 默认值 描述
POWERLEVEL9K_DATE_FORMAT %D{%d.%m.%y} 使用 Zsh 时间格式

定制时间time:

变量 默认值 描述
POWERLEVEL9K_TIME_FORMAT 'H:M:S' 使用Zsh 时间格式

示列:

1
2
3
4
# Reversed time format
POWERLEVEL9K_TIME_FORMAT='%D{%S:%M:%H}'
# Output time, date, and a symbol from the "Awesome Powerline Font" set
POWERLEVEL9K_TIME_FORMAT="%D{%H:%M:%S \uE868  %d.%m.%y}"

主机名 host:

1
2
3
4
5
6
7
# 有些主机名很长并以.分隔;默认为 %m ,数字表示要显示的段数,负数表示只显示最后一段
POWERLEVEL9K_HOST_TEMPLATE="%2m"
# 主机图标(默认情况)
# 本地主机图标
POWERLEVEL9K_HOST_ICON="\uF109 "
# SSH远程主机图标
POWERLEVEL9K_SSH_ICON="\uF489 "

dir目录:

对于某些字体,可以在特定目录下还可显示特定目录图标,比如在home目录显示一个房子。要关闭这些图标可以见下面的变量设置为空即可:

1
2
3
4
POWERLEVEL9K_HOME_ICON=''
POWERLEVEL9K_HOME_SUB_ICON=''
POWERLEVEL9K_FOLDER_ICON=''
POWERLEVEL9K_ETC_ICON=''

您可以截断过长的路径将其限制在一定长度之内:

变量 默认值 描述
POWERLEVEL9K_DIR_PATH_ABSOLUTE None 如果设置为true 将使用绝对路径而不是主文件夹缩写~
POWERLEVEL9K_SHORTEN_DIR_LENGTH 2 如果您的缩短策略是整个目录,则此字段决定在末尾留下多少个目录。 如果缩短策略是通过字符计数,则此字段决定允许每个目录字符串使用多少个字符
POWERLEVEL9K_SHORTEN_STRATEGY None 如何截断目录字符串。(东西太多,请查看文档)
POWERLEVEL9K_SHORTEN_DELIMITER .. 要在截断的字符串中使用的分隔符。 可以是任何字符串,也可以是一个空字符串

如果要自定义目录分隔符,可以设置:

# Double quotes are important here!
POWERLEVEL9K_DIR_PATH_SEPARATOR="%F{red} $(print_icon 'LEFT_SUBSEGMENT_SEPARATOR') %F{black}"

powerlevel9k/segments

参考他人的配置

参考这里列出的效果图和配置信息:Show Off Your Config

同时注意,终端类型、终端字体、终端配主题

这是我的个人配置效果

配置文件见我的 : Powerlevel9k - .zshrc

几个不错的配置:

  • P9KGT 配置方式值得参考

故障排除

如果遇到问题,可查看此处的故障排查:Troubleshooting · Powerlevel9k/powerlevel9k Wiki

在我当前环境(WSL+ Oh-My-Zsh + Cmder)中,右侧提示符只能设置一些简单的分段,并且分段会被截断一部分,右侧如果放长一点的分段就会导致右侧提示符溢出到下一行。

注意: 配置时 = 等号两边不能有空格。

启用和禁用 Powerlevel9k

禁用 P9k

1
$ prompt_powerlevel9k_teardown

然后可以这样启用 P9k

1
$ prompt_powerlevel9k_setup

另外还有个:Powerlevel10k: A Zsh theme

您的鼓励是我最大的动力
alipay QR Code

Felix
作者
Felix
如无必要,勿增实体。

3

目录