# 機能設計書 20-トグル操作(SPC t)

## 概要

本ドキュメントは、space-vimにおけるトグル操作機能（SPC t）の設計仕様を記述する。SPCキーに続いて「t」を押下することで、各種表示・機能のオン/オフ切り替え（インデントガイド、ペーストモード、Gitサイン等）を提供する機能である。

### 本機能の処理概要

トグル操作機能は、エディタの各種機能やUI要素のオン/オフを切り替えるためのキーバインディング群を提供する。視覚的なフィードバック機能（インデントガイド、カーソルカラム）や編集モード（ペーストモード）、プラグイン機能（syntastic、タグサイドバー）などの切り替えが含まれる。

**業務上の目的・背景**：エディタの各種機能は常に必要なわけではなく、状況に応じてオン/オフを切り替えたい場合がある。例えば、インデントガイドはコード構造の把握に役立つが、表示が煩雑に感じる場合もある。トグル操作により、これらの機能を素早く切り替えられる。

**機能の利用シーン**：
- インデントガイドの表示/非表示を切り替えたい場合（SPC t i）
- ペーストモードのオン/オフを切り替えたい場合（SPC t p）
- 構文チェック（syntastic）の有効/無効を切り替えたい場合（SPC t s）
- タグサイドバー（Tagbar/Vista）の表示/非表示を切り替えたい場合（SPC t T）
- Gitサイン表示のオン/オフを切り替えたい場合（SPC t g）
- カーソルカラムの表示を切り替えたい場合（SPC t c）
- カラーカラム（80文字目のライン）を切り替えたい場合（SPC t C）
- 現在バッファのタグを検索したい場合（SPC t b）

**主要な処理内容**：
1. SPC t i：インデントガイドトグル（:IndentGuidesToggle）
2. SPC t p：ペーストモードトグル（:setlocal paste!）
3. SPC t s：syntasticトグル（:SyntasticToggleMode）
4. SPC t T：タグサイドバートグル（Vista/TagbarToggle）
5. SPC t g：Gitサイン表示トグル（SignifyToggle/GitGutterToggle）
6. SPC t c：カーソルカラムトグル
7. SPC t C：カラーカラムトグル
8. SPC t b：現在バッファのタグ検索（fzf BTags）

**関連システム・外部連携**：
- vim-indent-guides / indentLine：インデントガイド表示
- syntastic / ALE：構文チェック
- vista.vim / tagbar：タグサイドバー
- vim-signify / vim-gitgutter：Gitサイン表示
- fzf.vim：タグ検索

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Tagbar（タグバー） | 補助機能 | SPC t tまたはF6でTagbarのトグル |
| 10 | ALE/Syntastic（構文エラー表示） | 補助機能 | SPC t sでALE/Syntasticのトグル |

## 機能種別

設定切替 / UI制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| キーシーケンス | String | Yes | SPC t に続くキー入力 | 定義済みキーのみ受付 |

### 入力データソース

- ユーザーキー入力
- 現在のトグル状態

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| トグル状態変更 | Vim状態 | 各機能のオン/オフ状態変更 |
| UI表示変更 | UI | サイドバー、インジケータ等の表示変更 |

### 出力先

- Vim設定状態
- Vim画面（UI要素の表示/非表示）

## 処理フロー

### 処理シーケンス

```
1. SPC t キー入力
   └─ which-keyによるサブキー一覧表示
2. サブキー入力に応じた処理分岐
   ├─ i:  インデントガイドトグル（IndentGuidesToggle）
   ├─ p:  ペーストモードトグル（setlocal paste!）
   ├─ s:  syntasticトグル（SyntasticToggleMode）
   ├─ T:  タグサイドバートグル（Vista/TagbarToggle）
   ├─ g:  Gitサイン表示トグル
   ├─ c:  カーソルカラムトグル
   ├─ C:  カラーカラムトグル
   └─ b:  現在バッファのタグ検索（fzf BTags）
```

### フローチャート

