# 画面設計書 6-omz plugin disable

## 概要

本ドキュメントは、Oh My Zshの`omz plugin disable`コマンドインターフェースの画面設計書です。指定されたプラグインを.zshrcから削除して無効化し、シェルセッションをリロードする機能を定義します。

### 本画面の処理概要

`omz plugin disable`コマンドは、指定されたプラグインを.zshrcファイルのplugins配列から削除し、自動的にシェルセッションをリロードしてプラグインを無効化します。複数のプラグインを同時に無効化することも可能です。

**業務上の目的・背景**：プラグインの無効化は、不要になったプラグインの削除、問題のあるプラグインの一時的な停止、シェル起動時間の短縮などの目的で必要となります。手動で.zshrcを編集することなく、安全にプラグインを無効化できる機能を提供します。特に、複数のプラグインを一括で無効化する場合や、正確な記法がわからない場合に有用です。

**画面へのアクセス方法**：ターミナルで以下のコマンドを実行します。
- `omz plugin disable <plugin>` - 単一のプラグインを無効化
- `omz plugin disable <plugin1> <plugin2> ...` - 複数のプラグインを同時に無効化

**主要な操作・処理内容**：
1. 指定されたプラグインが現在有効であることを確認
2. AWKスクリプトを使用して.zshrcのplugins配列からプラグイン名を削除
3. 元の.zshrcを.zshrc.bckとしてバックアップ
4. 新しい.zshrcの構文チェックを実行
5. 構文エラーがあればロールバック
6. 成功した場合、シェルセッションをリロード

**画面遷移**：
- 遷移元：`omz plugin`コマンドから
- 遷移先：処理完了後、`_omz::reload`によりシェルセッションが再起動される

**権限による表示制御**：なし。ただし、.zshrcファイルへの書き込み権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | omzコマンド | 主機能 | omzコマンドの統合CLIインターフェースを通じてプラグインを無効化 |
| 8 | omz plugin disable | 主機能 | 指定プラグインを.zshrcから無効化し、シェルをリロード |
| 17 | omz reload | 補助機能 | プラグイン無効化後にzshセッションをリスタート |

## 画面種別

設定変更（プラグイン無効化）

## URL/ルーティング

