# 機能設計書 78-Shell/Bashサポート

## 概要

本ドキュメントは、Doom EmacsにおけるShell/Bashスクリプト開発サポート機能について記述する。シェルスクリプトの編集、REPL環境、ドキュメント参照など、シェルスクリプト開発に必要な機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：シェルスクリプトはシステム管理、自動化、CI/CDパイプラインなど幅広い場面で使用される。Bash、Zsh、Fish、PowerShellなど複数のシェル環境に対応し、効率的なスクリプト開発を支援する。

**機能の利用シーン**：
- シェルスクリプト（.sh, .bash, .zsh）の編集
- 関数定義の記述とインデント
- manページによるドキュメント参照
- シェルREPL環境での対話的実行
- LSPサポートによる静的解析

**主要な処理内容**：
1. sh-modeによるシェルスクリプト編集
2. 拡張フォント化（変数、コマンド置換、ビルトインコマンド）
3. company-shell/bash-completionによるコマンド補完
4. manページ統合によるドキュメント参照
5. シェルREPL環境
6. LSPサポート（bash-language-server）
7. PowerShellサポート（+powershellフラグ）
8. Fishサポート（+fishフラグ）

**関連システム・外部連携**：
- bash-language-server: Bash Language Server
- man/woman: manページ参照

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Shellスクリプトバッファ | 主画面 | スクリプトの編集 |
| - | *shell*バッファ | 結果表示画面 | REPL実行結果 |
| - | *Man*バッファ | 結果表示画面 | manページ表示 |

## 機能種別

言語サポート / スクリプト開発

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| +lsp | フラグ | No | LSPサポートを有効化 | doom!ブロックで指定 |
| +fish | フラグ | No | Fish shellサポートを有効化 | doom!ブロックで指定 |
| +powershell | フラグ | No | PowerShellサポートを有効化 | doom!ブロックで指定 |

### 入力データソース

- シェルスクリプト（*.sh, *.bash, *.zsh）
- Batsテストファイル（*.bats）
- zunitファイル（*.zunit）
- 環境ファイル（*.env）
- bspwmrc, #compdef で始まるファイル

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| manページ | バッファ | +sh-lookup-documentation-handlerによる表示 |
| REPL出力 | テキスト | *shell*バッファに出力 |

### 出力先

- *shell*バッファ: REPL出力
- *Man*バッファ: manページ表示

## 処理フロー

### 処理シーケンス

```
1. シェルスクリプトを開く
   └─ sh-mode が起動
2. シェル種別判定
   └─ sh-set-shell でシェル種別を設定
3. フォント化拡張
   └─ +sh-init-extra-fontification-h による追加ハイライト
4. LSPモード有効時
   └─ lsp! フック実行
```

### フローチャート

```mermaid
flowchart TD
    A[シェルスクリプトを開く] --> B[sh-mode起動]
    B --> C{ファイル種別}
    C -->|.bats| D[sh-mode]
    C -->|.zunit/.env| D
    C -->|bspwmrc| D
    C -->|#compdef| D
    C -->|その他| E[拡張子でモード判定]
    D --> F[シェル種別判定]
    E --> F
    F --> G[フォント化拡張]
    G --> H{+lsp?}
    H -->|Yes| I[bash-language-server接続]
    H -->|No| J{補完設定}
    I --> K[開発作業]
    J -->|company| L[company-shell設定]
    J -->|corfu| M[bash-completion設定]
    L --> K
    M --> K
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 関数名検出 | ダッシュを含む関数名をimenuで検出 | sh-mode有効時 |
| BR-02 | ビルトインコマンドハイライト | +sh-builtin-keywords のコマンドをfont-lock-type-faceでハイライト | sh-mode有効時 |
| BR-03 | macOS whatis無効化 | macOSではcompany-shell-dont-fetch-metaをtに設定 | macOS環境 |
| BR-04 | バッククォートペア | バッククォートの自動ペアリング | sh-mode有効時 |
| BR-05 | electricワード | else, elif, fi, done, then, do, esac, ;; でelectric動作 | sh-mode有効時 |

### 計算ロジック

特になし

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

### 操作別データベース影響一覧

データベース操作なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

リトライ機能なし

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

トランザクション管理なし

## パフォーマンス要件

- macOSではwhatis lookupが遅いため無効化

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

- シェルスクリプトは実行可能なため、信頼できるソースのみ編集推奨

## 備考

- sh-indent-after-continuation は 'always に設定（継続行で常にインデント）
- mode-name は "Sh" に統一

---

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

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

### 推奨読解順序

#### Step 1: 設定変数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/lang/sh/config.el` | +sh-builtin-keywords 変数 |

**読解のコツ**: この変数はよく使用されるシェルコマンドのリスト。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/lang/sh/config.el` | sh-script の use-package! 設定 |

**主要処理フロー**:
1. **3-6行目**: `+sh-builtin-keywords` 変数定義
2. **13-15行目**: モード設定（.bats, .zunit, .env, bspwmrc）
3. **17行目**: magic-mode-alist設定（#compdef）
4. **19-22行目**: docsets, electric, repl, lookup設定
5. **37-39行目**: LSPフック設定
6. **56-65行目**: フォント化拡張設定

#### Step 3: 自動ロード関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | autoload.el | `modules/lang/sh/autoload.el` | フォント化、REPL、ドキュメント関数 |

**主要処理フロー**:
- **4-14行目**: `+sh--match-variables-in-quotes` - ダブルクォート内変数マッチ
- **17-26行目**: `+sh--match-command-subst-in-quotes` - コマンド置換マッチ
- **30-39行目**: `+sh/open-repl` - シェルREPL起動
- **42-53行目**: `+sh-lookup-documentation-handler` - manページ参照

#### Step 4: 補完設定を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | config.el | `modules/lang/sh/config.el` | company-shell, bash-completion設定 |

**主要処理フロー**:
- **71-79行目**: company-shell設定（company補完）
- **82-88行目**: bash-completion設定（corfu補完）

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

```
sh-mode
    │
    ├─ set-docsets! → "Bash"
    │
    ├─ set-electric! → else, elif, fi, done, then, do, esac, ;;
    │
    ├─ set-repl-handler! → +sh/open-repl
    │      └─ sh-shell-process
    │
    ├─ set-lookup-handlers! → +sh-lookup-documentation-handler
    │      ├─ man (executable-find "man")
    │      └─ woman (fallback)
    │
    ├─ +sh-init-extra-fontification-h
    │      ├─ +sh--match-variables-in-quotes
    │      ├─ +sh--match-command-subst-in-quotes
    │      └─ +sh-builtin-keywords ハイライト
    │
    ├─ 補完
    │      ├─ company-shell (:completion company)
    │      └─ bash-completion (:completion corfu)
    │
    └─ LSP (+lsp)
           └─ bash-language-server
```

### データフロー図

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

シェルスクリプト ───────▶ sh-mode ─────────────────▶ シンタックスハイライト
        │                   │
        │                   ▼
        └──────────────▶ +sh-init-extra-fontification-h
                              ├─ 変数ハイライト
                              ├─ コマンド置換ハイライト
                              └─ ビルトインコマンドハイライト

コマンド名 ─────────────▶ +sh-lookup-documentation-handler
                              ├─ man
                              └─ woman
                                    ▼
                              *Man*/*WoMan*バッファ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/lang/sh/config.el` | ソース | モジュール設定、補完、フォント化 |
| autoload.el | `modules/lang/sh/autoload.el` | ソース | フォント化関数、REPL、ドキュメント |
| packages.el | `modules/lang/sh/packages.el` | ソース | 依存パッケージ定義 |