```mermaid
flowchart TD
    A[SPC t 入力] --> B{サブキー?}
    B -->|i| C[インデントガイドトグル]
    B -->|p| D[ペーストモードトグル]
    B -->|s| E[syntasticトグル]
    B -->|T| F[タグサイドバートグル]
    B -->|g| G[Gitサイントグル]
    B -->|c| H[カーソルカラムトグル]
    B -->|C| I[カラーカラムトグル]
    B -->|b| J[タグ検索]
    C --> K{現在ON?}
    K -->|Yes| L[OFF に変更]
    K -->|No| M[ON に変更]
    D --> N{paste?}
    N -->|Yes| O[nopaste に変更]
    N -->|No| P[paste に変更]
    F --> Q{Vista?}
    Q -->|Yes| R[:Vista]
    Q -->|No| S[:TagbarToggle]
    G --> T{Signify?}
    T -->|Yes| U[:SignifyToggle]
    T -->|No| V[:GitGutterToggle]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | トグル動作 | 現在の状態を反転させる | すべてのトグル操作 |
| BR-002 | プラグイン優先順位 | Vista > Tagbar、Signify > GitGutter | タグサイドバー、Gitサイン |
| BR-003 | ローカル設定 | paste、cursorcolumn等はバッファローカル | 設定変更時 |
| BR-004 | fzf連携 | SPC t b はfzfでタグ検索を行う | +tools/fzfレイヤー有効時 |

### 計算ロジック

該当なし

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | プラグイン未検出 | 対象プラグインがインストールされていない | 警告メッセージ表示 |
| - | タグ未生成 | タグファイルが存在しない | gutentagsでタグ生成を促す |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- トグル操作は即時実行
- タグサイドバー表示は100ミリ秒以内

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

該当なし

## 備考

- ペーストモードはターミナルからのペースト時に自動インデントを無効化
- カラーカラムのデフォルトは80文字目

---

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

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

### 推奨読解順序

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

トグル操作のキーマッピング定義を確認。

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

**読解のコツ**: トグル操作は関数呼び出しとコマンドが混在している。

**主要データ構造**:
- **167行目**: `let s:leader_map['t'] = {` - トグル操作グループ開始
- **168行目**: `'name' : '+toggle/tag'` - グループ名
- **169行目**: `'g' : ['spacevim#plug#toggle#Git()', 'git-status-indicator']` - Gitサイン
- **170行目**: `'i' : ['IndentGuidesToggle', 'indent-guide']` - インデントガイド
- **171行目**: `'p' : ['setlocal paste!', 'paste-mode']` - ペーストモード
- **172行目**: `'s' : ['SyntasticToggleMode', 'syntastic']` - syntastic
- **173行目**: `'b' : ['spacevim#map#manager#BufTags()', 'tags-in-current-buffer']` - タグ検索
- **174行目**: `'T' : ['spacevim#plug#toggle#SidebarTags()', 'tags-sidebar']` - タグサイドバー
- **175行目**: `'c' : ['spacevim#vim#toggle#CursorColumn()', 'cursor-column']` - カーソルカラム
- **176行目**: `'C' : ['spacevim#vim#toggle#ColorColumn()', 'color-column']` - カラーカラム

#### Step 2: トグル関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | toggle.vim | `core/autoload/spacevim/plug/toggle.vim` | プラグイン関連トグル |
| 2-2 | toggle.vim | `core/autoload/spacevim/vim/toggle.vim` | Vim設定関連トグル |

**主要処理フロー（plug/toggle.vim）**:
- **1-9行目**: `spacevim#plug#toggle#Git()` - Signify/GitGutter選択
- **11-19行目**: `spacevim#plug#toggle#SidebarTags()` - Vista/Tagbar選択

**主要処理フロー（vim/toggle.vim）**:
- **12-17行目**: `spacevim#vim#toggle#CursorColumn()` - カーソルカラム
- **20-26行目**: `spacevim#vim#toggle#ColorColumn()` - カラーカラム（80文字）

#### Step 3: keybindingsを理解する

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

**主要処理フロー**:
- **53行目**: `nnoremap <Leader>tc :call spacevim#vim#toggle#CursorColumn()<CR>`
- **54行目**: `nnoremap <Leader>tC :call spacevim#vim#toggle#ColorColumn()<CR>`

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

```
SPC t キー入力
    │
    ├─ SPC t i
    │      └─ :IndentGuidesToggle コマンド実行
    │             └─ vim-indent-guides トグル
    │
    ├─ SPC t p
    │      └─ :setlocal paste! 実行
    │             └─ ペーストモード切替
    │
    ├─ SPC t s
    │      └─ :SyntasticToggleMode コマンド実行
    │             └─ syntastic トグル
    │
    ├─ SPC t T
    │      └─ spacevim#plug#toggle#SidebarTags()
    │             ├─ Vista（存在する場合）
    │             │      └─ :Vista
    │             └─ Tagbar（それ以外）
    │                    └─ :TagbarToggle
    │
    ├─ SPC t g
    │      └─ spacevim#plug#toggle#Git()
    │             ├─ Signify（存在する場合）
    │             │      └─ :SignifyToggle
    │             └─ GitGutter（それ以外）
    │                    └─ :GitGutterToggle
    │
    ├─ SPC t c
    │      └─ spacevim#vim#toggle#CursorColumn()
    │             └─ :setlocal cursorcolumn / nocursorcolumn
    │
    ├─ SPC t C
    │      └─ spacevim#vim#toggle#ColorColumn()
    │             └─ :setlocal colorcolumn= / colorcolumn=80
    │
    └─ SPC t b
           └─ spacevim#map#manager#BufTags()
                  ├─ vim-clap（有効時）: :Clap tags
                  ├─ fzf（存在時）: :BTags
                  └─ LeaderF（存在時）: :LeaderfBufTag
```

### データフロー図

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

ユーザーキー入力 ────▶ which-keyディスパッチ ───▶ サブキー選択UI
    │                       │
    ▼                       ▼
SPC t + サブキー ────▶ トグル関数/コマンド ─────▶ 状態変更
                            │
                            ├─▶ :IndentGuidesToggle ─▶ インデントガイド表示/非表示
                            ├─▶ :setlocal paste! ────▶ ペーストモード切替
                            ├─▶ toggle#Git() ────────▶ Gitサイン表示/非表示
                            ├─▶ toggle#SidebarTags() ▶ タグバー表示/非表示
                            └─▶ toggle#CursorColumn()▶ カーソルカラム表示/非表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| leader.vim | `core/autoload/spacevim/map/leader.vim` | ソース | トグル操作キーマッピング定義 |
| toggle.vim | `core/autoload/spacevim/plug/toggle.vim` | ソース | プラグイン関連トグル関数 |
| toggle.vim | `core/autoload/spacevim/vim/toggle.vim` | ソース | Vim設定関連トグル関数 |
| keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | 設定 | 実キーマッピング |
| manager.vim | `core/autoload/spacevim/map/manager.vim` | ソース | BufTags関数 |
