# 機能設計書 69-ディレクトリスタック管理

## 概要

本ドキュメントは、Oh My Zshのディレクトリ管理機能におけるディレクトリスタック管理の設計を記載する。この機能は、zshのディレクトリスタック関連オプションを設定し、ディレクトリ間の移動を効率化する。

### 本機能の処理概要

**業務上の目的・背景**：開発作業では複数のディレクトリ間を頻繁に移動する必要がある。この機能は、zshのディレクトリスタック機能を最適化し、`cd -`や`pushd`/`popd`を使わずとも、過去に訪れたディレクトリへの素早いアクセスを可能にする。特に`auto_cd`により、ディレクトリ名だけで移動できるようになり、タイピング量を大幅に削減できる。

**機能の利用シーン**：
- ディレクトリ名を直接入力して移動したい場合（cdを省略）
- 過去に訪れたディレクトリに素早く戻りたい場合
- プロジェクトの複数のディレクトリ間を行き来する場合

**主要な処理内容**：
1. `auto_cd`オプションを有効にする（ディレクトリ名でcd）
2. `auto_pushd`オプションを有効にする（cdでディレクトリをスタックにpush）
3. `pushd_ignore_dups`オプションを有効にする（重複エントリを無視）
4. `pushdminus`オプションを有効にする（-/+の意味を反転）

**関連システム・外部連携**：
- zsh組み込みディレクトリスタック機能
- dirs、pushd、popdコマンド

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | CLIコマンドのため関連画面なし |

## 機能種別

オプション設定 / シェル動作カスタマイズ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | 初期化処理のため入力パラメータなし | - |

### 入力データソース

なし（オプション設定のみ）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| zshオプション | - | 4つのシェルオプションが有効化される |

### 出力先

- zshオプション設定

## 処理フロー

### 処理シーケンス

```
1. auto_cdオプション設定
   └─ setopt auto_cd
2. auto_pushdオプション設定
   └─ setopt auto_pushd
3. pushd_ignore_dupsオプション設定
   └─ setopt pushd_ignore_dups
4. pushdminusオプション設定
   └─ setopt pushdminus
```

### フローチャート

```mermaid
flowchart TD
    A[directories.zsh読み込み] --> B[setopt auto_cd]
    B --> C[setopt auto_pushd]
    C --> D[setopt pushd_ignore_dups]
    D --> E[setopt pushdminus]
    E --> F[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | auto_cd | ディレクトリ名を入力するだけでそのディレクトリに移動 | ディレクトリ名がコマンドとして解釈できない場合 |
| BR-02 | auto_pushd | cdコマンドでディレクトリをスタックに自動プッシュ | cdでディレクトリ変更時 |
| BR-03 | pushd_ignore_dups | 既にスタックにあるディレクトリは重複追加しない | pushd実行時 |
| BR-04 | pushdminus | cd -N の N でスタック位置を指定（pushdのような動作） | cd -N 使用時 |

### 計算ロジック

該当なし

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

該当なし（データベースを使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | エラーは発生しない設計 | - |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- オプション設定のみのため、瞬時に完了

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

- auto_cdにより意図しないディレクトリ移動が発生する可能性があるが、セキュリティリスクは低い

## 備考

- pushdminusオプションにより、`cd -1`で直前のディレクトリではなく、スタックの1番目のディレクトリに移動する
- スタックの上限はデフォルトで設定されていないが、d関数（機能No.71）では上位10件を表示

---

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

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

### 推奨読解順序

#### Step 1: オプション設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | directories.zsh | `lib/directories.zsh` | 1-5行目のオプション設定 |

**主要処理フロー**:
- **1行目**: `# Changing/making/removing directory` - コメント
- **2行目**: `setopt auto_cd` - ディレクトリ名でcd
- **3行目**: `setopt auto_pushd` - cdでスタックにpush
- **4行目**: `setopt pushd_ignore_dups` - 重複を無視
- **5行目**: `setopt pushdminus` - -/+の意味を反転

**読解のコツ**:
- `auto_cd`: `/home/user`と入力すれば`cd /home/user`と同じ
- `auto_pushd`: `cd /tmp`すると`/tmp`がスタックにpushされる
- `pushd_ignore_dups`: 同じディレクトリを何度cdしてもスタックに1つだけ
- `pushdminus`: `cd -2`でスタックの2番目に移動（通常は`cd +2`の動作）

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

```
oh-my-zsh.sh (エントリポイント)
    │
    └─ source lib/directories.zsh
           │
           ├─ setopt auto_cd
           │      └─ ディレクトリ名だけでcd可能に
           │
           ├─ setopt auto_pushd
           │      └─ cd時に自動でスタックにpush
           │
           ├─ setopt pushd_ignore_dups
           │      └─ スタックの重複を防止
           │
           └─ setopt pushdminus
                  └─ -/+の意味を反転
```

### データフロー図

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

                                  setopt auto_cd
ディレクトリ名入力 ────────────▶  (例: /tmp) ────────────────────▶ cd /tmp が実行

                                  setopt auto_pushd
cd コマンド実行 ───────────────▶  スタックにpush ────────────────▶ ディレクトリスタック更新

                                  setopt pushd_ignore_dups
重複ディレクトリ ──────────────▶  重複チェック ─────────────────▶ 追加しない

                                  setopt pushdminus
cd -N コマンド ────────────────▶  スタック参照 ─────────────────▶ N番目のディレクトリに移動
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| directories.zsh | `lib/directories.zsh` | ソース | ディレクトリスタック管理およびディレクトリ関連設定のメイン実装 |
