# アーキテクチャ構成図

## 全体アーキテクチャ図

```mermaid
flowchart TB
    subgraph External["外部システム"]
        GitHub["GitHub<br/>プラグインリポジトリ"]
        VimPlug["vim-plug<br/>プラグインマネージャー"]
        VimRuntime["Vim/NeoVim<br/>ランタイム環境"]
    end

    subgraph SpaceVim["space-vim"]
        subgraph Bootstrap["Bootstrap Layer"]
            InitVim["init.vim<br/>エントリーポイント"]
            DotSpacevim[".spacevim<br/>ユーザー設定"]
        end

        subgraph Core["Core Layer"]
            SpacevimVim["spacevim.vim<br/>メインモジュール"]
            Cache["cache.vim<br/>キャッシュ管理"]
            Layer["layer.vim<br/>レイヤー管理"]
            Util["util.vim<br/>ユーティリティ"]
        end

        subgraph Plugin["Plugin Layer"]
            PlugVim["plug.vim<br/>vim-plug連携"]
            MapLeader["map/leader.vim<br/>キーマッピング"]
        end

        subgraph Features["Feature Layers"]
            Checkers["+checkers<br/>構文チェック"]
            Completion["+completion<br/>自動補完"]
            Distributions["+distributions<br/>ベース設定"]
            Lang["+lang<br/>言語サポート"]
            Programming["+programming<br/>プログラミング支援"]
            Tools["+tools<br/>開発ツール"]
            Themes["+themes<br/>テーマ"]
            VersionControl["+version-control<br/>バージョン管理"]
            Vim["+vim<br/>Vim拡張"]
        end

        subgraph Private["Private Layer"]
            PrivateConfig["private/<br/>ユーザーカスタマイズ"]
        end
    end

    VimRuntime --> InitVim
    InitVim --> SpacevimVim
    DotSpacevim --> SpacevimVim
    SpacevimVim --> Cache
    SpacevimVim --> Layer
    SpacevimVim --> Util
    SpacevimVim --> PlugVim
    PlugVim --> VimPlug
    VimPlug --> GitHub
    SpacevimVim --> MapLeader
    SpacevimVim --> Features
    SpacevimVim --> PrivateConfig
```

## ブートストラップシーケンス図

```mermaid
sequenceDiagram
    participant V as Vim/NeoVim
    participant I as init.vim
    participant S as spacevim.vim
    participant C as cache.vim
    participant D as .spacevim
    participant P as vim-plug
    participant L as layers/

    V->>I: 起動時読み込み
    I->>I: g:spacevim 初期化
    I->>S: spacevim#bootstrap()

    S->>S: spacevim#begin()
    S->>P: check_vim_plug()
    alt vim-plug未インストール
        S->>P: ダウンロード
    end
    S->>S: define_command()
    S->>C: cache()
    alt キャッシュ存在
        C->>C: info.vim読み込み
    else キャッシュ不在
        C->>C: spacevim#cache#init()
    end
    S->>D: check_dot_spacevim()
    D-->>S: spacevim_layers設定

    S->>S: spacevim#end()
    S->>P: plug#begin()

    loop 各有効レイヤー
        S->>L: packages.vim読み込み
    end

    S->>D: UserInit()呼び出し
    S->>P: plug#end()

    loop 各有効レイヤー
        S->>L: config.vim読み込み
    end

    S->>D: UserConfig()呼び出し
    S->>P: 不足プラグイン確認
```

## レイヤー構造図

```mermaid
flowchart LR
    subgraph Topics["トピック（カテゴリ）"]
        direction TB
        T1["+checkers"]
        T2["+completion"]
        T3["+distributions"]
        T4["+fun"]
        T5["+lang"]
        T6["+misc"]
        T7["+programming"]
        T8["+themes"]
        T9["+tools"]
        T10["+version-control"]
        T11["+vim"]
    end

    subgraph LayerStructure["レイヤー構造"]
        direction TB
        subgraph SingleLayer["単一レイヤー構成"]
            README["README.md<br/>ドキュメント"]
            Packages["packages.vim<br/>プラグイン定義"]
            Config["config.vim<br/>設定"]
        end
    end

    subgraph Examples["レイヤー例"]
        direction TB
        FZF["fzf レイヤー"]
        Python["python レイヤー"]
        Git["git レイヤー"]
        LSP["lsp レイヤー"]
    end

    T9 --> FZF
    T5 --> Python
    T10 --> Git
    T9 --> LSP

    FZF --> SingleLayer
    Python --> SingleLayer
    Git --> SingleLayer
    LSP --> SingleLayer
```

## コアモジュール構造図

