Shell Prompt Skill
Shell 提示符配置技能
Configure high-performance shell prompts with Powerlevel10k and Zsh Vi Mode.
使用Powerlevel10k和Zsh Vi Mode配置高性能Shell提示符。
Modern shell prompts provide:
- Git status with branch, dirty state, and remote tracking
- Environment indicators (Python venv, Node version, K8s context)
- Execution time for long-running commands
- Exit code visualization
- Async updates for responsive experience
- Vi mode indicators and cursor changes
现代化Shell提示符具备以下特性:
- 包含分支、未提交状态和远程跟踪的Git状态显示
- 环境指示器(Python虚拟环境、Node版本、K8s上下文)
- 长运行命令的执行时间统计
- 退出码可视化展示
- 异步更新确保响应流畅
- Vi模式指示器和光标样式切换
Zsh supports vi-style line editing with visual feedback through cursor changes and mode indicators.
Zsh支持类Vi风格的行编辑,可通过光标变化和模式指示器提供视觉反馈。
Quick Setup (Built-in)
快速配置(内置功能)
bindkey -v # Enable vi mode
Reduce key timeout for faster mode switching (default 400ms)
缩短按键超时时间以加快模式切换(默认400ms)
export KEYTIMEOUT=10 # 100ms - don't go below 10
export KEYTIMEOUT=10 # 100ms - 建议不低于10
Cursor Style by Mode
按模式设置光标样式
Change cursor shape based on current mode:
Add to ~/.zshrc
添加到~/.zshrc
cursor_mode() {
# Beam cursor for insert mode
cursor_beam='\e[6 q'
# Block cursor for normal mode
cursor_block='\e[2 q'
function zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]] ||
[[ $1 = 'block' ]]; then
echo -ne $cursor_block
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]] ||
[[ $1 = 'beam' ]]; then
echo -ne $cursor_beam
fi
}
zle-line-init() {
echo -ne $cursor_beam
}
zle -N zle-keymap-select
zle -N zle-line-init
}
cursor_mode
cursor_mode() {
# 插入模式使用竖线光标
cursor_beam='\e[6 q'
# 普通模式使用方块光标
cursor_block='\e[2 q'
function zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]] ||
[[ $1 = 'block' ]]; then
echo -ne $cursor_block
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]] ||
[[ $1 = 'beam' ]]; then
echo -ne $cursor_beam
fi
}
zle-line-init() {
echo -ne $cursor_beam
}
zle -N zle-keymap-select
zle -N zle-line-init
}
cursor_mode
| Code | Style |
|---|
| Blinking block |
| Steady block |
| Blinking underline |
| Steady underline |
| Blinking bar/beam |
| Steady bar/beam |
| 代码 | 样式 |
|---|
| 闪烁方块 |
| 稳定方块 |
| 闪烁下划线 |
| 稳定下划线 |
| 闪烁竖线 |
| 稳定竖线 |
Oh My Zsh vi-mode Plugin
Oh My Zsh vi-mode 插件
Configuration (before sourcing oh-my-zsh.sh)
配置(在source oh-my-zsh.sh之前)
VI_MODE_SET_CURSOR=true
VI_MODE_RESET_PROMPT_ON_MODE_CHANGE=true
VI_MODE_SET_CURSOR=true
VI_MODE_RESET_PROMPT_ON_MODE_CHANGE=true
Cursor styles (0-6)
光标样式(0-6)
VI_MODE_CURSOR_NORMAL=2 # Solid block
VI_MODE_CURSOR_INSERT=6 # Solid beam
VI_MODE_CURSOR_VISUAL=6 # Solid beam
VI_MODE_CURSOR_OPPEND=0 # Blinking block
VI_MODE_CURSOR_NORMAL=2 # 实心方块
VI_MODE_CURSOR_INSERT=6 # 实心竖线
VI_MODE_CURSOR_VISUAL=6 # 实心竖线
VI_MODE_CURSOR_OPPEND=0 # 闪烁方块
MODE_INDICATOR="%F{red}<<<NORMAL%f"
INSERT_MODE_INDICATOR="%F{green}<<<INSERT%f"
MODE_INDICATOR="%F{red}<<<NORMAL%f"
INSERT_MODE_INDICATOR="%F{green}<<<INSERT%f"
softmoth/zsh-vim-mode
softmoth/zsh-vim-mode
Full-featured vi mode with text objects and surround bindings.
Installation:
功能完整的Vi模式插件,支持文本对象和环绕绑定。
安装:
Source in .zshrc (after other plugins)
在.zshrc中加载(在其他插件之后)
source ~/.zsh/zsh-vim-mode/zsh-vim-mode.plugin.zsh
**Load order matters:** zsh-autosuggestions -> zsh-syntax-highlighting -> zsh-vim-mode
**Configuration:**
```zsh
source ~/.zsh/zsh-vim-mode/zsh-vim-mode.plugin.zsh
**加载顺序很重要:** zsh-autosuggestions -> zsh-syntax-highlighting -> zsh-vim-mode
**配置:**
```zsh
Cursor styles (supports colors!)
光标样式(支持颜色!)
MODE_CURSOR_VIINS="#00ff00 blinking bar"
MODE_CURSOR_VICMD="green block"
MODE_CURSOR_REPLACE="red block"
MODE_CURSOR_SEARCH="#ff00ff steady underline"
MODE_CURSOR_VISUAL="$MODE_CURSOR_VICMD steady bar"
MODE_CURSOR_VLINE="$MODE_CURSOR_VISUAL #00ffff"
MODE_CURSOR_VIINS="#00ff00 blinking bar"
MODE_CURSOR_VICMD="green block"
MODE_CURSOR_REPLACE="red block"
MODE_CURSOR_SEARCH="#ff00ff steady underline"
MODE_CURSOR_VISUAL="$MODE_CURSOR_VICMD steady bar"
MODE_CURSOR_VLINE="$MODE_CURSOR_VISUAL #00ffff"
Mode indicators (auto-added to RPS1 if unset)
模式指示器(如果未设置会自动添加到RPS1)
MODE_INDICATOR_VIINS='%F{15}<%F{8}INSERT>%f'
MODE_INDICATOR_VICMD='%F{10}<%F{2}NORMAL>%f'
MODE_INDICATOR_REPLACE='%F{9}<%F{1}REPLACE>%f'
MODE_INDICATOR_SEARCH='%F{13}<%F{5}SEARCH>%f'
MODE_INDICATOR_VISUAL='%F{12}<%F{4}VISUAL>%f'
MODE_INDICATOR_VLINE='%F{12}<%F{4}V-LINE>%f'
MODE_INDICATOR_VIINS='%F{15}<%F{8}INSERT>%f'
MODE_INDICATOR_VICMD='%F{10}<%F{2}NORMAL>%f'
MODE_INDICATOR_REPLACE='%F{9}<%F{1}REPLACE>%f'
MODE_INDICATOR_SEARCH='%F{13}<%F{5}SEARCH>%f'
MODE_INDICATOR_VISUAL='%F{12}<%F{4}VISUAL>%f'
MODE_INDICATOR_VLINE='%F{12}<%F{4}V-LINE>%f'
VIM_MODE_VICMD_KEY='^[' # Default escape key
VIM_MODE_TRACK_KEYMAP=true # Enable mode tracking
VIM_MODE_INITIAL_KEYMAP=viins # Start in insert mode
**Features:**
- Text objects: `ci"`, `da(`, `vi[`
- Surround: `cs"'` (change surrounding " to ')
- Visual mode selection
- Emacs bindings in insert mode (Ctrl-A, Ctrl-E)
VIM_MODE_VICMD_KEY='^[' # 默认Esc键
VIM_MODE_TRACK_KEYMAP=true # 启用模式跟踪
VIM_MODE_INITIAL_KEYMAP=viins # 启动时进入插入模式
**特性:**
- 文本对象:`ci"`, `da(`, `vi[`
- 环绕操作:`cs"'`(将双引号替换为单引号)
- 可视化模式选择
- 插入模式下支持Emacs绑定(Ctrl-A、Ctrl-E)
jeffreytse/zsh-vi-mode
jeffreytse/zsh-vi-mode
Modern vi mode with operator-pending mode support.
Installation:
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
ZVM_NORMAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK
ZVM_INSERT_MODE_CURSOR=$ZVM_CURSOR_BEAM
ZVM_VISUAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK
ZVM_VISUAL_LINE_MODE_CURSOR=$ZVM_CURSOR_BLOCK
ZVM_OPPEND_MODE_CURSOR=$ZVM_CURSOR_UNDERLINE
ZVM_NORMAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK
ZVM_INSERT_MODE_CURSOR=$ZVM_CURSOR_BEAM
ZVM_VISUAL_MODE_CURSOR=$ZVM_CURSOR_BLOCK
ZVM_VISUAL_LINE_MODE_CURSOR=$ZVM_CURSOR_BLOCK
ZVM_OPPEND_MODE_CURSOR=$ZVM_CURSOR_UNDERLINE
Mode indicator in prompt
提示符中的模式指示器
function zvm_after_select_vi_mode() {
case $ZVM_MODE in
$ZVM_MODE_NORMAL)
# Update prompt for normal mode
;;
$ZVM_MODE_INSERT)
# Update prompt for insert mode
;;
$ZVM_MODE_VISUAL)
# Update prompt for visual mode
;;
esac
}
function zvm_after_select_vi_mode() {
case $ZVM_MODE in
$ZVM_MODE_NORMAL)
# 更新普通模式下的提示符
;;
$ZVM_MODE_INSERT)
# 更新插入模式下的提示符
;;
$ZVM_MODE_VISUAL)
# 更新可视化模式下的提示符
;;
esac
}
Disable cursor style changes (if using another method)
禁用光标样式更改(如果使用其他方法)
ZVM_CURSOR_STYLE_ENABLED=false
ZVM_CURSOR_STYLE_ENABLED=false
Key Bindings Reference
键绑定参考
| Key | Action |
|---|
| or | Enter Normal mode |
| Insert before cursor |
| Append after cursor |
| Insert at line start |
| Append at line end |
| Enter Visual mode |
| Enter Visual Line mode |
| 按键 | 操作 |
|---|
| 或 | 进入普通模式 |
| 在光标前插入 |
| 在光标后追加 |
| 在行首插入 |
| 在行尾追加 |
| 进入可视化模式 |
| 进入可视行模式 |
Navigation (Normal Mode)
导航(普通模式)
| Key | Action |
|---|
| Left/right |
| Down/up in history |
| Forward word |
| Backward word |
| End of word |
| Start of line |
| First non-blank |
| End of line |
| Find char forward |
| Find char backward |
| Till char forward |
| Till char backward |
| 按键 | 操作 |
|---|
| 左/右移动 |
| 向下/向上浏览历史记录 |
| 向前移动一个单词 |
| 向后移动一个单词 |
| 移动到单词末尾 |
| 移动到行首 |
| 移动到行首第一个非空白字符 |
| 移动到行尾 |
| 向前查找指定字符 |
| 向后查找指定字符 |
| 向前移动到指定字符前一位 |
| 向后移动到指定字符后一位 |
Editing (Normal Mode)
编辑(普通模式)
| Key | Action |
|---|
| Delete char |
| Delete line |
| Delete to end |
| Change line |
| Change to end |
| Yank line |
| Paste after/before |
| Undo |
| Redo |
| 按键 | 操作 |
|---|
| 删除光标所在字符 |
| 删除整行 |
| 删除从光标到行尾的内容 |
| 更改整行内容 |
| 更改从光标到行尾的内容 |
| 复制整行 |
| 在光标后/前粘贴 |
| 撤销 |
| 重做 |
| Key | Action |
|---|
| Change inner word |
| Delete a word (with space) |
| Change inside quotes |
| Delete around parens |
| Select inside brackets |
| 按键 | 操作 |
|---|
| 更改当前单词内容 |
| 删除当前单词(包含空格) |
| 更改双引号内的内容 |
| 删除括号内的内容(包含括号) |
| 选中括号内的内容 |
KEYTIMEOUT Considerations
KEYTIMEOUT 注意事项
The
variable affects multi-key sequences:
Default is 40 (400ms)
默认值为40(400ms)
export KEYTIMEOUT=10 # 100ms - good balance
export KEYTIMEOUT=10 # 100ms - 平衡响应速度和兼容性
Too low (<10) breaks multi-key bindings
数值过低(<10)会破坏多键绑定
Too high (>40) feels sluggish on ESC
数值过高(>40)会导致Esc键响应迟缓
**Workarounds for escape delay:**
```zsh
Option 1: Use Ctrl-[ instead of Escape
方案1:使用Ctrl-[ 替代Esc键
(Ctrl-[ sends ESC immediately)
(Ctrl-[ 会立即发送Esc信号)
Option 2: Bind jk or jj to escape
方案2:将jk或jj绑定为Esc键
bindkey -M viins 'jk' vi-cmd-mode
bindkey -M viins 'jj' vi-cmd-mode
bindkey -M viins 'jk' vi-cmd-mode
bindkey -M viins 'jj' vi-cmd-mode
Powerlevel10k
Powerlevel10k
With Oh My Zsh
使用Oh My Zsh
Set in .zshrc
在.zshrc中设置主题
ZSH_THEME="powerlevel10k/powerlevel10k"
ZSH_THEME="powerlevel10k/powerlevel10k"
Run configuration wizard
运行配置向导
Instant Prompt Setup
即时提示符设置
Add at the
very top of
(before anything else):
Enable Powerlevel10k instant prompt
启用Powerlevel10k即时提示符
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
Add at the **end** of `~/.zshrc`:
```zsh
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
在`~/.zshrc`的**最末尾**添加:
```zsh
Source Powerlevel10k config
加载Powerlevel10k配置
[[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh
[[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh
Configuration Options
配置选项
Left prompt segments
左侧提示符段
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
os_icon
dir
vcs
newline
prompt_char
)
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
os_icon
dir
vcs
newline
prompt_char
)
Right prompt segments
右侧提示符段
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
status
command_execution_time
background_jobs
virtualenv
kubecontext
azure
aws
vi_mode # Show vi mode indicator!
context
time
)
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
status
command_execution_time
background_jobs
virtualenv
kubecontext
azure
aws
vi_mode # 显示Vi模式指示器!
context
time
)
Transient prompt (clean up previous prompts)
临时提示符(自动清理之前的提示符)
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always
Directory truncation
目录截断策略
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique
typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=3
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique
typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=3
Vi mode indicator styling
Vi模式指示器样式
typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING=''
typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING='NORMAL'
typeset -g POWERLEVEL9K_VI_MODE_NORMAL_FOREGROUND=0
typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2
typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING=''
typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING='NORMAL'
typeset -g POWERLEVEL9K_VI_MODE_NORMAL_FOREGROUND=0
typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2
Disable slow segments
禁用缓慢的提示符段
typeset -g POWERLEVEL9K_DISABLE_GITSTATUS=false # Keep enabled!
typeset -g POWERLEVEL9K_DISABLE_GITSTATUS=false # 建议保持启用!
Large repo optimization
大型仓库优化
typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=1000
typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=1000
Async git status (default, don't change)
异步Git状态(默认设置,请勿修改)
typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)
typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)
Reduce segment count for speed
减少提示符段数量以提升速度
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time vi_mode)
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time vi_mode)
Benchmark Results (zsh-bench)
基准测试结果(zsh-bench)
| Metric | Target | Powerlevel10k |
|---|
| First prompt lag | <50ms | 24ms |
| Command lag | <10ms | 15ms |
| Git status (small) | <30ms | <10ms |
| Git status (large) | <100ms | Async/instant |
| 指标 | 理想值 | Powerlevel10k |
|---|
| 首次提示符延迟 | <50ms | 24ms |
| 命令执行后延迟 | <10ms | 15ms |
| Git状态查询(小型仓库) | <30ms | <10ms |
| Git状态查询(大型仓库) | <100ms | 异步/即时响应 |
Powerlevel10k (gitstatus daemon):
┌─────────────┐ pipes ┌─────────────┐
│ Zsh │ <============> │ gitstatusd │
│ (prompt) │ │ (C++ daemon)
└─────────────┘ └─────────────┘
│ │
│ async │ keeps state
│ never blocks │ in memory
▼ ▼
Instant prompt Fast git queries
Powerlevel10k(gitstatus 守护进程):
┌─────────────┐ 管道 ┌─────────────┐
│ Zsh │ <============> │ gitstatusd │
│ (提示符) │ │ (C++ 守护进程)
└─────────────┘ └─────────────┘
│ │
│ 异步执行 │ 内存中保持状态
│ 永不阻塞 │
▼ ▼
即时提示符 快速Git查询
Benchmarking Your Setup
基准测试你的配置
Using zsh-bench
使用zsh-bench
Key metrics to watch:
需要关注的关键指标:
- first_prompt_lag_ms: <50ms ideal
- first_prompt_lag_ms: 理想值<50ms
- command_lag_ms: <10ms ideal
- command_lag_ms: 理想值<10ms
TIMEFMT='%*E seconds'
time (for i in {1..10}; do zsh -i -c 'print -P "$PROMPT"' >/dev/null; done)
TIMEFMT='%*E 秒'
time (for i in {1..10}; do zsh -i -c 'print -P "$PROMPT"' >/dev/null; done)
Check segment timing
检查提示符段的执行时间
- git_status in large repos
- 大型仓库中的git_status查询
- python/node version detection
- Python/Node版本检测
- cloud context (aws/azure/gcloud)
- 云环境上下文(aws/azure/gcloud)
P10k: gitstatus Failed
P10k: gitstatus 启动失败
Reinstall gitstatusd
重新安装gitstatusd
rm -rf ~/.cache/gitstatus
rm -rf ~/.cache/gitstatus
Vi Mode Not Working
Vi模式无法正常工作
Verify vi mode is enabled
验证Vi模式是否启用
Check current keymap
检查当前键映射
Cursor Not Changing
光标样式未更改
- Verify terminal supports cursor escape codes
- Check is defined:
whence -f zle-keymap-select
- Some terminals (like Apple Terminal) have limited cursor support
- Try iTerm2 or Alacritty for full support
- 验证终端是否支持光标转义码
- 检查是否已定义:
whence -f zle-keymap-select
- 部分终端(如Apple Terminal)对光标样式支持有限
- 尝试使用iTerm2或Alacritty以获得完整支持
- references/powerlevel10k-config.md - Complete P10k configuration
- references/zsh-vim-mode.md - softmoth/zsh-vim-mode details
- references/performance-tuning.md - Advanced optimization
- references/troubleshooting.md - Common issues and fixes
- references/powerlevel10k-config.md - 完整P10k配置指南
- references/zsh-vim-mode.md - softmoth/zsh-vim-mode 详细说明
- references/performance-tuning.md - 高级性能调优
- references/troubleshooting.md - 常见问题与解决方案