# 機能設計書 41-履歴設定

## 概要

本ドキュメントは、Oh My Zshの履歴設定機能について、その設計と実装の詳細を記載したものである。この機能は、ZSHのコマンド履歴に関する環境変数とオプションを適切に設定し、ユーザーのコマンド履歴を効率的に管理する。

### 本機能の処理概要

この機能は、ZSHシェルのコマンド履歴機能を最適化するための設定を行う。履歴ファイルのパス、保存するコマンド数、履歴の動作オプションを設定することで、ユーザーの作業効率を向上させる。

**業務上の目的・背景**：コマンドライン作業において、過去に実行したコマンドを再利用することは日常的に行われる。適切な履歴設定により、より多くのコマンドを保存し、セッション間で履歴を共有し、重複を排除することで、ユーザーの生産性を大幅に向上させることができる。デフォルトのZSH設定では履歴サイズが小さく、共有設定も無効であるため、この機能による最適化が重要となる。

**機能の利用シーン**：
- ZSHシェルの起動時に自動的に適用される
- 過去に実行したコマンドを履歴から検索・再実行する場面
- 複数のターミナルセッションを同時に使用し、履歴を共有したい場面
- タイムスタンプ付きで履歴を確認したい場面

**主要な処理内容**：
1. HISTFILEの設定：履歴ファイルのパスを~/.zsh_historyに設定（未設定の場合）
2. HISTSIZEの設定：メモリ上に保持する履歴コマンド数を最低50000に設定
3. SAVEHISTの設定：履歴ファイルに保存するコマンド数を最低10000に設定
4. 履歴オプションの設定：extended_history、hist_expire_dups_first、hist_ignore_dups、hist_ignore_space、hist_verify、share_historyを有効化

**関連システム・外部連携**：特になし。ZSHビルトインの履歴機能を利用する。

**権限による制御**：特になし。全ユーザーに同一の設定が適用される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能は画面を持たず、シェル初期化時に自動適用される |

## 機能種別

設定処理 / 環境変数設定 / シェルオプション設定

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| HISTFILE | 環境変数（文字列） | No | 履歴ファイルのパス | 設定済みの場合はそのまま使用 |
| HISTSIZE | 環境変数（整数） | No | メモリ上の履歴サイズ | 50000未満の場合は50000に設定 |
| SAVEHIST | 環境変数（整数） | No | ファイルへの保存サイズ | 10000未満の場合は10000に設定 |

### 入力データソース

- ユーザーの既存環境変数設定
- .zshrcでの事前設定

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| HISTFILE | 環境変数 | ~/.zsh_historyまたは既存値 |
| HISTSIZE | 環境変数 | 50000以上の値 |
| SAVEHIST | 環境変数 | 10000以上の値 |
| シェルオプション | ZSHオプション | 6つの履歴関連オプション |

### 出力先

- ZSHシェル環境変数
- ZSHシェルオプション

## 処理フロー

### 処理シーケンス

