You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
7.4 KiB
Markdown
170 lines
7.4 KiB
Markdown
# Powerlevel10k
|
|
|
|
Powerlevel10k is a theme for ZSH. It's a backward-compatible fork of
|
|
[Powerlevel9k](https://github.com/bhilburn/powerlevel9k) with lower latency and better
|
|
prompt responsiveness.
|
|
|
|
If you like the looks of Powerlevel9k but feeling frustrated by its slow prompt,
|
|
simply replace your `powerlevel9k` theme with `powerlevel10k` and enjoy responsive
|
|
shell like it's 80's again!
|
|
|
|
Powerlevel10k uses the same configuration options as Powerlevel9k and produces the
|
|
same results. It's simply faster. There is no catch.
|
|
|
|
If you are on Linux or WSL, enable [gitstatus](https://github.com/romkatv/gitstatus)
|
|
plugin for additional performance improvement in the vcs/prompt segment.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Installation & Configuration](#installation-and-configuration)
|
|
2. [Try it in Docker](#try-it-in-docker)
|
|
3. [How fast is it?](#how-fast-is-it)
|
|
4. [What's the catch?](#whats-the-catch)
|
|
|
|
## Installation and Configuration
|
|
|
|
For installation and configuration instructions see
|
|
[Powerlevel9k](https://github.com/bhilburn/powerlevel9k). Everything in there applies to
|
|
Powerlevel10k as well. Follow the official installation guide, make sure everything works
|
|
and you like the way prompt looks. Then simply replace Powerlevel9k with Powerlevel10k. Once
|
|
you restart zsh, your prompt will be faster. No configuration changes are needed.
|
|
|
|
Manual installation:
|
|
|
|
```zsh
|
|
git clone https://github.com/romkatv/gitstatus.git ~/gitstatus
|
|
git clone https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
|
|
echo 'source ~/gitstatus/gitstatus.plugin.zsh' >>! ~/.zshrc
|
|
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>! ~/.zshrc
|
|
```
|
|
|
|
**Do not load both Powerlevel9k and Powerlevel10k themes at the same time. Variable name clashes
|
|
will cause mayhem. You can source either one or the other. Consider Powerlevel10k a patched fork
|
|
of Powerlevel9k, which it is.**
|
|
|
|
## Try it in Docker
|
|
|
|
Try Powerlevel10k in Docker without making any changes to your system.
|
|
|
|
```zsh
|
|
docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -e TERM=$TERM -it --rm ubuntu bash -c '
|
|
set -uex
|
|
apt update
|
|
apt install -y zsh git
|
|
cd
|
|
git clone https://github.com/romkatv/gitstatus.git
|
|
git clone https://github.com/romkatv/powerlevel10k.git
|
|
echo "
|
|
# Your prompt configuration goes here.
|
|
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
|
|
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(root_indicator dir_writable dir vcs)
|
|
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time background_jobs time)
|
|
source ~/gitstatus/gitstatus.plugin.zsh
|
|
source ~/powerlevel10k/powerlevel10k.zsh-theme" >~/.zshrc
|
|
cd powerlevel10k
|
|
zsh -i'
|
|
```
|
|
|
|
Compare prompt responsiveness to Powerlevel9k.
|
|
|
|
```zsh
|
|
docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -e TERM=$TERM -it --rm ubuntu bash -c '
|
|
set -uex
|
|
apt update
|
|
apt install -y zsh git
|
|
cd
|
|
git clone https://github.com/bhilburn/powerlevel9k.git
|
|
echo "
|
|
# Your prompt configuration goes here.
|
|
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
|
|
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(root_indicator dir_writable dir vcs)
|
|
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time background_jobs time)
|
|
source ~/powerlevel9k/powerlevel9k.zsh-theme" >~/.zshrc
|
|
cd powerlevel9k
|
|
zsh -i'
|
|
```
|
|
|
|
## How fast is it?
|
|
|
|
Powerlevel10k with [gitstatus](https://github.com/romkatv/gitstatus) renders prompt about
|
|
10 times faster than powerlevel9k/master (stable version) and about 5 times faster than
|
|
powerlevel9k/next (beta version). Powerlevel10k is faster than Powerlevel9k even without
|
|
[gitstatus](https://github.com/romkatv/gitstatus) but the difference isn't as dramatic.
|
|
|
|
Here are benchmark results obtained with
|
|
[zsh-prompt-benchmark](https://github.com/romkatv/zsh-prompt-benchmark) on Intel i9-7900X
|
|
running Ubuntu 18.04.
|
|
|
|
| Theme | / | ~/testrepo | ~/nerd-fonts | ~/linux |
|
|
|----------------------------------|----------:|-----------:|-------------:|-----------:|
|
|
| powerlevel9k/master | 135 ms | 207 ms | 234 ms | 326 ms |
|
|
| powerlevel9k/next | 47 ms | 101 ms | 122 ms | 213 ms |
|
|
| powerlevel10k | 24 ms | 82 ms | 104 ms | 197 ms |
|
|
| **powerlevel10k with gitstatus** | **9 ms** | **11 ms** | **27 ms** | **71 ms** |
|
|
| naked zsh | 1 ms | 1 ms | 1 ms | 1 ms |
|
|
|
|
Columns define the current directory where the prompt was rendered.
|
|
|
|
* `/` -- root directory, not a git repo.
|
|
* `~/testrepo` -- a tiny git repo.
|
|
* `~/nerd-fonts` -- [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) git repo
|
|
with 4k files.
|
|
* `~/linux` -- [linux](https://github.com/torvalds/linux) git repo. Huge.
|
|
|
|
Here's how the prompt looked like (identical by design in Powerlevel9k and Powerlevel 10k):
|
|
|
|
![](https://raw.githubusercontent.com/romkatv/powerlevel10k/master/prompt.png)
|
|
|
|
Configuration that was used during benchmarking:
|
|
|
|
```zsh
|
|
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir_writable dir vcs)
|
|
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs time custom_rprompt)
|
|
|
|
POWERLEVEL9K_MODE=nerdfont-complete
|
|
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
|
|
POWERLEVEL9K_CUSTOM_RPROMPT=custom_rprompt
|
|
POWERLEVEL9K_ROOT_ICON=\\uF09CPOWERLEVEL9K_TIME_ICON=\\uF017
|
|
POWERLEVEL9K_CUSTOM_RPROMPT_ICON=\\uF005
|
|
POWERLEVEL9K_TIME_BACKGROUND=magenta
|
|
POWERLEVEL9K_CUSTOM_RPROMPT_BACKGROUND=blue
|
|
POWERLEVEL9K_STATUS_OK_BACKGROUND=grey53
|
|
POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=orange1
|
|
POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=black
|
|
|
|
# Powerlevel10k extension to enable gitstatus. Has no effect on Powerlevel9k.
|
|
POWERLEVEL9K_VCS_STATUS_COMMAND=gitstatus_query_dir
|
|
|
|
function custom_rprompt() echo -E "hello world"
|
|
```
|
|
|
|
Here's the same benchmark for Windows Subsystem for Linux (WSL) with
|
|
zsh running in the standard Command Prompt (`cmd.exe`).
|
|
|
|
|
|
| Theme | / | ~/testrepo | ~/nerd-fonts | ~/linux |
|
|
|----------------------------------|----------:|-----------:|-------------:|------------:|
|
|
| powerlevel9k/master | 313 ms | 531 ms | 693 ms | 5898 ms |
|
|
| powerlevel9k/next | 119 ms | 278 ms | 442 ms | 5710 ms |
|
|
| powerlevel10k | 66 ms | 237 ms | 399 ms | 5569 ms |
|
|
| **powerlevel10k with gitstatus** | **22 ms** | **30 ms** | **30 ms** | **5098 ms** |
|
|
| naked zsh | 16 ms | 16 ms | 16 ms | 16 ms |
|
|
|
|
Here Powerlevel10k with [gitstatus](https://github.com/romkatv/gitstatus) has even bigger
|
|
advantage over Powerlevel9k and manages to render prompt with low latency.
|
|
|
|
However, every theme failed miserably on the humongous Linux kernel repo, showing prompt latency
|
|
over 5 seconds. This might be related to some sort of system cache that can fit indices of
|
|
smaller repos but not of Linux kernel. To work around this problem, you can instruct
|
|
[gitstatus](https://github.com/romkatv/gitstatus) to not scan dirty files on repos with over 4k
|
|
files in the index (see `GITSTATUS_DIRTY_MAX_INDEX_SIZE` in
|
|
[gitstatus docs](https://github.com/romkatv/gitstatus)). Linux kernel is the only repo in these
|
|
benchmarks that is over this threshold. Its prompt latency goes down to 32 ms but the prompt no
|
|
longer shows whether there are dirty (unstaged or untracked) files. It does helpfully indicate
|
|
with the color that there _might_ be such files.
|
|
|
|
## What's the catch?
|
|
|
|
Really, there is no catch. It's literally the same prompt with the same flexibility
|
|
configuration format as Powerlevel9k. But **much faster**.
|