pure

sindresorhusMIT活跃维护

极简又好看的 ZSH 提示符,异步渲染不卡输入,能实时显示 Git 分支状态和命令耗时。

Pretty, minimal and fast ZSH prompt

v1.28.4发布于 2026-10-07 13:58 UTC14,465star +2 / 7 天1,005fork同步于 2026-11-10 17:27 UTC

怎么上手

由 README 提炼,执行前请确认
npm install --global pure-prompt
# .zshrc
autoload -U promptinit; promptinit
prompt pure
硬件要求按 README 说明

README 未说明,纯 shell 脚本无 GPU 或显存要求

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

极简快速的 ZSH 提示符,用异步 git 状态和退出码着色让终端清爽不卡顿

极简又好看的 ZSH 提示符,异步渲染不卡输入,能实时显示 Git 分支状态和命令耗时。

核心能力

  • 异步检查 git 分支与未推送/未拉取提交
  • 上条命令失败时提示符变红,超时显示执行耗时
  • 仅在 SSH 或容器中显示用户名与主机名
  • 支持 VI 模式、虚拟环境、nix-shell 与 Node 版本提示
  • 通过 zstyle 与 psvar 钩子自定义颜色和前后缀

容易踩的坑

需 Git 2.15.2+ 与 ZSH 5.2+,且必须用 npm 而非 yarn 安装;若 prompt -l 未列出 pure,需手动把 npm 全局 root 下的 pure-prompt 加入 fpath;git stash 状态、Node 版本、详细脏标记等默认关闭,需额外 zstyle 开启

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v1.28.4
  1. 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 v 54d97f3
    • Fix local BusyBox who login time being detected as a remote address 696d648
    • Fix WARN_CREATE_GLOBAL warnings 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 fetch for some upstreams, SSH setups, and $HOME 634afe7
    • Fix the Git branch for a % in its name and for the user's vcs_info styles 7f55218

    https://github.com/sindresorhus/pure/compare/v1.28.3...v1.28.4

  2. 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

  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

  4. v1.28.12026-05-20 · 2026-05-20 05:43 UTC
    查看更新说明
    • Disable fetch.prune in background git fetch 98ad83a

    https://github.com/sindresorhus/pure/compare/v1.28.0...v1.28.1

  5. 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_precustom d87a4cd
    • 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_preview command 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 base conda 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_DIR and $GIT_WORK_TREE to 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

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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 git branch and whether it's dirty (with a *).
    • Indicates when you have unpushed/unpulled git commits 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

    1. 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"
    
    1. Add the path of the cloned repo to $fpath in $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

    OptionDescriptionDefault value
    PURE_CMD_MAX_EXEC_TIMEThe max execution time of a process before its run time is shown when it exits.5 seconds
    PURE_GIT_PULLPrevents Pure from checking whether the current Git remote has been updated.1
    PURE_GIT_UNTRACKED_DIRTYDo not include untracked files in dirtiness check. Mostly useful on large repos (like WebKit).1
    PURE_GIT_DELAY_DIRTY_CHECKTime in seconds to delay git dirty checking when git status takes > 5 seconds.1800 seconds
    PURE_PROMPT_SYMBOLDefines the prompt symbol.❯
    PURE_PROMPT_VICMD_SYMBOLDefines the prompt symbol used when the vicmd keymap is active (VI-mode).❮
    PURE_SUSPENDED_JOBS_SYMBOLDefines the symbol that indicates that jobs are running in the background. Set to empty to disable.✦
    PURE_GIT_DOWN_ARROWDefines the git down arrow symbol.⇣
    PURE_GIT_UP_ARROWDefines the git up arrow symbol.⇡
    PURE_GIT_STASH_SYMBOLDefines 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 $TERM is xterm-256color, see this chart.
    • The name of one of the following nine colors: black, red, green, yellow, blue, magenta, cyan, white, and default (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 the zsh/nearcolor module 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 via prompt_pure_precustom.
    • custom:suffix (242) - Custom suffix set via prompt_pure_precustom.
    • execution_time (yellow) - The execution time of the last command when exceeding PURE_CMD_MAX_EXEC_TIME.
    • git:arrow (cyan) - For PURE_GIT_UP_ARROW and PURE_GIT_DOWN_ARROW.
    • git:stash (cyan) - For PURE_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 with package.json.
    • path (blue) - The current path, for example, PWD.
    • prompt:error (red) - The PURE_PROMPT_SYMBOL when the previous command has failed.
    • prompt:success (magenta) - The PURE_PROMPT_SYMBOL when 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 as virtualenv. You could for example matching both colors so that Pure has a uniform look.
    • suspended_jobs (red) - The PURE_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 Python virtualenv when 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

    1. Set ZSH_THEME="" in your .zshrc to disable oh-my-zsh themes.
    2. Follow the Pure Install instructions.
    3. 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

    Team

    Sindre SorhusMathias Fredriksson
    Sindre SorhusMathias Fredriksson