mcpField
S
shell-prompt

shell-prompt

github.com/julianobarbosa開発14118 回インストール2 日前に更新
リポジトリ

shell-prompt について

shell-promptは、Zshユーザー向けにPowerlevel10kのプロンプトとViモードの設定を解説するガイドです。プラグインの選択、モードに応じたカーソル表示、トラブルシューティングも扱います。

主な機能

  1. 01Powerlevel10kプロンプトの設定
  2. 02Git状態と環境情報の表示
  3. 03Zsh Viモードとカーソルの設定
  4. 04キータイムアウトとバインドの調整
  5. 05性能とプラグイン読み込みの調査

活用シーン

  1. 01Zshでブランチと環境状態を確認
  2. 02Vi編集モードのカーソル表示を設定
  3. 03プロンプトの起動と更新を高速化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill shell-prompt

インストール後、Claude Code で/shell-promptを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
performance-tuning.md
powerlevel10k-config.md
starship-config.md
troubleshooting.md
zsh-vim-mode.md
scripts/
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
最初のプロンプトの遅延<50ms24ms
コマンドの遅延<10ms15ms
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
カーソルが変化しない
  1. ターミナルがカーソルのエスケープコードをサポートしていることを確認します
  2. zle-keymap-select が定義されていることを確認します:whence -f zle-keymap-select
  3. Apple Terminal など、一部のターミナルではカーソルのサポートが限定されています
  4. 完全なサポートが必要な場合は、iTerm2 または Alacritty をお試しください

参考資料

外部リンク


注意点

  • 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 で確認してください。

コメント