# 機能設計書 13-バッファ操作(SPC b)

## 概要

本ドキュメントは、space-vimにおけるバッファ操作機能（SPC b）の設計仕様を記述する。SPCキーに続いて「b」を押下することで、バッファの切り替え、削除、ナビゲーションなどのバッファ関連操作を提供する機能である。

### 本機能の処理概要

バッファ操作機能は、Vimで開いている複数のファイル（バッファ）を効率的に管理するためのキーバインディング群を提供する。数字キーによる直接バッファ切り替え、fzfを使用したファジー検索によるバッファ選択、バッファの削除・移動などの操作が含まれる。

**業務上の目的・背景**：プログラミング作業では、複数のファイルを同時に編集することが一般的である。標準のVimでは`:bn`や`:bp`などのコマンドでバッファを切り替える必要があるが、これは効率的ではない。SPC bプレフィックスを使用することで、より直感的かつ高速なバッファナビゲーションを実現する。

**機能の利用シーン**：
- 複数のソースファイルを同時に編集している場合のファイル切り替え
- 開いているバッファの一覧を確認し、目的のファイルを選択する場合
- 不要になったバッファを閉じてメモリを解放する場合
- 特定のバッファ（最初、最後、ホーム）へ素早くジャンプする場合

**主要な処理内容**：
1. SPC b 1-9：番号指定によるバッファ切り替え
2. SPC b b / SPC b ?：fzfを使用したバッファ一覧表示・選択
3. SPC b d / SPC b k：バッファの削除
4. SPC b n / SPC b p：次/前のバッファへ移動
5. SPC b f / SPC b l：最初/最後のバッファへ移動
6. SPC b h：Startifyホーム画面の表示

**関連システム・外部連携**：
- fzf.vim / vim-clap：ファジーファインダーによるバッファ選択
- vim-startify：ホームバッファ表示
- vim-airline / lightline：バッファ情報のステータスライン表示

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 4 | FZF（ファジーファインダー） | API連携 | SPC b bでバッファ一覧のファジー検索 |
| 1 | Startify（スタート画面） | 遷移先 | SPC b hでStartifyホーム画面表示 |

## 機能種別

ナビゲーション / バッファ管理

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- ユーザーキー入力
- Vimバッファリスト（:ls で確認可能）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| バッファ切替 | Vim状態 | アクティブバッファの変更 |
| バッファ削除 | Vim状態 | 指定バッファの削除 |
| fzfウィンドウ | UI | バッファ選択用のfzfインターフェース |

### 出力先

- Vimバッファ空間
- fzfフローティングウィンドウ（NeoVim）またはポップアップ

## 処理フロー

### 処理シーケンス

```
1. SPC b キー入力
   └─ which-keyによるサブキー一覧表示
2. サブキー入力に応じた処理分岐
   ├─ 1-9: 直接バッファ切替（:b1, :b2, ...）
   ├─ b/?:  fzfバッファ一覧表示
   ├─ d/k:  バッファ削除（:bd）
   ├─ n:    次のバッファ（:bnext）
   ├─ p:    前のバッファ（:bprev）
   ├─ f:    最初のバッファ（:bfirst）
   ├─ l:    最後のバッファ（:blast）
   └─ h:    Startify表示（:Startify）
```

### フローチャート

