# 通知設計書 18-grepクエリ不在通知

## 概要

本ドキュメントは、space-vimのgrep機能において、検索クエリが指定されなかった場合に表示される通知メッセージの設計を記載する。

### 本通知の処理概要

grepクエリ不在通知は、ユーザーがgrep機能を呼び出した際に検索クエリが空だった場合に、処理をスキップしてユーザーに通知するための機能である。

**業務上の目的・背景**：grep検索は検索クエリがなければ意味のある結果を返せない。この通知により、ユーザーは検索クエリを指定し忘れたことを認識でき、適切なクエリを指定して再実行できる。

**通知の送信タイミング**：spacevim#vim#grep#Grep関数が呼び出され、引数`a:query`が空文字列（''）であった場合に即座に通知が表示される。

**通知の受信者**：Vim/NeoVimを使用しているspace-vimユーザー。echomsgコマンドによりメッセージ履歴に記録される。

**通知内容の概要**：「no query passed to grep, exiting」というメッセージが表示される。シンプルなテキストで、検索クエリが渡されなかったため処理を終了することを通知する。

**期待されるアクション**：ユーザーは通知を確認し、正しい検索クエリを指定してgrep機能を再度呼び出す。

## 通知種別

Vimメッセージ通知（echomsg）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 中 |
| リトライ | 無し |

### 送信先決定ロジック

現在アクティブなVim/NeoVimのメッセージ領域に出力される。echomsgはメッセージ履歴（:messages）にも記録される。

## 通知テンプレート

### Vimメッセージの場合

| 項目 | 内容 |
|-----|------|
| 出力先 | Vimメッセージ領域 / メッセージ履歴 |
| 形式 | プレーンテキスト |

### 本文テンプレート

```
no query passed to grep, exiting
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージ | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 関数呼び出し | spacevim#vim#grep#Grep(query) | a:query ==# '' | 22-23行目 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| クエリが空でない | a:query が空文字列でない場合、通知は表示されずgrep処理が実行される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[spacevim#vim#grep#Grep呼び出し] --> B[grepprg/grepformat保存]
    B --> C[設定値を更新]
    C --> D{query == ''?}
    D -->|Yes| E[echomsg 'no query passed to grep, exiting']
    D -->|No| F[grep実行]
    E --> G[元の設定値を復元]
    F --> G
    G --> H[終了]
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（Vimバッファベースの処理）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| クエリ空 | a:query ==# '' | メッセージを表示して処理をスキップ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（関数呼び出し時に即座に出力）

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

- 機密情報は含まれない
- 外部通信なし
- ユーザー入力は処理されない（クエリが空の場合のみ通知）

## 備考

- 関数は`core/autoload/spacevim/vim/grep.vim`の15-31行目で定義
- echomsgコマンドを使用しているため、:messagesで履歴を確認可能
- grepコマンドの実行前にgrepprg, grepformat, shellpipeの設定を一時的に変更し、処理後に復元する
- rg（ripgrep）、ag（the silver searcher）、標準grepの順で使用可能なgrepツールを検出

---

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

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

### 推奨読解順序

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

grep設定を保持する辞書変数`s:grep`を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | grep.vim | `core/autoload/spacevim/vim/grep.vim` | s:grep辞書の初期化（1-12行目） |

**読解のコツ**: `s:`プレフィックスはスクリプトローカル変数を意味する。executable()関数で利用可能なgrepツールを検出している。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | grep.vim | `core/autoload/spacevim/vim/grep.vim` | spacevim#vim#grep#Grep関数（15-31行目） |

**主要処理フロー**:
1. **16-18行目**: 現在のgrepprg, grepformat, shellpipe設定を保存
2. **19-21行目**: s:grep辞書の値で設定を更新
3. **22-27行目**: クエリ判定と処理
4. **28-30行目**: 元の設定を復元

#### Step 3: クエリ判定ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | grep.vim | `core/autoload/spacevim/vim/grep.vim` | クエリ判定部分（22-27行目） |

**主要処理フロー**:
- **22行目**: `if a:query ==# ''` - 大文字小文字を区別した空文字列判定
- **23行目**: `echomsg 'no query passed to grep, exiting'` - 通知出力
- **25行目**: `execute 'silent! grep! '.shellescape(fnameescape(a:query))` - grep実行

#### Step 4: grepツール検出ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | grep.vim | `core/autoload/spacevim/vim/grep.vim` | grepツール検出（3-12行目） |

**主要処理フロー**:
- **3-5行目**: rgが利用可能な場合
- **6-8行目**: agが利用可能な場合
- **9-11行目**: 標準grepを使用

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

```
spacevim#vim#grep#Grep(query)
    |
    +-- 設定保存 (grepprg, grepformat, shellpipe)
    |
    +-- 設定更新 (s:grep.prg, s:grep.format)
    |
    +-- if query == ''
    |       +-- echomsg 'no query passed to grep, exiting'
    |
    +-- else
    |       +-- execute 'silent! grep! '.shellescape(...)
    |       +-- redraw!
    |
    +-- 設定復元
```

### データフロー図

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

query引数 ──▶ 空文字列判定 ──▶ echomsg ──▶ メッセージ領域
   |              |
   |         query == ''
   |              |
   |         Yes: 通知表示
   |         No: grep実行
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| grep.vim | `core/autoload/spacevim/vim/grep.vim` | ソース | grep機能の実装 |
