# 機能設計書 87-プロンプト

## 概要

本ドキュメントは、Nushellのプロンプト機能（NushellPrompt）の設計について記述する。この機能は、対話型シェルにおけるカスタマイズ可能なプロンプト表示を提供し、左右プロンプト、各種モードインジケーター、複数行インジケーターなどを管理する。

### 本機能の処理概要

NushellPromptは、reedlineのPromptトレイトを実装し、シェルプロンプトの各種要素（左プロンプト、右プロンプト、モードインジケーター、複数行インジケーター等）を提供する。ユーザーがconfig.nuやenv.nuで定義したカスタムプロンプト関数の結果を反映し、Vi/Emacsモードに応じたインジケーター表示を行う。

**業務上の目的・背景**：プロンプトはシェルの「顔」であり、ユーザーのカスタマイズ欲求が高い部分である。現在のディレクトリ、Gitブランチ、実行時間、エラー状態など、様々な情報をプロンプトに表示したいというニーズがある。柔軟なカスタマイズ機能を提供することで、ユーザーの作業効率と満足度を向上させる。

**機能の利用シーン**：REPLの各イテレーションでプロンプトが表示される。また、ユーザーがプロンプト設定を変更した際に即座に反映される。

**主要な処理内容**：
1. プロンプト文字列の保持と更新
2. 左プロンプト/右プロンプトのレンダリング
3. Vi/Emacsモードに応じたインジケーター選択
4. 複数行入力時のインジケーター表示
5. 履歴検索時のインジケーター表示
6. 改行文字の変換（\n -> \r\n）

**関連システム・外部連携**：reedline（プロンプトUI）、prompt_update.rs（プロンプト更新処理）

**権限による制御**：なし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインREPL | 補助機能 | カスタマイズ可能なプロンプト表示（左右・vi mode対応） |

## 機能種別

表示機能 / カスタマイズ機能

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| left_prompt_string | Option<String> | No | 左プロンプト文字列 | - |
| right_prompt_string | Option<String> | No | 右プロンプト文字列 | - |
| prompt_indicator_string | Option<String> | No | 通常モードインジケーター | - |
| prompt_vi_insert_string | Option<String> | No | Vi挿入モードインジケーター | - |
| prompt_vi_normal_string | Option<String> | No | Vi通常モードインジケーター | - |
| prompt_multiline_indicator_string | Option<String> | No | 複数行インジケーター | - |
| render_right_prompt_on_last_line | bool | No | 右プロンプトを最終行にのみ表示 | - |

### 入力データソース

- prompt_update::update_promptから更新される
- ユーザー設定（env.nu, config.nu）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| prompt_left | Cow<str> | 左プロンプト文字列 |
| prompt_right | Cow<str> | 右プロンプト文字列 |
| prompt_indicator | Cow<str> | モードインジケーター |
| prompt_multiline | Cow<str> | 複数行インジケーター |
| prompt_history_search | Cow<str> | 履歴検索インジケーター |

### 出力先

reedlineプロンプトシステム

## 処理フロー

### 処理シーケンス

```
1. プロンプト更新
   └─ update_all_prompt_stringsで各要素を設定
2. 左プロンプトレンダリング
   └─ render_prompt_left()で左プロンプトを返却
3. 右プロンプトレンダリング
   └─ render_prompt_right()で右プロンプトを返却
4. インジケーターレンダリング
   └─ edit_modeに応じたインジケーターを選択
5. 複数行インジケーター
   └─ render_prompt_multiline_indicator()を返却
```

### フローチャート

```mermaid
flowchart TD
    A[プロンプト更新要求] --> B[update_all_prompt_strings]
    B --> C[各プロンプト要素を保持]
    C --> D[REPLイテレーション]
    D --> E[render_prompt_left]
    E --> F{カスタム設定あり?}
    F -->|Yes| G[カスタム文字列返却]
    F -->|No| H[DefaultPrompt使用]
    D --> I[render_prompt_indicator]
    I --> J{edit_mode}
    J -->|Emacs| K[prompt_indicator使用]
    J -->|Vi Insert| L[vi_insert_indicator使用]
    J -->|Vi Normal| M[vi_normal_indicator使用]
    J -->|Custom| N[ラップして返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-87-01 | デフォルト左プロンプト | 未設定時はDefaultPromptを使用 | left_prompt未設定時 |
| BR-87-02 | デフォルトインジケーター | Emacs/Default: "> "、Vi Insert: ": "、Vi Normal: "> " | 各モード未設定時 |
| BR-87-03 | デフォルト複数行 | 未設定時は"::: " | multiline未設定時 |
| BR-87-04 | 改行変換 | \nを\r\nに変換（Windows対応） | 常時 |
| BR-87-05 | 右プロンプト位置 | render_right_prompt_on_last_lineで最終行のみ表示を制御 | 複数行入力時 |

### 計算ロジック

特になし

## データベース操作仕様

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | プロンプト関数実行エラー | デフォルトプロンプトを使用 |

### リトライ仕様

該当なし

## トランザクション仕様

該当なし

## パフォーマンス要件

- プロンプト表示は即座に行う
- カスタムプロンプト関数の実行は最小限に

## セキュリティ考慮事項

特になし

## 備考

- Windowsではenable_vt_processingを呼び出し
- OSCマーカーはprompt自体には埋め込まない（reedlineのSemanticMarkersで処理）

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

プロンプトで使用する主要な構造体を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | prompt.rs | `crates/nu-cli/src/prompt.rs` | NushellPrompt構造体 |

**読解のコツ**:
- **11-19行目**: NushellPrompt構造体（各プロンプト要素をOption<String>で保持）
- **21-86行目**: 各要素の更新メソッド

#### Step 2: Promptトレイト実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | prompt.rs | `crates/nu-cli/src/prompt.rs` | Promptトレイト実装 |

**主要処理フロー**:
1. **88-105行目**: render_prompt_left - 左プロンプト
2. **107-118行目**: render_prompt_right - 右プロンプト
3. **120-132行目**: render_prompt_indicator - モードインジケーター
4. **134-141行目**: render_prompt_multiline_indicator - 複数行インジケーター
5. **143-156行目**: render_prompt_history_search_indicator - 履歴検索

#### Step 3: プロンプト更新処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | prompt_update.rs | `crates/nu-cli/src/prompt_update.rs` | update_prompt関数 |

**読解ポイント**:
- ユーザー定義のプロンプト関数を評価
- 結果をNushellPromptに設定

### プログラム呼び出し階層図

```
REPLループ
    │
    ├─ prompt_update::update_prompt()
    │      │
    │      └─ NushellPrompt::update_all_prompt_strings()
    │
    └─ line_editor.read_line(nu_prompt)
           │
           └─ [reedline内部]
                  │
                  ├─ NushellPrompt::render_prompt_left()
                  ├─ NushellPrompt::render_prompt_right()
                  └─ NushellPrompt::render_prompt_indicator()
```

### データフロー図

```
[入力]               [処理]                              [出力]

ユーザー設定 ───▶ update_prompt ───▶ NushellPrompt ───▶ 表示文字列
  $env.PROMPT_COMMAND    評価           保持              "> pwd"
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| prompt.rs | `crates/nu-cli/src/prompt.rs` | ソース | NushellPrompt構造体とPromptトレイト実装 |
| prompt_update.rs | `crates/nu-cli/src/prompt_update.rs` | ソース | プロンプト更新処理 |
