shell-prompt について
shell-promptは、Zshユーザー向けにPowerlevel10kのプロンプトとViモードの設定を解説するガイドです。プラグインの選択、モードに応じたカーソル表示、トラブルシューティングも扱います。
主な機能
- 01Powerlevel10kプロンプトの設定
- 02Git状態と環境情報の表示
- 03Zsh Viモードとカーソルの設定
- 04キータイムアウトとバインドの調整
- 05性能とプラグイン読み込みの調査
活用シーン
- 01Zshでブランチと環境状態を確認
- 02Vi編集モードのカーソル表示を設定
- 03プロンプトの起動と更新を高速化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ julianobarbosa/ claude-code-skills --skill shell-promptインストール後、Claude Code で/shell-promptを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/performance-tuning.mdpowerlevel10k-config.mdstarship-config.mdtroubleshooting.mdzsh-vim-mode.mdscripts/benchmark-prompt.zsh詳細
シェルプロンプトスキル
Powerlevel10k と Zsh Vi Mode で高性能なシェルプロンプトを設定します。
概要
最新のシェルプロンプトでは、次の機能を利用できます。
- ブランチ、変更状態、リモート追跡情報を含む Git ステータス
- 環境インジケーター(Python 仮想環境、Node バージョン、K8s コンテキスト)
- 長時間実行されるコマンドの実行時間
- 終了コードの視覚化
- 応答性を高める非同期更新
- Vi モードインジケーターとカーソルの変更
Zsh Vi Mode
Zsh は、カーソルの変更とモードインジケーターによる視覚的なフィードバックで、vi スタイルの行編集をサポートします。
クイックセットアップ(組み込み)
# ~/.zshrc
bindkey -v # Enable vi mode
# Reduce key timeout for faster mode switching (default 400ms)
export KEYTIMEOUT=10 # 100ms - don't go below 10
モード別のカーソルスタイル
現在のモードに応じてカーソルの形状を変更します。
# Add to ~/.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
カーソルエスケープコード
| コード | スタイル |
|---|---|
\e[1 q | 点滅するブロック |
\e[2 q | 点灯状態のブロック |
\e[3 q | 点滅する下線 |
\e[4 q | 点灯状態の下線 |
\e[5 q | 点滅するバー/ビーム |
\e[6 q | 点灯状態のバー/ビーム |
Vi モードプラグイン
Oh My Zsh vi-mode プラグイン
# ~/.zshrc
plugins=(... vi-mode)
# Configuration (before sourcing oh-my-zsh.sh)
VI_MODE_SET_CURSOR=true
VI_MODE_RESET_PROMPT_ON_MODE_CHANGE=true
# Cursor styles (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
# Mode indicators
MODE_INDICATOR="%F{red}<<<NORMAL%f"
INSERT_MODE_INDICATOR="%F{green}<<<INSERT%f"
softmoth/zsh-vim-mode
テキストオブジェクトとサラウンド操作を備えた、多機能な Vi モードです。
インストール:
# Clone
git clone https://github.com/softmoth/zsh-vim-mode.git ~/.zsh/zsh-vim-mode
# Source in .zshrc (after other plugins)
source ~/.zsh/zsh-vim-mode/zsh-vim-mode.plugin.zsh
読み込み順序が重要です: zsh-autosuggestions -> zsh-syntax-highlighting -> zsh-vim-mode
設定:
# 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 indicators (auto-added to RPS1 if unset)
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'
# Other options
VIM_MODE_VICMD_KEY='^[' # Default escape key
VIM_MODE_TRACK_KEYMAP=true # Enable mode tracking
VIM_MODE_INITIAL_KEYMAP=viins # Start in insert mode
機能:
- テキストオブジェクト:
ci"、da(、vi[ - サラウンド:
cs"'(囲んでいる " を ' に変更) - ビジュアルモードでの選択
- 挿入モードでの Emacs 操作(Ctrl-A、Ctrl-E)
jeffreytse/zsh-vi-mode
オペレーター待機モードに対応した最新の Vi モードです。
インストール:
# With zinit
zinit ice depth=1
zinit light jeffreytse/zsh-vi-mode
# Manual
git clone https://github.com/jeffreytse/zsh-vi-mode.git ~/.zsh/zsh-vi-mode
source ~/.zsh/zsh-vi-mode/zsh-vi-mode.plugin.zsh
設定:
# Cursor styles
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
}
# Disable cursor style changes (if using another method)
ZVM_CURSOR_STYLE_ENABLED=false
キーバインドのリファレンス
モードの切り替え
| キー | 操作 |
|---|---|
ESC または Ctrl-[ | ノーマルモードに入る |
i | カーソルの前に挿入 |
a | カーソルの後に追加 |
I | 行頭に挿入 |
A | 行末に追加 |
v | ビジュアルモードに入る |
V | 行単位のビジュアルモードに入る |
移動(ノーマルモード)
| キー | 操作 |
|---|---|
h/l | 左/右 |
j/k | 履歴内を下/上に移動 |
w/W | 次の単語へ進む |
b/B | 前の単語へ戻る |
e/E | 単語の末尾へ移動 |
0 | 行頭 |
^ | 最初の空白以外の文字 |
$ | 行末 |
f{char} | 前方の文字を検索 |
F{char} | 後方の文字を検索 |
t{char} | 前方の文字の手前まで移動 |
T{char} | 後方の文字の手前まで移動 |
編集(ノーマルモード)
| キー | 操作 |
|---|---|
x | 文字を削除 |
dd | 行を削除 |
D | 行末まで削除 |
cc | 行を変更 |
C | 行末まで変更 |
yy | 行をヤンク |
p/P | 後/前に貼り付け |
u | 元に戻す |
Ctrl-r | やり直す |
テキストオブジェクト
| キー | 操作 |
|---|---|
ciw | 単語の内側を変更 |
daw | 単語を削除(前後の空白を含む) |
ci" | 引用符の内側を変更 |
da( | 括弧とその内側を削除 |
vi[ | 角括弧の内側を選択 |
KEYTIMEOUT に関する注意事項
KEYTIMEOUT 変数は、複数キーのシーケンスに影響します。
# Default is 40 (400ms)
export KEYTIMEOUT=10 # 100ms - good balance
# Too low (<10) breaks multi-key bindings
# Too high (>40) feels sluggish on ESC
エスケープキーの遅延への対処法:
# Option 1: Use Ctrl-[ instead of Escape
# (Ctrl-[ sends ESC immediately)
# Option 2: Bind jk or jj to escape
bindkey -M viins 'jk' vi-cmd-mode
bindkey -M viins 'jj' vi-cmd-mode
Powerlevel10k
インストール
# With Oh My Zsh
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
# Set in .zshrc
ZSH_THEME="powerlevel10k/powerlevel10k"
# Run configuration wizard
p10k configure
Instant Prompt の設定
~/.zshrc の**先頭(ほかの設定より前)**に追加します。
# Enable Powerlevel10k instant prompt
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 の末尾に追加します。
# Source Powerlevel10k config
[[ -f ~/.p10k.zsh ]] && source ~/.p10k.zsh
設定オプション
~/.p10k.zsh の主な設定項目:
# Left prompt segments
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
)
# Transient prompt (clean up previous prompts)
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always
# Directory truncation
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique
typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=3
# Vi mode indicator styling
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!
# Large repo optimization
typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=1000
# Async git status (default, don't change)
typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)
# Reduce segment count for speed
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time vi_mode)
パフォーマンスの概要
ベンチマーク結果(zsh-bench)
| 指標 | 目標 | Powerlevel10k |
|---|---|---|
| 最初のプロンプトの遅延 | <50ms | 24ms |
| コマンドの遅延 | <10ms | 15ms |
| Git ステータス(小規模) | <30ms | <10ms |
| Git ステータス(大規模) | <100ms | 非同期/即時 |
アーキテクチャ
Powerlevel10k(gitstatus デーモン):
┌─────────────┐ pipes ┌─────────────┐
│ Zsh │ <============> │ gitstatusd │
│ (prompt) │ │ (C++ daemon)
└─────────────┘ └─────────────┘
│ │
│ async │ keeps state
│ never blocks │ in memory
▼ ▼
Instant prompt Fast git queries
セットアップのベンチマーク
zsh-bench を使用する
# Install
git clone https://github.com/romkatv/zsh-bench ~/zsh-bench
# Run benchmark
~/zsh-bench/zsh-bench
# Key metrics to watch:
# - first_prompt_lag_ms: <50ms ideal
# - command_lag_ms: <10ms ideal
手動で計測する
# Zsh startup time
time zsh -i -c exit
# Per-command timing
TIMEFMT='%*E seconds'
time (for i in {1..10}; do zsh -i -c 'print -P "$PROMPT"' >/dev/null; done)
トラブルシューティング
プロンプトが遅い
# Check segment timing
zsh -xv # Verbose trace
# Common culprits:
# - git_status in large repos
# - python/node version detection
# - cloud context (aws/azure/gcloud)
P10k:gitstatus の失敗
# Reinstall gitstatusd
rm -rf ~/.cache/gitstatus
# Restart zsh
exec zsh
Vi モードが動作しない
# Verify vi mode is enabled
bindkey -l | grep vi
# Check current keymap
echo $KEYMAP
# Reset bindings
bindkey -v
カーソルが変化しない
- ターミナルがカーソルのエスケープコードをサポートしていることを確認します
zle-keymap-selectが定義されていることを確認します:whence -f zle-keymap-select- Apple Terminal など、一部のターミナルではカーソルのサポートが限定されています
- 完全なサポートが必要な場合は、iTerm2 または Alacritty をお試しください
参考資料
- references/powerlevel10k-config.md - P10k の設定全体
- references/zsh-vim-mode.md - softmoth/zsh-vim-mode の詳細
- references/performance-tuning.md - 高度な最適化
- references/troubleshooting.md - よくある問題と解決方法
外部リンク
- Powerlevel10k: https://github.com/romkatv/powerlevel10k
- softmoth/zsh-vim-mode: https://github.com/softmoth/zsh-vim-mode
- jeffreytse/zsh-vi-mode: https://github.com/jeffreytse/zsh-vi-mode
- Oh My Zsh vi-mode: https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/vi-mode
- zsh-bench: https://github.com/romkatv/zsh-bench
- gitstatus: https://github.com/romkatv/gitstatus
注意点
- P10k の instant prompt は
.zshrcの最上部に、出力を伴う処理より前に必ず配置してください。echoやガードのないcommand -vでも警告が表示され、instant prompt が無効になります。標準出力を生成するコードはすべて instant prompt のブロックより後に移動するか、&>/dev/nullで囲んでください。 KEYTIMEOUT=1にすると、jkでエスケープするような複数キーのバインドが機能しなくなります。 10 未満(100ms)では、zsh はjの後にkが入力された場合と、複数バイトの ESC シーケンスとを区別できません。症状:ノーマルモードでプロンプトにjとkがそのまま入力されます。bindkey -vはそれまでのバインドをすべてリセットします。bindkey -vより前に設定したカスタムバインドは、警告なしに消去されます。まず vi モードを設定し、その後にカスタムのbindkey呼び出しをすべて配置してください。- カーソルのエスケープコード(
\e[6 q)は、パススルーを設定しないと tmux では機能しません。 tmux はデフォルトで DECSCUSR を除去します。.tmux.confにset -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[ q'を追加してください。追加しないとカーソルはブロックのままです。 - gitstatusd はリポジトリごとにキャッシュします。zsh の外部から
git reset --hardを実行すると、プロンプトに古い状態が表示されます。 P10k のデーモンが変更を認識していません。約 2 秒待つか、手動でgit statusを実行するか、p10k reloadを実行して更新を強制してください。 - プラグインの読み込み順:zsh-vim-mode は autosuggestions と syntax-highlighting の後に読み込んでください。 順序を逆にすると、vim-mode が zle ウィジェットを上書きします。カーソル変更の不具合から ESC が機能しない状態まで、さまざまな症状が発生します。
zle -lL | grep widget-nameで確認してください。
コメント
Markdown 対応