# 機能設計書 84-デフォルトキーバインド設定

## 概要

本ドキュメントは、Doom Emacsにおけるデフォルトキーバインド設定機能（`modules/config/default/`）の設計を記述する。この機能は、Evil（Vim）およびEmacs両方のキーバインド体系を提供し、smartparens連携、OS固有の修正、リーダーキー体系によるコマンドアクセスを実現する。

### 本機能の処理概要

**業務上の目的・背景**：Emacsの膨大な機能にアクセスするためには、効率的なキーバインド体系が不可欠である。本機能は、Vimユーザー向けのEvil統合キーバインドとEmacsネイティブユーザー向けのキーバインドを別々に提供し、両者が快適に作業できる環境を構築する。SpaceキーまたはC-cをリーダーキーとしたモダンなキーバインド体系により、機能を階層的に整理し、発見性を高めている。

**機能の利用シーン**：
- 日常のコーディング作業でのキーバインド利用
- ファイル・バッファ・ウィンドウ操作
- 検索・置換・ジャンプ操作
- Git/バージョン管理操作
- プロジェクト管理操作
- コード補完・診断・フォーマット操作

**主要な処理内容**：
1. Evilキーバインド（+evil-bindings.el）: SPC-leader体系、motion/insert/normal状態別キーバインド
2. Emacsキーバインド（+emacs-bindings.el）: C-c leader体系、標準Emacs互換キーバインド
3. Smartparens設定: 自動ペア挿入、言語別カスタマイズ
4. OS固有修正: macOSのCommand+キー、Linux対応
5. ヘルプキー拡張: Doom固有のヘルプコマンド追加
6. ミニバッファキーバインド: 補完フレームワーク連携

**関連システム・外部連携**：
- Evil: Vimエミュレーション
- Smartparens: 自動括弧ペア
- 各補完フレームワーク: Vertico、Ivy、Helm、Corfu、Company
- projectile: プロジェクト管理
- magit: Git統合
- LSP: 言語サーバー連携

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| N/A | 全画面 | 共通機能 | すべての画面で使用されるキーバインド定義 |

## 機能種別

設定・カスタマイズ / キーバインド管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +default-want-RET-continue-comments | boolean | No | RETでコメント継続するか（デフォルト: t） | t または nil |
| +default-minibuffer-maps | list | No | ミニバッファ用キーマップリスト | キーマップシンボルリスト |
| doom-leader-key | string | No | リーダーキー（Evilデフォルト: "SPC"） | キーシーケンス |
| doom-leader-alt-key | string | No | 代替リーダーキー（Emacsデフォルト: "C-c"） | キーシーケンス |
| doom-localleader-key | string | No | ローカルリーダーキー | キーシーケンス |
| doom-localleader-alt-key | string | No | 代替ローカルリーダーキー（デフォルト: "C-c l"） | キーシーケンス |

### 入力データソース

- ユーザーキー入力
- モジュールフラグ（+bindings、+smartparens、+gnupg）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| キーマップ | keymap | 各モード・状態のキーバインド定義 |

### 出力先

- グローバルキーマップ
- モード固有キーマップ
- Evil状態固有キーマップ

## 処理フロー

### 処理シーケンス

```
1. モジュールロード
   └─ config.el読み込み
2. 基本設定適用
   └─ avy設定、smartparens設定
3. OS固有設定適用
   └─ macOS: Command+キーバインド
4. ヘルプキー拡張
   └─ help-mapにDoom固有コマンド追加
5. Evilまたはemacsバインディング読み込み
   └─ +evil-bindings.el または +emacs-bindings.el
6. 補完フレームワーク連携設定
   └─ corfu/company/ivy/helm/vertico キーバインド
```

### フローチャート

