# 機能設計書 14-ウィンドウ操作(SPC w)

## 概要

本ドキュメントは、space-vimにおけるウィンドウ操作機能（SPC w）の設計仕様を記述する。SPCキーに続いて「w」を押下することで、ウィンドウの分割、移動、リサイズなどのウィンドウ関連操作を提供する機能である。

### 本機能の処理概要

ウィンドウ操作機能は、Vimの画面を複数のウィンドウに分割して効率的に作業するためのキーバインディング群を提供する。hjklキーによるウィンドウ間移動、-|キーによる分割、HJKLキーによるリサイズなど、直感的な操作を実現する。

**業務上の目的・背景**：プログラミング作業では、ソースコードとヘッダファイル、テストファイルと実装ファイル、複数の関連ファイルを同時に表示したいことが多い。ウィンドウ分割機能により、複数ファイルの同時表示と効率的な作業が可能となる。標準Vimのウィンドウ操作（Ctrl-w系）は覚えにくいが、SPC wプレフィックスでより直感的な操作を提供する。

**機能の利用シーン**：
- 複数ファイルを並べて比較・編集する場合
- ソースコードとドキュメントを同時に表示する場合
- ウィンドウ間を素早く移動したい場合
- ウィンドウサイズを調整したい場合

**主要な処理内容**：
1. SPC w h/j/k/l：ウィンドウ間移動（左/下/上/右）
2. SPC w -/|/s/v：ウィンドウ分割（水平/垂直）
3. SPC w H/J/K/L：ウィンドウリサイズ（拡張方向）
4. SPC w d：現在のウィンドウを閉じる
5. SPC w o：他のウィンドウをすべて閉じる
6. SPC w =：ウィンドウサイズを均等化
7. SPC w w：vim-choosewinによるウィンドウ選択
8. SPC 1-9：ウィンドウ番号による直接移動

**関連システム・外部連携**：
- vim-choosewin：ビジュアルウィンドウ選択
- fzf.vim：ウィンドウ一覧表示（SPC w ?）

**権限による制御**：本機能に権限制御は存在しない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 4 | FZF（ファジーファインダー） | 補助機能 | SPC w ? でウィンドウ一覧表示 |

## 機能種別

ウィンドウ管理 / ナビゲーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| キーシーケンス | String | Yes | SPC w に続くキー入力 | 定義済みキーのみ受付 |
| ウィンドウ番号 | Number | No | SPC 1-9の数字キー | 存在するウィンドウ番号 |

### 入力データソース

- ユーザーキー入力
- Vimウィンドウリスト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ウィンドウ移動 | Vim状態 | アクティブウィンドウの変更 |
| ウィンドウ分割 | Vim状態 | 新規ウィンドウの作成 |
| ウィンドウリサイズ | Vim状態 | ウィンドウサイズの変更 |

### 出力先

- Vimウィンドウ空間

## 処理フロー

### 処理シーケンス

```
1. SPC w キー入力
   └─ which-keyによるサブキー一覧表示
2. サブキー入力に応じた処理分岐
   ├─ h/j/k/l: ウィンドウ移動（wincmd h/j/k/l）
   ├─ H/J/K/L: ウィンドウリサイズ
   ├─ -/s:     水平分割（:split）
   ├─ |/v:     垂直分割（:vsplit）
   ├─ d:       ウィンドウ削除（:close）
   ├─ o:       他ウィンドウ削除（:only）
   ├─ =:       サイズ均等化（wincmd =）
   ├─ w:       vim-choosewin起動
   └─ ?:       fzfウィンドウ一覧
```

### フローチャート

