# 画面設計書 43-nimsuggest --help

## 概要

本ドキュメントは、Nim IDE支援ツール「nimsuggest」の`nimsuggest --help`コマンドによるヘルプ表示画面の設計書である。

### 本画面の処理概要

この画面は、nimsuggestのIDE支援ツールの使用方法を表示するCLIヘルプ画面である。nimsuggestはエディタやIDEと連携して、コード補完、定義ジャンプ、参照検索などの機能を提供するツールであり、開発者やツール連携開発者がオプションを確認するために使用する。

**業務上の目的・背景**：nimsuggestはNim言語のIDE機能を提供する重要なツールであり、VSCode、Emacs、Vim等の各種エディタとの連携に使用される。ツール開発者やエディタプラグイン開発者が正しく連携を設定するためには、利用可能なオプションやプロトコルバージョンの情報が必要である。

**画面へのアクセス方法**：
- `nimsuggest --help` または `nimsuggest -h` コマンドを実行
- 引数なしで`nimsuggest`を実行した場合もヘルプが表示される

**主要な操作・処理内容**：
1. コマンドライン引数の解析（`--help` または `-h` の検出）
2. Usage定数からヘルプメッセージを取得
3. 標準出力へのヘルプメッセージの表示
4. プログラム終了

**画面遷移**：
- この画面へ遷移：コマンドラインから直接アクセス
- この画面から遷移：なし（ヘルプ表示後にプログラム終了）

**権限による表示制御**：なし（すべてのユーザーが同一のヘルプを閲覧可能）

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 25 | Nimsuggest | 主機能 | nimsuggestのヘルプ表示処理 |

## 画面種別

ヘルプ表示（情報出力）

## URL/ルーティング

```
nimsuggest --help
nimsuggest -h
nimsuggest (引数なし)
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| --help | フラグ | - | ヘルプ表示を要求するオプション |
| -h | フラグ | - | ヘルプ表示を要求するオプション（短縮形） |

### 出力項目

| 項目名 | 説明 |
|--------|------|
| タイトル | Nimsuggestツールの説明 |
| Usage | 基本的な使用法パターン |
| Options | 利用可能なオプション一覧 |
| プロトコルバージョン | サポートされているプロトコルバージョン情報 |
| 接続情報 | サーバーモード時の接続方法の説明 |

## 表示項目

### ヘルプメッセージ構成

```
Nimsuggest - Tool to give every editor IDE like capabilities for Nim
Usage:
  nimsuggest [options] projectfile.nim

Options:
  --autobind              automatically binds into a free port
  --port:PORT             port, by default 6000
  --address:HOST          binds to that address, by default ""
  --stdin                 read commands from stdin and write results to
                          stdout instead of using sockets
  --clientProcessId:PID   shutdown nimsuggest in case this process dies
  --epc                   use emacs epc mode
  --debug                 enable debug output
  --log                   enable verbose logging to nimsuggest.log file
  --v1                    use version 1 of the protocol; for backwards compatibility
  --v2                    use version 2(default) of the protocol
  --v3                    use version 3 of the protocol
  --v4                    use version 4 of the protocol
  --info:X                information
    --info:nimVer           return the Nim compiler version that nimsuggest uses internally
    --info:protocolVer      return the newest protocol version that is supported
    --info:capabilities     return the capabilities supported by nimsuggest
  --refresh               perform automatic refreshes to keep the analysis precise
  --maxresults:N          limit the number of suggestions to N
  --tester                implies --stdin and outputs a line
                          '!EOF!' for the tester
  --find                  attempts to find the project file of the current project
  --exceptionInlayHints:on|off
                          globally turn exception inlay hints on|off

The server then listens to the connection and takes line-based commands.

If --autobind is used, the binded port number will be printed to stdout.