```mermaid
flowchart TD
    A[モジュールロード] --> B[config.el読み込み]
    B --> C{+smartparens有効?}
    C -->|Yes| D[smartparens設定]
    C -->|No| E[スキップ]
    D --> F{+gnupg有効?}
    E --> F
    F -->|Yes| G[GPG/authinfo設定]
    F -->|No| H[スキップ]
    G --> I[ヘルプキー拡張]
    H --> I
    I --> J{+bindings有効?}
    J -->|Yes| K[共通キーバインド設定]
    J -->|No| L[最小設定]
    K --> M{Evil有効?}
    L --> N[終了]
    M -->|Yes| O[+evil-bindings.el読み込み]
    M -->|No| P[+emacs-bindings.el読み込み]
    O --> Q[リーダーキー体系設定]
    P --> R[C-cリーダー体系設定]
    Q --> N
    R --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | リーダーキー分離 | Evil使用時はSPC、Emacs使用時はC-cをリーダーキーとする | 常時 |
| BR-02 | コメント継続 | RETキーでコメント行を継続する | +default-want-RET-continue-comments有効時 |
| BR-03 | バックスペース拡張 | BSキーでsmartparens連携した削除を行う | smartparens有効時 |
| BR-04 | macOSキー修正 | Command+キーでOS標準操作を模倣 | macOS環境 |
| BR-05 | qで終了 | tabulated-list-mode等でqキーでウィンドウを閉じる | 該当モード |

### 計算ロジック

特になし

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

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

本機能はデータベースを操作しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | キーコンフリクト | 同じキーに複数のコマンドがバインド | 後から定義されたものが優先 |
| N/A | 未定義関数参照 | バインド先関数が存在しない | 該当モジュールの有効化を確認 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- キーバインド処理: 即時応答
- autoload関数: 初回呼び出し時にロード

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

- +gnupg flag使用時、authinfo.gpgでパスワード管理
- epa-file-encrypt-toで暗号化キー指定

## 備考

- Evil統合時はSPC uでuniversal-argument（C-uの代替）
- which-keyによりリーダーキー後のキーヒントが表示される
- ローカルリーダーキー（SPC m/C-c l）はモード固有コマンド用
- drag-stuff、expand-regionはEmacs mode時に有効

---

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

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

### 推奨読解順序

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

設定変数とキーマップリストを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/config/default/config.el` | defvar定義（3-20行目） |

**読解のコツ**:
- `+default-want-RET-continue-comments`: RETのコメント継続機能の有効/無効
- `+default-minibuffer-maps`: 各種ミニバッファキーマップのリスト
- 補完フレームワークに応じて動的にキーマップが追加される

#### Step 2: 基本設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/config/default/config.el` | avy設定（26-31行目） |
| 2-2 | config.el | `modules/config/default/config.el` | GPG設定（34-63行目） |
| 2-3 | config.el | `modules/config/default/config.el` | woman設定（66-78行目） |

**主要処理フロー**:
- **26-31行目**: avyの基本設定（全ウィンドウ対象外、背景表示等）
- **34-63行目**: +gnupg flag時のauth-sources設定とGPGキー選択
- **66-78行目**: womanコマンドのmanpath設定

#### Step 3: Smartparens設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/config/default/config.el` | smartparens設定（84-255行目） |

**主要処理フロー**:
- **93-96行目**: sp-navigate-skip-matchの無効化（パフォーマンス向上）
- **100-104行目**: クォート文字のペアルール
- **110-118行目**: 括弧類のペアルールとRET/SPC後の処理
- **124-129行目**: ruby-mode固有設定
- **143-178行目**: C/C++モードの角括弧テンプレート対応
- **180-199行目**: コメントブロック展開設定
- **208-229行目**: Markdown向け設定
- **232-247行目**: Haskell向け設定
- **249-255行目**: Python向け設定（f-strings対応）

#### Step 4: キーバインド修正を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/config/default/config.el` | delete-backward-char advice（274行目） |
| 4-2 | config.el | `modules/config/default/config.el` | newline-and-indent advice（286-295行目） |
| 4-3 | config.el | `modules/config/default/config.el` | macOS固有設定（305-357行目） |

**主要処理フロー**:
- **274行目**: delete-backward-charをsmartparens対応にオーバーライド
- **286-295行目**: RETでコメント継続機能を追加
- **305-357行目**: macOSのCommand+キーでOS標準操作を模倣