```
1. HISTFILEの確認と設定
   └─ 未設定の場合は$HOME/.zsh_historyを設定

2. HISTSIZEの確認と調整
   └─ 50000未満の場合は50000に設定

3. SAVEHISTの確認と調整
   └─ 10000未満の場合は10000に設定

4. 履歴オプションの有効化
   └─ setoptで6つのオプションを有効化
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{HISTFILE未設定?}
    B -->|Yes| C[HISTFILE=$HOME/.zsh_history]
    B -->|No| D{HISTSIZE < 50000?}
    C --> D
    D -->|Yes| E[HISTSIZE=50000]
    D -->|No| F{SAVEHIST < 10000?}
    E --> F
    F -->|Yes| G[SAVEHIST=10000]
    F -->|No| H[履歴オプション設定]
    G --> H
    H --> I[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-41-1 | 履歴ファイルデフォルト | HISTFILEが未設定の場合のみ$HOME/.zsh_historyを設定 | HISTFILE未設定時 |
| BR-41-2 | 最小メモリ履歴サイズ | HISTSIZEを最低50000に維持 | HISTSIZE < 50000時 |
| BR-41-3 | 最小保存履歴サイズ | SAVEHISTを最低10000に維持 | SAVEHIST < 10000時 |
| BR-41-4 | タイムスタンプ記録 | extended_historyにより各コマンドの実行時刻を記録 | 常時 |
| BR-41-5 | 重複優先削除 | ファイルサイズ超過時は重複コマンドを優先的に削除 | 常時 |
| BR-41-6 | セッション間共有 | share_historyにより複数セッションで履歴を共有 | 常時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | 本機能はデータベースを使用しない |

### テーブル別操作詳細

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | - | 本機能はエラーを発生させない |

### リトライ仕様

該当なし

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

該当なし（ファイルシステム操作は行わず、環境変数とオプション設定のみ）

## パフォーマンス要件

- シェル起動時に即座に実行される軽量な処理
- 処理時間：1ms未満

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

- hist_ignore_spaceオプションにより、スペースで始まるコマンドは履歴に記録されない
  - これにより、機密情報を含むコマンドを履歴から除外可能
- 履歴ファイル（~/.zsh_history）には適切なパーミッション設定が必要

## 備考

- HIST_STAMPS変数と連携し、historyコマンドのタイムスタンプ表示形式を制御できる
- omz_history関数（機能No.40）と連携して動作する

---

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

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

### 推奨読解順序

#### Step 1: 履歴設定の全体像を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | history.zsh | `lib/history.zsh` | 履歴設定の本体。全体で49行と短いため、通読を推奨 |

**読解のコツ**: ZSHの`setopt`コマンドは、シェルオプションを有効化する。各オプションの意味を理解することが重要。

#### Step 2: 環境変数設定部分を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | history.zsh | `lib/history.zsh` | 37-40行目の環境変数設定部分 |

**主要処理フロー**:
1. **38行目**: `[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history"` - HISTFILEが空の場合のみ設定
2. **39行目**: `[ "$HISTSIZE" -lt 50000 ] && HISTSIZE=50000` - 50000未満なら50000に
3. **40行目**: `[ "$SAVEHIST" -lt 10000 ] && SAVEHIST=10000` - 10000未満なら10000に

#### Step 3: シェルオプション設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | history.zsh | `lib/history.zsh` | 42-48行目のsetoptによるオプション設定 |

**主要処理フロー**:
- **43行目**: `setopt extended_history` - タイムスタンプを記録
- **44行目**: `setopt hist_expire_dups_first` - 重複を優先削除
- **45行目**: `setopt hist_ignore_dups` - 連続重複を無視
- **46行目**: `setopt hist_ignore_space` - スペース開始コマンドを無視
- **47行目**: `setopt hist_verify` - 履歴展開後に確認
- **48行目**: `setopt share_history` - セッション間で共有

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

```
oh-my-zsh.sh
    │
    └─ source lib/history.zsh
           │
           ├─ 環境変数設定（HISTFILE, HISTSIZE, SAVEHIST）
           │
           └─ setopt による履歴オプション有効化
```

### データフロー図

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

既存の環境変数              lib/history.zsh               環境変数（設定済み）
・HISTFILE    ───────▶  条件付き設定処理  ───────▶  ・HISTFILE
・HISTSIZE               ・未設定/不足の場合のみ更新        ・HISTSIZE
・SAVEHIST                                              ・SAVEHIST

                                                     シェルオプション
                        setopt実行      ───────▶  ・extended_history
                                                  ・hist_expire_dups_first
                                                  ・hist_ignore_dups
                                                  ・hist_ignore_space
                                                  ・hist_verify
                                                  ・share_history
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| history.zsh | `lib/history.zsh` | ソース | 履歴設定の本体（環境変数設定 + シェルオプション） |
| oh-my-zsh.sh | `oh-my-zsh.sh` | ソース | OMZ初期化時にhistory.zshを読み込む |
| .zsh_history | `~/.zsh_history` | データファイル | 履歴が保存されるファイル（本機能で設定） |