```mermaid
flowchart TB
    subgraph CoreAutoload["core/autoload/"]
        SpacevimMain["spacevim.vim<br/>メイン関数"]

        subgraph SpacevimDir["spacevim/"]
            API["api/<br/>API抽象化"]
            Autocmd["autocmd/<br/>Autocmd設定"]
            CacheModule["cache.vim<br/>キャッシュ"]
            Defer["defer.vim<br/>遅延読み込み"]
            Icons["icons.vim<br/>アイコン"]
            LangDir["lang/<br/>言語サポート"]
            LayerModule["layer.vim<br/>レイヤー管理"]
            MapDir["map/<br/>キーマッピング"]
            PlugDir["plug/<br/>プラグイン設定"]
            UtilModule["util.vim<br/>ユーティリティ"]
            VimDir["vim/<br/>Vim固有機能"]
            Wrap["wrap/<br/>ラッパー"]
        end
    end

    SpacevimMain --> CacheModule
    SpacevimMain --> LayerModule
    SpacevimMain --> UtilModule
    SpacevimMain --> MapDir
    SpacevimMain --> PlugDir

    subgraph VimSubmodules["vim/ サブモジュール"]
        AutocmdVim["autocmd.vim"]
        Complete["complete.vim"]
        Cursor["cursor.vim"]
        File["file.vim"]
        Grep["grep.vim"]
        GUI["gui.vim"]
        PlugSubVim["plug.vim"]
        Tab["tab.vim"]
        Term["term.vim"]
        Toggle["toggle.vim"]
    end

    VimDir --> VimSubmodules
```

## キーマッピング構造図

```mermaid
flowchart TB
    subgraph Leader["Leaderキー (Space)"]
        direction LR
        Q["? - ヘルプ"]
        A["+align"]
        B["+buffer"]
        C["+cscope"]
        E["+errors"]
        F["+find/files"]
        G["+git"]
        H["+help"]
        J["+jump"]
        L["+lsp"]
        P["+projects"]
        S["+search"]
        T["+toggle"]
        W["+windows"]
        X["+text"]
    end

    subgraph BufferCommands["Buffer コマンド"]
        B1["b - fzf-buffer"]
        B2["d - delete-buffer"]
        B3["n - next-buffer"]
        B4["p - previous-buffer"]
    end

    subgraph GitCommands["Git コマンド"]
        G1["b - blame"]
        G2["c - commits"]
        G3["d - diff"]
        G4["s - status"]
    end

    subgraph LSPCommands["LSP コマンド"]
        L1["a - code-action"]
        L2["f - formatting"]
        L3["h - hover"]
        L4["r - references"]
        L5["g - goto"]
    end

    B --> BufferCommands
    G --> GitCommands
    L --> LSPCommands
```

## データフロー図

```mermaid
flowchart TB
    subgraph Input["入力"]
        UserConfig["ユーザー設定<br/>.spacevim"]
        LayerFiles["レイヤーファイル<br/>layers/"]
    end

    subgraph Processing["処理"]
        CacheInit["キャッシュ初期化<br/>spacevim#cache#init()"]
        LayerScan["レイヤースキャン"]
        ManifestGen["マニフェスト生成"]
        PluginReg["プラグイン登録"]
        ConfigLoad["設定読み込み"]
    end

    subgraph Output["出力"]
        InfoVim["info.vim<br/>キャッシュファイル"]
        GlobalVars["g:spacevim<br/>グローバル変数"]
        VimSettings["Vim設定<br/>マッピング・オプション"]
    end

    UserConfig --> ConfigLoad
    LayerFiles --> LayerScan
    LayerScan --> CacheInit
    CacheInit --> ManifestGen
    ManifestGen --> InfoVim
    ManifestGen --> GlobalVars
    GlobalVars --> PluginReg
    PluginReg --> ConfigLoad
    ConfigLoad --> VimSettings
```

## 言語サポートレイヤー一覧図

```mermaid
flowchart TB
    subgraph LangLayers["+lang トピック"]
        direction TB

        subgraph Systems["システム言語"]
            C["c-c++"]
            Go["go"]
            Rust["rust"]
        end

        subgraph Web["Web言語"]
            JS["javascript"]
            TS["typescript"]
            HTML["html"]
            Vue["vue"]
        end

        subgraph Scripting["スクリプト言語"]
            Python["python"]
            Ruby["ruby"]
        end

        subgraph Functional["関数型言語"]
            Haskell["haskell"]
            Clojure["clojure"]
            Elixir["elixir"]
            Elm["elm"]
            Erlang["erlang"]
            Scala["scala"]
        end

        subgraph JVM["JVM言語"]
            Java["java"]
        end

        subgraph Document["ドキュメント"]
            Markdown["markdown"]
            LaTeX["latex"]
        end

        subgraph Other["その他"]
            CSharp["csharp"]
            Graphviz["graphviz"]
            Solidity["solidity"]
            WASM["wasm"]
        end
    end
```

## インストールフロー図

```mermaid
flowchart TB
    Start["インストール開始"]

    subgraph Prerequisites["前提条件チェック"]
        GitCheck{git インストール済み?}
        VimCheck{vim or nvim<br/>インストール済み?}
    end

    subgraph Clone["リポジトリ取得"]
        CloneRepo["git clone space-vim"]
    end

    subgraph Setup["セットアップ"]
        DownloadPlug["vim-plug ダウンロード"]
        CreateSymlink["シンボリックリンク作成"]
        CopySpacevim[".spacevim コピー"]
    end

    subgraph Install["プラグインインストール"]
        PlugInstall["PlugInstall 実行"]
    end

    End["インストール完了"]

    Start --> GitCheck
    GitCheck -->|Yes| VimCheck
    GitCheck -->|No| Error1["エラー: git必須"]
    VimCheck -->|Yes| CloneRepo
    VimCheck -->|No| Error2["エラー: vim/nvim必須"]
    CloneRepo --> DownloadPlug
    DownloadPlug --> CreateSymlink
    CreateSymlink --> CopySpacevim
    CopySpacevim --> PlugInstall
    PlugInstall --> End
```