```
omz plugin disable <plugin> [...]
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| plugin | string | はい | 無効化するプラグイン名（複数指定可） |

### 出力項目

| 項目名 | 出力先 | 説明 |
|--------|--------|------|
| 成功メッセージ | 標準エラー出力（stderr） | 無効化されたプラグイン名 |
| 警告メッセージ | 標準エラー出力（stderr） | 既に無効なプラグインの通知 |
| エラーメッセージ | 標準エラー出力（stderr） | 処理失敗時のエラー |

## 表示項目

| 項目 | 説明 | 表示形式 |
|------|------|----------|
| 警告：既に無効 | プラグインが既に無効な場合の警告 | `omz plugin disable: plugin '<name>' is not enabled.` |
| 成功：無効化完了 | プラグイン無効化成功時のメッセージ | `omz plugin disable: plugins disabled: <name1>, <name2>, ...` |
| エラー：無効化失敗 | .zshrc更新失敗時のエラー | `omz plugin disable: error disabling plugins.` |
| エラー：構文エラー | .zshrcの構文チェック失敗時 | `omz plugin disable: broken syntax in '~/.zshrc'. Rolling back changes...` |

## イベント仕様

### 1-プラグイン無効化イベント

**トリガー**：`omz plugin disable <plugin> [...]`コマンドの実行

**処理フロー**：
1. 引数の存在を検証
2. 各プラグインについて、現在有効であることを確認（`$plugins`配列をチェック）
3. 無効化対象のプラグインリスト（`$dis_plugins`）を構築
4. AWKスクリプトを生成して.zshrcを更新（プラグイン名を削除）
5. 元の.zshrcを.zshrc.bckにバックアップ
6. 新しい.zshrcの構文チェック（`zsh -n`）
7. 構文エラーがあれば.zshrc.bckからロールバック
8. 成功メッセージを表示
9. インタラクティブセッションの場合、`_omz::reload`を呼び出し

**データの流れ**：
```
ユーザー入力 → 有効確認 → AWKスクリプト生成 → .zshrc更新 → 構文チェック → リロード
```

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| プラグイン無効化 | ~/.zshrc | UPDATE | plugins配列からプラグイン名を削除 |
| バックアップ作成 | ~/.zshrc.bck | INSERT | 元の.zshrcをバックアップ |

### テーブル別更新項目詳細

#### ~/.zshrc

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | plugins=(...) | 指定されたプラグイン名を削除 | 前後の空白、括弧との位置関係を考慮 |

## メッセージ仕様

| メッセージ種別 | メッセージ内容 | 表示条件 |
|---------------|---------------|----------|
| 使用方法 | `Usage: omz plugin disable <plugin> [...]` | プラグイン名が指定されていない場合 |
| 警告 | `plugin '<plugin>' is not enabled.` | 有効でないプラグインを指定した場合 |
| 成功 | `plugins disabled: <plugin1>, <plugin2>, ...` | 無効化成功時 |
| エラー | `error disabling plugins.` | .zshrc更新失敗時 |
| エラー | `broken syntax in '~/.zshrc'. Rolling back changes...` | 構文チェック失敗時 |

## 例外処理

| 例外状態 | 処理内容 | 戻り値 |
|----------|----------|--------|
| 引数なし | 使用方法を表示 | 1 |
| 全プラグインが既に無効 | 警告を表示して終了 | 1 |
| .zshrc更新失敗 | エラーメッセージを表示 | 非0 |
| 構文チェック失敗 | ロールバックしてエラーを表示 | 1 |

## 備考

- AWKスクリプトはgsub関数を使用して、様々なパターンのプラグイン名記述に対応
- スペースの前後、括弧との位置関係、行頭/行末など、8つの異なるパターンで削除を試行
- 複数行形式のplugins配列では、プラグイン名のみの行を完全に削除
- バックアップファイル（.zshrc.bck）は上書きされるため、直前のバックアップのみ保持
- 非インタラクティブセッション（スクリプト実行時など）ではリロードは実行されない

---

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

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

### 推奨読解順序

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

プラグイン無効化機能で使用される主要なデータ構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | cli.zsh | `lib/cli.zsh` | 行235で`dis_plugins`配列（無効化対象リスト）を確認 |
| 1-2 | cli.zsh | `lib/cli.zsh` | 行250-261で`awk_subst_plugins`（置換パターン）を確認 |

**読解のコツ**: `${(j:|:)dis_plugins}`は配列要素を`|`で結合する構文で、AWKの正規表現で複数プラグインを一度に検索できるようにします。

#### Step 2: エントリーポイントを理解する

プラグイン無効化コマンドのエントリーポイントを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | cli.zsh | `lib/cli.zsh` | `_omz::plugin::disable`関数（228-322行目）が処理の本体 |

**主要処理フロー**:
1. **行229-232**: 引数チェック
2. **行234-242**: 有効でないプラグインをスキップしながら`dis_plugins`を構築
3. **行244-247**: 無効化対象がない場合は終了
4. **行249-261**: プラグイン削除用の置換パターン（`awk_subst_plugins`）を生成
5. **行263-295**: AWKスクリプトを生成

#### Step 3: AWKスクリプトの削除ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | cli.zsh | `lib/cli.zsh` | 行250-261で8つの削除パターンを確認 |
| 3-2 | cli.zsh | `lib/cli.zsh` | 行266-270で1行形式の処理を確認 |
| 3-3 | cli.zsh | `lib/cli.zsh` | 行272-291で複数行形式の処理を確認 |

**主要処理フロー**:
- **行251**: 前後にスペースがある場合の削除
- **行252**: 前にスペース、行末の場合の削除
- **行253**: 行頭、後にスペースの場合の削除
- **行255-258**: 括弧との位置関係に応じた削除
- **行288-291**: 複数行形式で、プラグイン削除後に空行になった場合はその行を出力しない

#### Step 4: 構文チェックとリロードを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | cli.zsh | `lib/cli.zsh` | 行311-315で構文チェックとロールバックを確認 |
| 4-2 | cli.zsh | `lib/cli.zsh` | 行320-321でリロード処理を確認 |

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

```
omz plugin disable <plugin> [...]
    │
    └─ _omz::plugin::disable
           │
           ├─ 引数チェック
           │
           ├─ 有効プラグインチェック
           │      └─ $plugins配列を参照
           │
           ├─ awk_subst_plugins生成
           │      └─ 8つの削除パターン
           │             ├─ 前後にスペース
           │             ├─ 前にスペース + EOL
           │             ├─ BOL + 後にスペース
           │             ├─ 括弧との組み合わせ（4パターン）
           │             └─ BOL + 閉じ括弧 / 開き括弧 + EOL
           │
           ├─ AWKスクリプト生成
           │      ├─ 1行形式対応
           │      └─ 複数行形式対応
           │
           ├─ .zshrc更新
           │      ├─ awk実行 → .zshrc.new作成
           │      ├─ cp -f → .zshrc.bck作成
           │      └─ mv -f → .zshrc置換
           │
           ├─ 構文チェック
           │      └─ zsh -n ~/.zshrc
           │
           ├─ [エラー時] ロールバック
           │      └─ mv -f .zshrc.bck → .zshrc
           │
           └─ [成功時] リロード
                  └─ _omz::reload
```

### データフロー図

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

プラグイン名 ───▶ _omz::plugin::disable
                       │
                       ▼
               有効プラグインチェック
                       │
                       ▼
                 dis_plugins配列
                       │
                       ▼
              awk_subst_plugins生成
                       │
                       ├─ gsub(前後スペース)
                       ├─ gsub(前スペース+EOL)
                       ├─ gsub(BOL+後スペース)
                       ├─ gsub(括弧関連4パターン)
                       │
                       ▼
                AWKスクリプト生成 ───▶ awk_script変数
                       │
                       ▼
              ~/.zshrc ───▶ awk ───▶ ~/.zshrc.new
                       │
                       ▼
              ~/.zshrc ───▶ cp ───▶ ~/.zshrc.bck
                       │
                       ▼
              ~/.zshrc.new ───▶ mv ───▶ ~/.zshrc
                       │
                       ▼
                    zsh -n ───▶ 構文チェック
                       │
              ┌────────┴────────┐
              │                 │
          [成功]            [失敗]
              │                 │
              ▼                 ▼
         成功メッセージ    ロールバック
              │                 │
              ▼                 ▼
        _omz::reload      エラーメッセージ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| cli.zsh | `lib/cli.zsh` | ソース | omz plugin disableコマンドの実装 |
| .zshrc | `~/.zshrc` または `$ZDOTDIR/.zshrc` | 設定 | plugins配列の更新対象 |
| .zshrc.bck | `~/.zshrc.bck` または `$ZDOTDIR/.zshrc.bck` | バックアップ | 元の.zshrcのバックアップ |
