# 機能設計書 8-omz plugin disable

## 概要

本ドキュメントは、Oh My Zsh（以下OMZ）のプラグイン無効化機能「omz plugin disable」コマンドに関する機能設計書である。指定プラグインを.zshrcから無効化し、シェルをリロードする処理について記述する。

### 本機能の処理概要

本機能は、ユーザーが指定したプラグインを.zshrcのplugins配列から削除し、シェルをリロードすることで無効化を即座に反映する。

**業務上の目的・背景**：OMZには多数のプラグインが用意されているが、使用しないプラグインはシェル起動時間に影響する。不要になったプラグインを簡単に無効化できる仕組みが必要である。また、問題のあるプラグインを一時的に無効化してトラブルシューティングする用途にも使用される。

**機能の利用シーン**：
- 不要になったプラグインを無効化する時
- プラグインが問題を起こしている時のトラブルシューティング
- シェル起動時間を短縮したい時

**主要な処理内容**：
1. 指定プラグインが有効化されているか確認
2. AWKスクリプトで.zshrcを編集
3. 新しい.zshrcの構文チェック
4. バックアップ作成と置換
5. シェルのリロード

**関連システム・外部連携**：特になし

**権限による制御**：.zshrcファイルへの書き込み権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | omz plugin disable | 主機能 | 指定プラグインを.zshrcから無効化し、シェルをリロード |

## 機能種別

CLI / 設定変更

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| plugin | 文字列 | Yes | 無効化するプラグイン名（複数指定可） | plugins配列に存在すること |

### 入力データソース

- コマンドライン引数
- 現在の$plugins配列
- ~/.zshrcファイル

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| stdout | テキスト | 成功/警告メッセージ |
| stderr | テキスト | エラーメッセージ |
| 戻り値 | 整数 | 0: 成功、1: エラー |

### 出力先

- 標準出力/標準エラー出力
- ~/.zshrc（編集）
- ~/.zshrc.bck（バックアップ）

## 処理フロー

### 処理シーケンス

```
1. 引数チェック
   └─ プラグイン名が指定されているか確認
   └─ 未指定の場合はUsage表示してreturn 1

2. プラグイン有効確認
   └─ 各プラグインが$plugins配列に存在するか確認
   └─ 存在しない場合は警告を出力して次へ
   └─ 有効なプラグインをdis_plugins配列に追加

3. 無効化対象確認
   └─ dis_plugins配列が空の場合はreturn 1

4. AWKスクリプト生成
   └─ 単一行/複数行のplugins=()形式に対応
   └─ プラグイン名を削除するパターンを生成

5. .zshrc編集
   └─ AWKスクリプトで新しい.zshrcを生成
   └─ .zshrc.bckにバックアップ
   └─ 新しい.zshrcで置換

6. 構文チェック
   └─ zsh -nで構文エラーをチェック
   └─ エラー時はバックアップから復元

7. シェルリロード
   └─ インタラクティブセッションの場合のみ
   └─ _omz::reloadを呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[omz plugin disable実行] --> B{引数あり?}
    B -->|No| C[Usage表示・return 1]
    B -->|Yes| D[プラグインループ開始]
    D --> E{plugins配列に存在?}
    E -->|No| F[警告出力・次へ]
    E -->|Yes| G[dis_pluginsに追加]
    F --> H{次のプラグインあり?}
    G --> H
    H -->|Yes| D
    H -->|No| I{dis_plugins空?}
    I -->|Yes| J[return 1]
    I -->|No| K[AWKスクリプト生成]
    K --> L[AWKで.zshrc編集]
    L --> M{編集成功?}
    M -->|No| N[エラー出力・return]
    M -->|Yes| O[.zshrc.bckにバックアップ]
    O --> P[新.zshrcで置換]
    P --> Q{構文チェックOK?}
    Q -->|No| R[バックアップ復元・return 1]
    Q -->|Yes| S[成功メッセージ]
    S --> T{インタラクティブ?}
    T -->|Yes| U[_omz::reload]
    T -->|No| V[完了]
    U --> V
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 引数必須 | プラグイン名の指定が必須 | 常時 |
| BR-02 | 有効プラグインのみ | $plugins配列に存在するプラグインのみ無効化可能 | 常時 |
| BR-03 | 複数プラグイン対応 | 複数のプラグインを一度に無効化可能 | 常時 |
| BR-04 | バックアップ作成 | 編集前に.zshrc.bckを作成 | 常時 |
| BR-05 | 構文チェック | 編集後にzsh -nで構文チェック | 常時 |
| BR-06 | ロールバック | 構文エラー時はバックアップから復元 | エラー時 |
| BR-07 | 自動リロード | インタラクティブセッションでのみリロード | 成功時 |

### 計算ロジック

**プラグイン存在確認**:
```zsh
[[ ${plugins[(Ie)$plugin]} -eq 0 ]]
```
- `(Ie)`: 正確なマッチで配列インデックスを取得
- 0の場合は存在しない

**AWKスクリプトのパターン**:
```awk
gsub(/[ \t]+(plugin1|plugin2)[ \t]+/, " ")   # 前後にスペース
gsub(/[ \t]+(plugin1|plugin2)$/, "")          # 前にスペース、行末
gsub(/^(plugin1|plugin2)[ \t]+/, "")          # 行頭、後にスペース
gsub(/\((plugin1|plugin2)[ \t]+/, "(")        # 開き括弧後
gsub(/[ \t]+(plugin1|plugin2)\)/, ")")        # 閉じ括弧前
gsub(/\((plugin1|plugin2)\)/, "()")           # 括弧のみ
```

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

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 引数なしエラー | プラグイン名未指定 | Usage表示 |
| 1 | プラグイン未有効警告 | 指定プラグインが有効でない | 警告出力して継続 |
| 1 | 無効化対象なし | 有効なプラグインが1つもない | return 1 |
| 1 | 編集エラー | AWK処理失敗 | エラー出力 |
| 1 | 構文エラー | 新.zshrcに構文エラー | バックアップ復元 |

### リトライ仕様

リトライは行わない。構文エラー時は自動的にバックアップから復元。

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

本機能はトランザクションを使用しないが、バックアップ・復元機構でデータ整合性を保護。

## パフォーマンス要件

特になし。ファイル編集処理のため即時完了。

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

- .zshrc編集前に必ずバックアップを作成
- 編集後に構文チェックを行い、不正な内容を防止
- エラー時は自動的に元の状態に復元

## 備考

- 複数プラグインを同時に無効化可能
- plugins配列の形式（単一行/複数行）に両対応
- 無効化されていないプラグインを指定した場合は警告のみ

---

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

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

### 推奨読解順序

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

プラグイン無効化で扱う変数を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | cli.zsh | `lib/cli.zsh` | dis_plugins配列、awk_script変数 |

**読解のコツ**:
- `$plugins`は現在有効なプラグインの配列
- `dis_plugins`は無効化対象のプラグインリスト

#### Step 2: _omz::plugin::disable関数を理解する

プラグイン無効化のメイン処理を理解する。

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

**主要処理フロー**:
- **229-232行目**: 引数チェック
- **235-242行目**: プラグイン有効確認ループ
- **245-247行目**: 無効化対象確認
- **250-261行目**: AWK置換パターン生成
- **264-295行目**: AWKスクリプト本体
- **297-301行目**: AWK実行と.zshrc置換
- **304-308行目**: エラーチェック
- **311-315行目**: 構文チェックとロールバック
- **318行目**: 成功メッセージ
- **321行目**: シェルリロード

#### Step 3: AWKスクリプトを理解する

plugins配列の編集ロジックを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | cli.zsh | `lib/cli.zsh` | 264-295行目のAWKスクリプト |

**主要処理フロー**:
- **266-270行目**: 単一行形式（`plugins=(...)）の処理
- **273-278行目**: 複数行形式の開始検出
- **281-286行目**: 複数行形式の終了検出
- **288-292行目**: 複数行形式の途中行処理