#### Step 5: ヘルプキー拡張を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | config.el | `modules/config/default/config.el` | help-map拡張（365-440行目） |

**主要処理フロー**:
- **367行目**: doom/describe-char
- **386-389行目**: doom/reload系コマンド
- **403-421行目**: Doom固有ヘルプ（dプレフィックス）
- **436行目**: doom/help-packages

#### Step 6: Evilキーバインドを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 6-1 | +evil-bindings.el | `modules/config/default/+evil-bindings.el` | ミニバッファ設定（3-34行目） |
| 6-2 | +evil-bindings.el | `modules/config/default/+evil-bindings.el` | スマートタブ（40-96行目） |
| 6-3 | +evil-bindings.el | `modules/config/default/+evil-bindings.el` | リーダーキー体系（337-880行目） |

**主要処理フロー**:
- **3-34行目**: ミニバッファでのEvil操作（C-j/C-k移動等）
- **40-96行目**: Tabキーのコンテキスト依存動作
- **337-361行目**: トップレベルリーダーキー（;, :, x, X等）
- **366-392行目**: TABプレフィックス（ワークスペース）
- **395-427行目**: bプレフィックス（バッファ）
- **430-470行目**: cプレフィックス（コード）
- **501-522行目**: fプレフィックス（ファイル）
- **524-579行目**: gプレフィックス（Git）
- **619-680行目**: nプレフィックス（ノート）
- **682-747行目**: oプレフィックス（オープン）
- **749-774行目**: pプレフィックス（プロジェクト）
- **809-847行目**: sプレフィックス（検索）
- **849-880行目**: tプレフィックス（トグル）

#### Step 7: Emacsキーバインドを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 7-1 | +emacs-bindings.el | `modules/config/default/+emacs-bindings.el` | リーダー設定（4-10行目） |
| 7-2 | +emacs-bindings.el | `modules/config/default/+emacs-bindings.el` | C-cプレフィックス体系（22-470行目） |

**主要処理フロー**:
- **4-5行目**: doom-leader-alt-keyを"C-c"に設定
- **8-10行目**: persp-modeとprojectileのプレフィックス設定
- **22-470行目**: Evilキーバインドと同等の機能をC-cプレフィックスで提供

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

```
modules/config/default/config.el
    │
    ├─ smartparens設定
    │      └─ sp-pair, sp-local-pair
    │
    ├─ help-map拡張
    │      └─ define-key!
    │
    └─ +bindings分岐
           │
           ├─ (evil有効) +evil-bindings.el
           │      ├─ map! (リーダーキー体系)
           │      └─ define-key!
           │
           └─ (evil無効) +emacs-bindings.el
                  ├─ map! :leader
                  └─ projectile-command-map
```

### データフロー図

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

ユーザーキー入力 ──────────┐
                          │
モジュールフラグ ─────────┼──▶ config.el ──────────────▶ キーマップ定義
(+bindings等)             │       │
                          │       ├──▶ +evil-bindings.el ──▶ Evilキーマップ
doom-leader-key ──────────┘       │
                                  └──▶ +emacs-bindings.el ──▶ Emacsキーマップ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/config/default/config.el` | ソース | メイン設定ファイル |
| +evil-bindings.el | `modules/config/default/+evil-bindings.el` | ソース | Evilキーバインド定義 |
| +emacs-bindings.el | `modules/config/default/+emacs-bindings.el` | ソース | Emacsキーバインド定義 |
| autoload/default.el | `modules/config/default/autoload/default.el` | ソース | ユーティリティ関数 |
| autoload/files.el | `modules/config/default/autoload/files.el` | ソース | ファイル操作関数 |
| autoload/search.el | `modules/config/default/autoload/search.el` | ソース | 検索関連関数 |
| autoload/text.el | `modules/config/default/autoload/text.el` | ソース | テキスト操作関数 |
| autoload/deferred.el | `modules/config/default/autoload/deferred.el` | ソース | 遅延ロード関数 |
| packages.el | `modules/config/default/packages.el` | 設定 | 依存パッケージ |
