需 Git 2.15.2+ 与 ZSH 5.2+,且必须用 npm 而非 yarn 安装;若 prompt -l 未列出 pure,需手动把 npm 全局 root 下的 pure-prompt 加入 fpath;git stash 状态、Node 版本、详细脏标记等默认关闭,需额外 zstyle 开启
npm install --global pure-prompt
# .zshrc
autoload -U promptinit; promptinit
prompt pureREADME 未说明,纯 shell 脚本无 GPU 或显存要求
极简快速的 ZSH 提示符,用异步 git 状态和退出码着色让终端清爽不卡顿
极简又好看的 ZSH 提示符,异步渲染不卡输入,能实时显示 Git 分支状态和命令耗时。
核心能力
- 异步检查 git 分支与未推送/未拉取提交
- 上条命令失败时提示符变红,超时显示执行耗时
- 仅在 SSH 或容器中显示用户名与主机名
- 支持 VI 模式、虚拟环境、nix-shell 与 Node 版本提示
- 通过 zstyle 与 psvar 钩子自定义颜色和前后缀
容易踩的坑
- v1.28.4最新正式版2026-10-07 · 2026-10-07 13:58 UTC
- Fix the prompt symbol for other keymaps and for a
%in it e74c483 - Fix palette corruption when a color is set to the empty string 198828d
- Fix the system report showing the wrong Zsh, or a shell error without Git fb5d02a
- Fix the terminal title at
/and in non-interactive scripts 19dc0c7 - Fix the Node.js version not updating, or keeping the
v54d97f3 - Fix local BusyBox
whologin time being detected as a remote address 696d648 - Fix
WARN_CREATE_GLOBALwarnings b6d04db - Fix pull and fetch detection for cancelling the background fetch 862e27f
- Fix Python 3.12 virtualenv name being shown in parentheses f0f3171
- Fix the Git dirty check for some settings and repositories 6f2067a
- Fix the background
git fetchfor some upstreams, SSH setups, and$HOME634afe7 - Fix the Git branch for a
%in its name and for the user'svcs_infostyles 7f55218
https://github.com/sindresorhus/pure/compare/v1.28.3...v1.28.4
- Fix the prompt symbol for other keymaps and for a
- v1.28.32026-07-16 · 2026-07-16 13:03 UTC
查看更新说明
- Fix quadratic CPU and memory blowup when parsing large async job results 4fe4527
https://github.com/sindresorhus/pure/compare/v1.28.2...v1.28.3
- v1.28.22026-07-13 · 2026-07-13 11:42 UTC
查看更新说明
- Fix Git prompt info lagging the current directory 912a947
https://github.com/sindresorhus/pure/compare/v1.28.1...v1.28.2
- v1.28.12026-05-20 · 2026-05-20 05:43 UTC
查看更新说明
- Disable
fetch.prunein background git fetch 98ad83a
https://github.com/sindresorhus/pure/compare/v1.28.0...v1.28.1
- Disable
- v1.28.02026-05-14 · 2026-05-14 16:22 UTC
查看更新说明
- Add opt-in Node.js version display (#717) 5344582
- Add Git dirty advanced look setting cd454a4 44cb83d
- Add option to dim path separators db7e8f5
- Add custom prompt segments hook via
prompt_pure_precustomd87a4cd - Add option to disable terminal title management (#715) 512b418
- Add option to disable hostname in prompt 0fa5bdc
- Add option to disable git integration (#714) 519deab
- Add option to disable virtualenv/conda display in prompt 62f4488
- Add
prompt_pure_previewcommand to display all prompt styles d909c02 - Allow disabling suspended jobs and stash symbols by setting them to empty 705b90c
- Improve synchronous prompt rendering performance 5cc6079
- Hide
baseconda environment in prompt 3912b1a - Fix visual mode keymap leaking as literal text in prompt 409f10a
- Fix async worker error messages leaking to stderr 543d8bf
- Fix: Show only basename for conda environment in prompt fc963fc
- Fix shell crash caused by infinite recursion when async worker fails to start d722317
- Fix: Sync
$GIT_DIRand$GIT_WORK_TREEto async worker (#713) c5ff85a - Fix: Clear RPROMPT in setup to prevent framework leakage 6ebf74b
- Fix npm install not working with promptinit 29caac2
- Fix node version variable polluting prompt path via named directory d611d0b
- Fix 100% CPU usage caused by busy-loop on broken zpty fd 5564ee9
- Fix double virtualenv in prompt with pyenv-virtualenv (#716) ddb0b7b
https://github.com/sindresorhus/pure/compare/v1.27.1...v1.28.0
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Pure
Pretty, minimal and fast ZSH prompt
Overview
Most prompts are cluttered, ugly and slow. We wanted something visually pleasing that stayed out of our way.
Why?
- Comes with the perfect prompt character. Author went through the whole Unicode range to find it.
- Shows
gitbranch and whether it's dirty (with a*). - Indicates when you have unpushed/unpulled
gitcommits with up/down arrows. (Check is done asynchronously!) - Prompt character turns red if the last command didn't exit with
0. - Command execution time will be displayed if it exceeds the set threshold.
- Username and host only displayed when in an SSH session or a container.
- Shows the current path in the title and the current folder & command when a process is running.
- Support VI-mode indication by reverse prompt symbol (Zsh 5.3+).
- Makes an excellent starting point for your own custom prompt.
Install
Can be installed with npm (not yarn) or manually. Requires Git 2.15.2+ and ZSH 5.2+. Older versions of ZSH are known to work, but they are not recommended.
npm
npm install --global pure-prompt
That's it. Skip to Getting started.
If prompt -l does not list pure, add this to your .zshrc before promptinit:
fpath+=("$(npm root -g)/pure-prompt")
Homebrew
brew install pure
If you're not using ZSH from Homebrew (brew install zsh and $(brew --prefix)/bin/zsh), you must also add the site-functions to your fpath in $HOME/.zshrc:
fpath+=("$(brew --prefix)/share/zsh/site-functions")
Manually
- Clone this repo somewhere. Here we'll use
$HOME/.zsh/pure.
mkdir -p "$HOME/.zsh"
git clone https://github.com/sindresorhus/pure.git "$HOME/.zsh/pure"
- Add the path of the cloned repo to
$fpathin$HOME/.zshrc.
# .zshrc
fpath+=($HOME/.zsh/pure)
Getting started
Initialize the prompt system (if not so already) and choose pure:
# .zshrc
autoload -U promptinit; promptinit
prompt pure
Options
| Option | Description | Default value |
|---|---|---|
PURE_CMD_MAX_EXEC_TIME | The max execution time of a process before its run time is shown when it exits. | 5 seconds |
PURE_GIT_PULL | Prevents Pure from checking whether the current Git remote has been updated. | 1 |
PURE_GIT_UNTRACKED_DIRTY | Do not include untracked files in dirtiness check. Mostly useful on large repos (like WebKit). | 1 |
PURE_GIT_DELAY_DIRTY_CHECK | Time in seconds to delay git dirty checking when git status takes > 5 seconds. | 1800 seconds |
PURE_PROMPT_SYMBOL | Defines the prompt symbol. | ❯ |
PURE_PROMPT_VICMD_SYMBOL | Defines the prompt symbol used when the vicmd keymap is active (VI-mode). | ❮ |
PURE_SUSPENDED_JOBS_SYMBOL | Defines the symbol that indicates that jobs are running in the background. Set to empty to disable. | ✦ |
PURE_GIT_DOWN_ARROW | Defines the git down arrow symbol. | ⇣ |
PURE_GIT_UP_ARROW | Defines the git up arrow symbol. | ⇡ |
PURE_GIT_STASH_SYMBOL | Defines the git stash symbol. Set to empty to disable. | ≡ |
Zstyle options
Showing git stash status as part of the prompt is not activated by default. To activate this you'll need to opt in via zstyle:
zstyle :prompt:pure:git:stash show yes
You can set Pure to only git fetch the upstream branch of the current local branch. In some cases, this can result in faster updates for Git arrows, but for most users, it's better to leave this setting disabled. You can enable it with:
zstyle :prompt:pure:git:fetch only_upstream yes
Node.js version display shows the current major node version when inside a directory tree containing a package.json. It is not enabled by default. You can enable it with:
zstyle :prompt:pure:environment:node_version show yes
You can change the symbol shown before the Node.js version (default ⬢) with:
zstyle :prompt:pure:environment:node_version symbol ⬡
nix-shell integration adds the shell name to the prompt when used from within a nix shell. It is enabled by default, you can disable it with:
zstyle :prompt:pure:environment:nix-shell show no
Virtualenv integration shows the current Python virtualenv or Conda environment name. It is enabled by default, you can disable it with:
zstyle :prompt:pure:environment:virtualenv show no
Git integration is enabled by default, you can disable it with:
zstyle :prompt:pure:git show no
Detailed dirty indicators differentiate between unstaged (*), staged (+), and untracked (?) changes instead of showing a single *. It is not enabled by default. You can enable it with:
zstyle :prompt:pure:git:dirty detailed yes
Path separator dimming makes / characters in the path visually dimmer to help distinguish path components. It is not enabled by default. You can enable it with:
zstyle :prompt:pure:path:separator dim yes
Hostname display is enabled by default when in an SSH session or container. You can disable it while still showing the username with:
zstyle :prompt:pure:host show no
Automatic terminal title management can be disabled if you want to set your own tab or window titles:
zstyle :prompt:pure:title show no
Customization
Pure supports a hook function for adding custom content to the prompt. Define a function called prompt_pure_precustom in your .zshrc (after prompt pure) to set custom prefix and suffix segments on the preprompt line:
psvar[22]— Custom prefix, rendered before all built-in segments.psvar[23]— Custom suffix, rendered after all built-in segments.
The function is called each time the prompt renders (including async redraws), so avoid slow commands. For expensive operations, cache the result in a precmd hook and read the cached value in prompt_pure_precustom.
# .zshrc
# Cache expensive calls in precmd (runs once per command, not on async redraws).
my_kube_context=
my_precmd() {
my_kube_context=$(kubectl config current-context 2>/dev/null)
}
add-zsh-hook precmd my_precmd
prompt_pure_precustom() {
psvar[22]=$my_kube_context
psvar[23]=$(date +%H:%M)
}
The colors can be customized with zstyle:
zstyle :prompt:pure:custom:prefix color cyan
zstyle :prompt:pure:custom:suffix color yellow
Colors
As explained in ZSH's manual, color values can be:
- A decimal integer corresponding to the color index of your terminal. If your
$TERMisxterm-256color, see this chart. - The name of one of the following nine colors:
black,red,green,yellow,blue,magenta,cyan,white, anddefault(the terminal’s default foreground) #followed by an RGB triplet in hexadecimal format, for example#424242. Only if your terminal supports 24-bit colors (true color) or when thezsh/nearcolormodule is loaded.
Colors can be changed by using zstyle with a pattern of the form :prompt:pure:$color_name and style color. The color names, their default, and what part they affect are:
custom:prefix(242) - Custom prefix set viaprompt_pure_precustom.custom:suffix(242) - Custom suffix set viaprompt_pure_precustom.execution_time(yellow) - The execution time of the last command when exceedingPURE_CMD_MAX_EXEC_TIME.git:arrow(cyan) - ForPURE_GIT_UP_ARROWandPURE_GIT_DOWN_ARROW.git:stash(cyan) - ForPURE_GIT_STASH_SYMBOL.git:branch(242) - The name of the current branch when in a Git repository.git:branch:cached(red) - The name of the current branch when the data isn't fresh.git:action(yellow) - The current action in progress (cherry-pick, rebase, etc.) when in a Git repository.git:dirty(218) - The asterisk showing the branch is dirty.host(242) - The hostname when on a remote machine.node_version(green) - The current major Node.js version in directories withpackage.json.path(blue) - The current path, for example,PWD.prompt:error(red) - ThePURE_PROMPT_SYMBOLwhen the previous command has failed.prompt:success(magenta) - ThePURE_PROMPT_SYMBOLwhen the previous command has succeeded.prompt:continuation(242) - The color for showing the state of the parser in the continuation prompt (PS2). It's the pink part in this screenshot, it appears in the same spot asvirtualenv. You could for example matching both colors so that Pure has a uniform look.suspended_jobs(red) - ThePURE_SUSPENDED_JOBS_SYMBOL.user(242) - The username when on remote machine.user:root(default) - The username when the user is root.virtualenv(242) - The name of the Pythonvirtualenvwhen in use.
The following diagram shows where each color is applied on the prompt:
┌──────────────────────────────────────────────────────────────────────── custom:prefix
│ ┌─────────────────────────────────────────────────────────────────── suspended_jobs
│ │ ┌───────────────────────────────────────────────────────────────── user
│ │ │ ┌────────────────────────────────────────────────────────── host
│ │ │ │ ┌────────────────────────────────────────────── path
│ │ │ │ │ ┌─────────────────────────────────── git:branch
│ │ │ │ │ │ ┌────────────────────────────── git:dirty
│ │ │ │ │ │ │ ┌──────────────────────────── git:action
│ │ │ │ │ │ │ │ ┌─────────────────── git:arrow
│ │ │ │ │ │ │ │ │ ┌───────────────── git:stash
│ │ │ │ │ │ │ │ │ │ ┌─────────────── node_version
│ │ │ │ │ │ │ │ │ │ │ ┌─────────── execution_time
│ │ │ │ │ │ │ │ │ │ │ │ ┌────── custom:suffix
│ │ │ │ │ │ │ │ │ │ │ │ │
prefix ✦ zaphod@heartofgold ~/dev/pure main* rebase-i ⇡ ≡ ⬢22 42s suffix
venv ❯
│ │
│ └───────────────────────────────────────────────────────────────────── prompt
└────────────────────────────────────────────────────────────────────────── virtualenv (or prompt:continuation)
Preview
Run prompt_pure_preview to display a sample prompt with all components rendered in their current colors. This is useful for testing color customizations.
RGB colors
There are two ways to use RGB colors with the hexadecimal format. The correct way is to use a terminal that support 24-bit colors and enable this feature as explained in the terminal's documentation.
If you can't use such terminal, the module zsh/nearcolor can be useful. It will map any hexadecimal color to the nearest color in the 88 or 256 color palettes of your terminal, but without using the first 16 colors, since their values can be modified by the user. Keep in mind that when using this module you won't be able to display true RGB colors. It only allows you to specify colors in a more convenient way. The following is an example on how to use this module:
# .zshrc
zmodload zsh/nearcolor
zstyle :prompt:pure:path color '#FF0000'
Example
# .zshrc
autoload -U promptinit; promptinit
# optionally define some options
PURE_CMD_MAX_EXEC_TIME=10
# change the path color
zstyle :prompt:pure:path color white
# change the color for both `prompt:success` and `prompt:error`
zstyle ':prompt:pure:prompt:*' color cyan
# turn on git stash status
zstyle :prompt:pure:git:stash show yes
prompt pure
Tips
In the screenshot you see Pure running in Hyper with the hyper-snazzy theme and Menlo font.
The Tomorrow Night Eighties theme with the Droid Sans Mono font (15pt) is also a nice combination. Just make sure you have anti-aliasing enabled in your terminal.
To have commands colorized as seen in the screenshot, install zsh-syntax-highlighting.
AI coding agents
Most AI coding agents (Claude Code, Codex, …) run commands in a non-interactive shell where Pure's prompt never renders, so its git work never runs there anyway. Agents that render the prompt in an interactive terminal do run it, but you can skip it since git fetch can stall in a sandbox and no human sees the prompt. You can gate git integration on the agent marker environment variables in your .zshrc:
# Just an example. Add whichever markers apply to the agents you use.
# Pull requests to expand this list will not be accepted.
if [[ -n $AI_AGENT$CLAUDECODE$CURSOR_AGENT$GEMINI_CLI$OPENCODE ]]; then
zstyle :prompt:pure:git show no
fi
Integration
oh-my-zsh
- Set
ZSH_THEME=""in your.zshrcto disable oh-my-zsh themes. - Follow the Pure Install instructions.
- Do not enable the following (incompatible) plugins:
vi-mode,virtualenv.
NOTE: oh-my-zsh overrides the prompt so Pure must be activated after source $ZSH/oh-my-zsh.sh.
prezto
Pure is bundled with Prezto. No need to install it.
Add prompt pure to your ~/.zpreztorc.
zim
Add zmodule sindresorhus/pure --source async.zsh --source pure.zsh to your .zimrc and run zimfw install.
sheldon
Add the following to your ~/.config/sheldon/plugins.toml file:
[plugins.pure]
github = "sindresorhus/pure"
use = ["async.zsh", "pure.zsh"]
zplug
Update your .zshrc file with the following two lines:
zplug mafredri/zsh-async, from:github
zplug sindresorhus/pure, use:pure.zsh, from:github, as:theme
zinit
Update your .zshrc file with the following two lines (order matters):
zinit ice compile'(pure|async).zsh' pick'async.zsh' src'pure.zsh'
zinit light sindresorhus/pure
zi
Update your .zshrc file with the following line:
zi light-mode for @sindresorhus/pure
See the ZI wiki for more.
FAQ
Prompt is corrupted when using tab completion
If the prompt displays incorrectly during tab completion (ghost characters, misaligned cursor), your shell is likely missing a UTF-8 locale. Pure uses Unicode characters (like ❯) that require UTF-8 to calculate display width correctly. Add this to your .zshrc:
export LANG=en_US.UTF-8
See FAQ Archive for previous FAQs.
Ports
- ZSH
- therealklanni/purity - More compact current working directory, important details on the main prompt line, and extra Git indicators.
- intelfx/pure - Solarized-friendly colors, highly verbose, and fully async Git integration.
- forivall/pure - A minimal fork which highlights the Git repo's root directory in the path.
- dfurnes/purer - Compact single-line prompt with built-in Vim-mode indicator.
- chabou/pure-now - Fork with Now support.
- pure10k - Configuration file for Powerlevel10k that makes it look like Pure.
- Bash
- sapegin/dotfiles - Prompt and color theme for Terminal.app.
- Fish
- pure-fish/pure - Fully tested Fish port aiming for feature parity.
- Rust
- xcambar/purs - Pure-inspired prompt in Rust.
- Go
- talal/mimir - Pure-inspired prompt in Go with Kubernetes and OpenStack cloud support. Not intended to have feature parity.
- PowerShell
- nickcox/pure-pwsh - PowerShell/PS Core implementation of the Pure prompt.
Team
![]() | ![]() |
|---|---|
| Sindre Sorhus | Mathias Fredriksson |