```mermaid
flowchart TD
    A[SPC b 入力] --> B{サブキー?}
    B -->|1-9| C[バッファ番号で切替]
    B -->|b/?| D[fzfバッファ一覧]
    B -->|d/k| E[バッファ削除]
    B -->|n| F[次のバッファ]
    B -->|p| G[前のバッファ]
    B -->|f| H[最初のバッファ]
    B -->|l| I[最後のバッファ]
    B -->|h| J[Startify表示]
    C --> K[バッファ切替完了]
    D --> L{選択?}
    L -->|Yes| K
    L -->|No| M[キャンセル]
    E --> N[バッファ削除完了]
    F --> K
    G --> K
    H --> K
    I --> K
    J --> O[Startify画面表示]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 番号バッファ切替 | 1-9の数字でバッファ番号を直接指定 | SPC b 1-9 入力時 |
| BR-002 | fzf優先 | vim-clapが有効でない限りfzf.vimを使用 | g:spacevim_enable_clap未設定時 |
| BR-003 | vim-clap優先 | g:spacevim_enable_clap=1でvim-clap使用 | g:spacevim_enable_clap設定時 |
| BR-004 | 削除確認なし | バッファ削除は確認なしで実行 | 変更がある場合はVimが警告 |

### 計算ロジック

該当なし

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

該当なし（本機能はデータベースを使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| E37 | 保存エラー | 変更のあるバッファを保存せずに削除しようとした | `:w`で保存するか`:bd!`で強制削除 |
| - | 存在しないバッファ | 指定番号のバッファが存在しない | エラーメッセージ表示 |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- バッファ切り替えは即時実行
- fzfバッファ一覧表示は100ミリ秒以内

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

該当なし

## 備考

- バッファ番号は:lsコマンドで確認可能
- ]bと[bでも次/前バッファへの移動が可能（vim-unimpaired互換）

---

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

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

### 推奨読解順序

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

バッファ操作のキーマッピング定義を確認。

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

**読解のコツ**: バッファ操作は辞書形式で定義され、'name'キーがプレフィックス名を表す。

**主要データ構造**:
- **30行目**: `let s:leader_map['b'] = {` - バッファ操作グループ開始
- **31行目**: `'name' : '+buffer'` - グループ名
- **32-40行目**: `'1' : 'buffer-1'` 〜 `'9' : 'buffer-9'` - 番号バッファ切替
- **41行目**: `'d' : 'delete-buffer'` - バッファ削除
- **48行目**: `'b' : 'fzf-buffer'` - fzfバッファ選択

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

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

**主要処理フロー**:
- **24-26行目**: `execute 'nnoremap <Leader>b'.s:i ':b'.s:i.'<CR>'` - 番号バッファ切替
- **44行目**: `nnoremap <silent><Leader>bh :Startify<CR>` - Startify表示

#### Step 3: fzfバッファ機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | manager.vim | `core/autoload/spacevim/map/manager.vim` | Buffers関数の実装 |
| 3-2 | fzf.vim | `core/autoload/spacevim/wrap/fzf.vim` | fzfラッパー関数 |

**主要処理フロー**:
- **11-17行目（manager.vim）**: `function! spacevim#map#manager#Buffers()` - バッファ一覧関数
- **12-16行目**: vim-clap有効時はClap使用、それ以外はfzf使用

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

```
SPC b キー入力
    │
    ├─ SPC b 1-9
    │      └─ :b{N} コマンド実行
    │
    ├─ SPC b b
    │      └─ spacevim#map#manager#Buffers()
    │             ├─ g:spacevim_enable_clap=1
    │             │      └─ :Clap buffers
    │             └─ それ以外
    │                    └─ spacevim#wrap#fzf#Buffers()
    │                           └─ :Buffers (fzf.vim)
    │
    ├─ SPC b d/k
    │      └─ :bd コマンド実行
    │
    ├─ SPC b n
    │      └─ :bnext コマンド実行
    │
    ├─ SPC b p
    │      └─ :bprev コマンド実行
    │
    └─ SPC b h
           └─ :Startify コマンド実行
```

### データフロー図

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

ユーザーキー入力 ────▶ which-keyディスパッチ ───▶ サブキー選択UI
    │                       │
    ▼                       ▼
SPC b + サブキー ────▶ マッピング解決 ──────────▶ Vimコマンド実行
                            │
                            ├─▶ :b{N} ──────────▶ バッファ切替
                            ├─▶ :Buffers ───────▶ fzf選択UI
                            ├─▶ :bd ────────────▶ バッファ削除
                            └─▶ :Startify ──────▶ ホーム画面
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| leader.vim | `core/autoload/spacevim/map/leader.vim` | ソース | バッファ操作キーマッピング定義 |
| keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | ソース | 実キーマッピング実装 |
| manager.vim | `core/autoload/spacevim/map/manager.vim` | ソース | Buffers関数実装 |
| fzf.vim | `core/autoload/spacevim/wrap/fzf.vim` | ソース | fzfラッパー |
| config.vim | `layers/+tools/fzf/config.vim` | 設定 | fzf設定・キーマッピング |