```mermaid
flowchart TD
    A[SPC w 入力] --> B{サブキー?}
    B -->|h/j/k/l| C[ウィンドウ移動]
    B -->|H/J/K/L| D[ウィンドウリサイズ]
    B -->|-/s| E[水平分割]
    B -->||/v| F[垂直分割]
    B -->|d| G[ウィンドウ削除]
    B -->|o| H[他ウィンドウ削除]
    B -->|=| I[サイズ均等化]
    B -->|w| J[choosewin起動]
    B -->|?| K[fzfウィンドウ一覧]
    C --> L[移動完了]
    D --> M[リサイズ完了]
    E --> N[分割完了]
    F --> N
    G --> O[削除完了]
    H --> O
    I --> P[均等化完了]
    J --> Q{選択?}
    Q -->|Yes| L
    Q -->|No| R[キャンセル]
    K --> Q
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | hjkl移動 | hjklキーでウィンドウ間を移動 | SPC w h/j/k/l 入力時 |
| BR-002 | HJKL拡張 | HJKLキーでウィンドウを拡張 | SPC w H/J/K/L 入力時 |
| BR-003 | 番号直接移動 | SPC 1-9でウィンドウ番号を直接指定 | SPC 1-9 入力時 |
| BR-004 | 分割方向 | -/sは水平、|/vは垂直分割 | SPC w -/s または |/v 入力時 |

### 計算ロジック

該当なし

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| E444 | ウィンドウ削除エラー | 最後のウィンドウを閉じようとした | エラーメッセージ表示 |
| - | 存在しないウィンドウ | 指定番号のウィンドウが存在しない | 何も起こらない |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- ウィンドウ操作は即時実行
- vim-choosewinオーバーレイ表示は50ミリ秒以内

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

該当なし

## 備考

- ウィンドウ番号は画面左上から順に割り当てられる
- vim-choosewinを使用すると、視覚的にウィンドウを選択可能

---

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

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

### 推奨読解順序

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

ウィンドウ操作のキーマッピング定義を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | leader.vim | `core/autoload/spacevim/map/leader.vim` | s:leader_map['w']の構造を理解 |

**読解のコツ**: ウィンドウ操作は辞書形式で定義。'name'キーが'+windows'を示す。

**主要データ構造**:
- **181行目**: `let s:leader_map['w'] = {` - ウィンドウ操作グループ開始
- **182行目**: `'name' : '+windows'` - グループ名
- **183行目**: `'w' : 'other-window'` - 他ウィンドウへ移動
- **184行目**: `'d' : 'delete-window'` - ウィンドウ削除
- **185-186行目**: `'-' : 'split-window-below'`, `'|' : 'split-window-right'` - 分割
- **188行目**: `'o' : ['only', 'close-all-windows-except-current']` - 他ウィンドウ削除
- **189-192行目**: `'h'/'j'/'l'/'k'` - ウィンドウ移動
- **193-196行目**: `'H'/'J'/'L'/'K'` - ウィンドウ拡張
- **197行目**: `'=' : 'balance-window'` - サイズ均等化

#### Step 2: キーマッピング実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | 実際のキーマッピング |

**主要処理フロー**:
- **17-19行目**: ウィンドウ番号による移動
  - `execute 'nnoremap <Leader>'.s:i ' :'.s:i.'wincmd w<CR>'`
- **50行目**: vim-choosewin連携
  - `nmap <Leader>ww <Plug>(choosewin)`

#### Step 3: fzfウィンドウ機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.vim | `layers/+tools/fzf/config.vim` | fzf設定 |

**主要処理フロー**:
- **67行目**: `nnoremap <Leader>w? :Windows<CR>` - fzfウィンドウ一覧

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

```
SPC w キー入力
    │
    ├─ SPC w h/j/k/l
    │      └─ wincmd h/j/k/l 実行
    │
    ├─ SPC w H/J/K/L
    │      └─ ウィンドウリサイズコマンド実行
    │
    ├─ SPC w -/s
    │      └─ :split 実行
    │
    ├─ SPC w |/v
    │      └─ :vsplit 実行
    │
    ├─ SPC w d
    │      └─ :close 実行
    │
    ├─ SPC w o
    │      └─ :only 実行
    │
    ├─ SPC w =
    │      └─ wincmd = 実行
    │
    ├─ SPC w w
    │      └─ <Plug>(choosewin) 実行
    │             └─ vim-choosewin オーバーレイ表示
    │
    └─ SPC w ?
           └─ :Windows (fzf.vim) 実行
                  └─ fzf ウィンドウ選択UI

SPC 1-9 キー入力
    └─ :{N}wincmd w 実行
           └─ ウィンドウ{N}へ移動
```

### データフロー図

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

ユーザーキー入力 ────▶ which-keyディスパッチ ───▶ サブキー選択UI
    │                       │
    ▼                       ▼
SPC w + サブキー ────▶ マッピング解決 ──────────▶ wincmdコマンド実行
                            │
                            ├─▶ wincmd h/j/k/l ─▶ ウィンドウ移動
                            ├─▶ :split/:vsplit ─▶ ウィンドウ分割
                            ├─▶ :close/:only ───▶ ウィンドウ削除
                            └─▶ vim-choosewin ──▶ 視覚的選択UI
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| leader.vim | `core/autoload/spacevim/map/leader.vim` | ソース | ウィンドウ操作キーマッピング定義 |
| keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | ソース | 実キーマッピング実装 |
| config.vim | `layers/+tools/fzf/config.vim` | 設定 | fzf Windows設定 |
| packages.vim | `layers/+distributions/better-defaults/packages.vim` | 設定 | vim-choosewinプラグイン登録 |