In addition, all command line options of Nim that do not affect code generation
are supported.
```

## イベント仕様

### 1-ヘルプオプション検出

**トリガー**: コマンドライン引数に`--help`または`-h`が指定された場合

**処理フロー**:
1. `processCmdLine`関数でオプションを解析
2. "help"または"h"オプションを検出
3. `stdout.writeLine(Usage)`でヘルプメッセージを出力
4. `quit()`で終了

### 2-引数なし実行

**トリガー**: `nimsuggest`コマンドを引数なしで実行

**処理フロー**:
1. `handleCmdLine`関数で引数数をチェック
2. `paramCount() == 0`の場合、`stdout.writeLine(Usage)`を呼び出し
3. ヘルプメッセージを表示して終了

## データベース更新仕様

該当なし（データベース操作を行わない画面）

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| - | 情報 | Usageメッセージ全文 | --helpまたは-hオプション指定時 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|---------|
| 不正なオプション指定 | Nimコンパイラと同様のオプション処理に委譲 |

## 備考

- nimsuggestはサーバーモードで動作し、エディタからの要求を受け付ける
- プロトコルバージョン（v1〜v4）によって出力形式が異なる
- 最新のプロトコルバージョンは`HighestSuggestProtocolVersion`定数（値：4）で定義
- `--info`オプションで各種メタ情報を取得可能

---

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

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

### 推奨読解順序

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

まず、nimsuggestの定数と主要な型を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | nimsuggest.nim | `nimsuggest/nimsuggest.nim` | Usage定数、HighestSuggestProtocolVersion、Mode列挙型 |

**読解のコツ**: Usage定数はヘルプメッセージ全文を含む。Mode列挙型（mstdin, mtcp, mepc等）は動作モードを定義している。

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

処理の起点となる部分を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | nimsuggest.nim | `nimsuggest/nimsuggest.nim` | isMainModule内のhandleCmdLine呼び出し（行1298-1299） |

**主要処理フロー**:
1. **行1298-1299**: `handleCmdLine(newIdentCache(), newConfigRef())`の呼び出し
2. **行758-767**: `handleCmdLine`関数 - コマンドライン処理の起点
3. **行765-767**: `paramCount() == 0`のチェックとヘルプ表示

#### Step 3: コマンドライン解析を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | nimsuggest.nim | `nimsuggest/nimsuggest.nim` | processCmdLine関数（行670以降） |

**主要処理フロー**:
- **行53-90**: Usage定数 - ヘルプメッセージ全文の定義
- **行51**: HighestSuggestProtocolVersion定数（値：4）
- **行670-756**: `processCmdLine`関数 - オプション解析
- **行677-681**: "help", "h"オプションの処理

#### Step 4: 情報取得オプションを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | nimsuggest.nim | `nimsuggest/nimsuggest.nim` | --infoオプションの処理 |

**主要処理フロー**:
- **行708-720**: `--info`オプションの各サブオプション処理
- **行710-711**: `--info:protocolVer` - プロトコルバージョン出力
- **行712-714**: `--info:nimVer` - Nimバージョン出力
- **行715-718**: `--info:capabilities` - 対応機能一覧出力

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

```
nimsuggest (エントリーポイント)
    │
    ├─ isMainModule (nimsuggest.nim:1298)
    │      │
    │      └─ handleCmdLine (nimsuggest.nim:758)
    │              │
    │              ├─ paramCount() == 0 チェック
    │              │      └─ stdout.writeLine(Usage)
    │              │              └─ return（終了）
    │              │
    │              └─ processCmdLineAndProjectPath
    │                      └─ processCmdLine (nimsuggest.nim:670)
    │                              │
    │                              ├─ "help", "h" の場合
    │                              │      ├─ stdout.writeLine(Usage)
    │                              │      └─ quit()
    │                              │
    │                              └─ "info" の場合
    │                                      ├─ "protocolVer" → バージョン出力
    │                                      ├─ "nimVer" → Nimバージョン出力
    │                                      └─ "capabilities" → 機能一覧出力
```

### データフロー図

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

コマンドライン引数 ───▶ parseopt.initOptParser ───▶ OptParser
        │
        ▼
    引数解析 ───────────▶ processCmdLine ──────────▶ オプション判定
        │
        ├─ --help/-h 検出 ─────▶ stdout.writeLine(Usage) ───▶ stdout
        │                              │
        │                              ▼
        │                          quit() ─────────────────▶ プロセス終了
        │
        └─ --info 検出 ────────▶ 各種情報出力 ─────────────▶ stdout
                                       │
                                       ▼
                                   quit(0) ────────────────▶ プロセス終了
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| nimsuggest.nim | `nimsuggest/nimsuggest.nim` | ソース | nimsuggestのメインソース |
| compiler/options.nim | `compiler/options.nim` | ソース | コンパイラオプションの管理（共用） |
| compiler/commands.nim | `compiler/commands.nim` | ソース | コマンドライン処理（共用部分） |
| compiler/cmdlinehelper.nim | `compiler/cmdlinehelper.nim` | ソース | コマンドライン処理のヘルパー |
