# 機能設計書 80-カーソルライン

## 概要

本ドキュメントは、space-vimの+distributions/better-defaultsレイヤーが提供するカーソルライン自動切り替え機能について、その設計と実装を詳細に記述する。

### 本機能の処理概要

**業務上の目的・背景**：
Vimのcursorlineオプションは、カーソルがある行をハイライト表示する機能である。しかし、挿入モード中にカーソルラインが表示されていると、入力中のテキストが見づらくなる場合がある。本機能は、モードに応じてカーソルラインを自動的に切り替えることで、ノーマルモードでの視認性と挿入モードでの編集しやすさを両立する。

**機能の利用シーン**：
- ノーマルモードでカーソル位置を視覚的に把握したい場合
- 挿入モード中はカーソルラインを非表示にして入力に集中したい場合
- ウィンドウ間を移動する際、アクティブウィンドウを視覚的に識別したい場合

**主要な処理内容**：
1. autocmdによるモード変更検出
2. InsertEnter時にカーソルライン非表示
3. InsertLeave時にカーソルライン表示
4. WinEnter/WinLeaveによるアクティブウィンドウでのカーソルライン制御

**関連システム・外部連携**：
- Vim標準のcursorlineオプション
- +distributions/better-defaultsレイヤー内での統合

**権限による制御**：
本機能に権限による制御は存在しない。+distributions/better-defaultsレイヤーを有効化することで自動的に適用される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Startify（スタート画面） | 補助機能 | スタート画面でのカーソル位置表示 |

## 機能種別

UI/UX機能 / 表示制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| モード変更イベント | Event | Yes | InsertEnter/InsertLeave/WinEnter/WinLeave | Vim内部イベント |

### 入力データソース

- Vimのモード変更イベント（autocmdでキャプチャ）
- 現在のファイルタイプ（clap_inputの場合は例外処理）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| cursorline設定 | Boolean | カーソルライン表示の有効/無効 |

### 出力先

- Vimのcursorlineオプション設定

## 処理フロー

### 処理シーケンス

```
1. モード変更イベント発生
   └─ InsertEnter、InsertLeave、WinEnter、WinLeave
2. autocmdハンドラが実行される
   └─ spacevimCursorline augroup内の処理
3. 条件に応じてcursorline設定を変更
   └─ InsertEnter/WinLeave → nocursorline
   └─ InsertLeave/WinEnter → cursorline（clap_input以外）
```

### フローチャート

```mermaid
flowchart TD
    A[モード変更イベント] --> B{イベント種別}
    B -->|InsertEnter| C[set nocursorline]
    B -->|WinLeave| C
    B -->|InsertLeave| D{ファイルタイプ}
    B -->|WinEnter| D
    D -->|clap_input| E[何もしない]
    D -->|その他| F[set cursorline]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-80-1 | 挿入モード非表示 | 挿入モード中はカーソルラインを非表示 | InsertEnterイベント |
| BR-80-2 | ノーマルモード表示 | ノーマルモード復帰時にカーソルラインを表示 | InsertLeaveイベント |
| BR-80-3 | アクティブウィンドウ | アクティブウィンドウのみカーソルラインを表示 | WinEnter/WinLeaveイベント |
| BR-80-4 | clap例外 | vim-clapの入力フィールドではカーソルライン処理をスキップ | ft=clap_input |

### 計算ロジック

本機能に計算ロジックは存在しない。

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

本機能にデータベース操作は存在しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 特になし | - | - |

### リトライ仕様

本機能にリトライ処理は存在しない。

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

本機能にトランザクション処理は存在しない。

## パフォーマンス要件

- autocmdイベント処理は即座に完了（単純なオプション変更のみ）
- パフォーマンスへの影響は無視できるレベル

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

本機能は表示制御のみであり、セキュリティ上の考慮事項は特になし。

## 備考

- Vim標準機能のみを使用（外部プラグイン不要）
- vim-clapとの互換性のため、clap_inputファイルタイプでは処理をスキップ
- SPC t cでカーソルカラムのトグル、SPC t Cでカラーカラムのトグルも利用可能

---

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

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

### 推奨読解順序

#### Step 1: 設定ファイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.vim | `layers/+distributions/better-defaults/config.vim` | カーソルライン自動切り替えの実装 |

**読解のコツ**: `augroup spacevimCursorline`ブロックでautocmdを定義。`&ft !=# 'clap_input'`条件でvim-clapとの互換性を確保。

**主要処理フロー**:
- **3-8行目**: カーソルライン自動切り替えのaugroupブロック
- **4行目**: `autocmd!` - 既存のautocmdをクリア
- **5行目**: `autocmd InsertLeave,WinEnter * if &ft !=# 'clap_input' | set cursorline | endif` - カーソルライン表示
- **6行目**: `autocmd InsertEnter,WinLeave * set nocursorline` - カーソルライン非表示

#### Step 2: キーバインディングを理解する

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

**読解のコツ**: `spacevim#vim#toggle#CursorColumn()`などの関数でカーソルカラム/カラーカラムのトグルが可能。

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

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

```
Vimモード変更
    │
    └─ augroup spacevimCursorline
           │
           ├─ InsertLeave/WinEnter
           │      └─ if ft != 'clap_input' → set cursorline
           │
           └─ InsertEnter/WinLeave
                  └─ set nocursorline

SPC t c 押下
    │
    └─ spacevim#vim#toggle#CursorColumn()
           └─ カーソルカラム表示トグル

SPC t C 押下
    │
    └─ spacevim#vim#toggle#ColorColumn()
           └─ カラーカラム表示トグル
```

### データフロー図

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

InsertEnter         ───▶  autocmd実行           ───▶  nocursorline
InsertLeave         ───▶  条件判定              ───▶  cursorline（ft!=clap_input時）
WinEnter            ───▶  条件判定              ───▶  cursorline（ft!=clap_input時）
WinLeave            ───▶  autocmd実行           ───▶  nocursorline
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.vim | `layers/+distributions/better-defaults/config.vim` | ソース | autocmdによるカーソルライン制御 |
| keybindings.vim | `layers/+distributions/better-defaults/keybindings.vim` | ソース | トグル関連マッピング |