#### Step 4: ロールバック処理を理解する

エラー時の復元処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | cli.zsh | `lib/cli.zsh` | 311-315行目のロールバック処理 |

**主要処理フロー**:
- **311行目**: `zsh -n`で構文チェック
- **312行目**: エラーメッセージ出力
- **313行目**: バックアップから復元

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

```
omz plugin disable <plugin...>
    │
    └─ _omz::plugin::disable()
           │
           ├─ プラグイン有効確認
           │      └─ ${plugins[(Ie)$plugin]}
           │
           ├─ AWKスクリプト生成
           │      └─ awk_subst_plugins (置換パターン)
           │      └─ awk_script (メインスクリプト)
           │
           ├─ awk "$awk_script" "$zshrc"
           │      └─ > "$zdot/.zshrc.new"
           │
           ├─ cp -f "$zshrc" "$zdot/.zshrc.bck"
           │
           ├─ mv -f "$zdot/.zshrc.new" "$zshrc"
           │
           ├─ zsh -n "$zdot/.zshrc" (構文チェック)
           │      └─ 失敗時: mv -f "$zdot/.zshrc.bck" "$zshrc"
           │
           ├─ _omz::log info "plugins disabled: ..."
           │
           └─ _omz::reload (インタラクティブ時)
```

### データフロー図

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

plugin名(引数)        ───▶ 有効確認
                              │
$plugins配列          ───▶ │
                              ▼
~/.zshrc              ───▶ AWKスクリプト実行
                              │
                              ├─▶ ~/.zshrc.bck (バックアップ)
                              │
                              └─▶ ~/.zshrc.new ───────────▶ ~/.zshrc (置換)
                                      │
                                      └─▶ zsh -n (構文チェック)
                                              │
                                              └─▶ _omz::reload
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| cli.zsh | `lib/cli.zsh` | ソース | _omz::plugin::disable関数 |
| .zshrc | `~/.zshrc` | 設定 | 編集対象 |
| .zshrc.bck | `~/.zshrc.bck` | バックアップ | 復元用 |
| .zshrc.new | `~/.zshrc.new` | 一時ファイル | AWK出力先 |
