# 機能設計書 49-mkcd / takedir

## 概要

本ドキュメントは、Oh My Zshのmkcd / takedir機能について、その設計と実装の詳細を記載したものである。この機能は、ディレクトリを作成し、そのディレクトリに自動的に移動する一連の操作を単一のコマンドで実行する。

### 本機能の処理概要

この機能は、`mkdir -p`でディレクトリを作成し、続けて`cd`でそのディレクトリに移動するという2つの操作を1つの関数にまとめたものである。mkcdとtakedirは同一の関数であり、どちらの名前でも呼び出すことができる。

**業務上の目的・背景**：コマンドライン作業において、「ディレクトリを作成してそこに移動する」という操作は非常に頻繁に行われる。通常は`mkdir -p dirname && cd dirname`と入力する必要があるが、本機能により`mkcd dirname`または`takedir dirname`の一コマンドで完結でき、入力の手間とタイプミスのリスクを削減できる。

**機能の利用シーン**：
- 新しいプロジェクトディレクトリを作成して作業を開始する場面
- 一時的な作業ディレクトリを作成してそこで作業する場面
- 深い階層のディレクトリ構造を一度に作成してそこに移動する場面
- テスト用のディレクトリを素早く作成する場面

**主要な処理内容**：
1. 引数として渡されたディレクトリパスを受け取る
2. `mkdir -p`で親ディレクトリを含めてディレクトリを作成
3. 最後の引数のディレクトリに`cd`で移動

**関連システム・外部連携**：
- mkdir コマンド（ディレクトリ作成）
- cd ビルトイン（ディレクトリ移動）

**権限による制御**：ディレクトリ作成には適切な書き込み権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能はCLIコマンドとして動作する |

## 機能種別

ファイルシステム操作 / ユーティリティ関数

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| $1 | 文字列 | Yes | 作成するディレクトリパス | なし |
| $@ | 文字列... | No | 追加のディレクトリパス（複数指定可能） | なし |

### 入力データソース

- コマンドライン引数

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| カレントディレクトリ変更 | - | 最後に指定されたディレクトリに移動 |
| ディレクトリ作成 | ディレクトリ | 指定されたディレクトリ（親含む）が作成される |

### 出力先

- ファイルシステム（新規ディレクトリ）
- シェルの現在のディレクトリ

## 処理フロー

### 処理シーケンス

```
1. 引数の受け取り
   └─ $@で全引数を受け取る

2. ディレクトリ作成
   └─ mkdir -p $@ で全引数のディレクトリを作成

3. ディレクトリ移動
   └─ cd ${@:$#} で最後の引数のディレクトリに移動
```

### フローチャート

```mermaid
flowchart TD
    A[mkcd/takedir実行] --> B[mkdir -p で引数のディレクトリを作成]
    B --> C{作成成功?}
    C -->|Yes| D[cd で最後の引数に移動]
    C -->|No| E[エラー終了]
    D --> F[終了]
    E --> F
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-49-1 | 親ディレクトリ自動作成 | mkdir -pにより親ディレクトリも自動作成 | 常時 |
| BR-49-2 | 最後の引数に移動 | 複数引数の場合は最後の引数のディレクトリに移動 | 常時 |
| BR-49-3 | 既存ディレクトリ対応 | 既存のディレクトリが指定された場合もエラーにならない | 常時 |
| BR-49-4 | エイリアス関係 | mkcdとtakedirは同一関数 | 常時 |

### 計算ロジック

特になし

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

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

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

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 権限エラー | 親ディレクトリへの書き込み権限がない | エラー終了 |
| - | パスエラー | 無効なパス名が指定された | エラー終了 |

### リトライ仕様

該当なし

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

該当なし（mkdir成功後にcd失敗した場合、ディレクトリは作成されたまま）

## パフォーマンス要件

- ローカルファイルシステム操作のため即座に完了

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

- ディレクトリ作成には適切なパーミッションが適用される
- シンボリックリンクの取り扱いに注意

## 備考

- ZSHの関数定義構文`function mkcd takedir()`により、2つの名前で同じ関数を定義
- take関数（機能No.48）のサブ関数としても使用される

---

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

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

### 推奨読解順序

#### Step 1: 関数定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | functions.zsh | `lib/functions.zsh` | 48-51行目のmkcd/takedir関数定義 |

**主要処理フロー**:
1. **48行目**: `# mkcd is equivalent to takedir` - コメント
2. **49行目**: `function mkcd takedir() {` - 2つの名前で同一関数を定義
3. **50行目**: `mkdir -p $@ && cd ${@:$#}` - ディレクトリ作成と移動
4. **51行目**: `}` - 関数終了

**読解のコツ**:
- `function mkcd takedir()`はZSH特有の構文で、mkcdとtakedirの両方の名前で同じ関数を定義
- `$@`は全引数を展開
- `${@:$#}`は最後の引数のみを展開（$#は引数の数）
- `&&`により、mkdirが成功した場合のみcdが実行される

#### Step 2: 引数処理の詳細を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | functions.zsh | `lib/functions.zsh` | 50行目の引数処理 |

**ZSHパラメータ展開の解説**:
- `$@`: すべての引数を個別に展開（"$1" "$2" "$3" ...）
- `$#`: 引数の総数
- `${@:$#}`: 引数のスライス。$#番目（最後）の引数を取得

**使用例**:
```zsh
mkcd foo bar baz
# mkdir -p foo bar baz が実行される（3つのディレクトリ作成）
# cd baz が実行される（最後の引数に移動）
```

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

```
mkcd / takedir 関数
    │
    ├─ mkdir -p $@（外部コマンド）
    │      └─ 全引数のディレクトリを作成（親含む）
    │
    └─ cd ${@:$#}（ZSHビルトイン）
           └─ 最後の引数のディレクトリに移動
```

### データフロー図

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

引数（$@）                 mkcd / takedir                新カレントディレクトリ
    │                            │                            │
    ▼                            ▼                            ▼
ディレクトリパス ───────▶  mkdir -p ───────────▶  ディレクトリ作成
                                  │
                                  ▼
                           cd ${@:$#}
                                  │
                                  ▼
                          最後の引数に移動
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| functions.zsh | `lib/functions.zsh` | ソース | mkcd/takedir関数の定義（49-51行目） |
