# 非機能要件定義書

## 概要

本ドキュメントは、space-vim（Vim/NeoVim向けディストリビューション）プロジェクトの非機能要件を定義するものである。space-vimはVim/NeoVimのプラグイン管理と設定を統合的に提供するフレームワークであり、エディタの拡張性と使いやすさを両立させることを目的としている。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| Vim起動時間 | 最小限（遅延読み込み適用） | `timer_start`による遅延読み込み機能を実装。プラグインは200ms〜1000msの間隔で段階的にロード |
| プラグインロード | 段階的ロード（200ms〜1000ms間隔） | `spacevim#defer`モジュールで制御。ale(200ms)、airline(250ms)、git(300ms)、fzf(700ms)、ycm(1000ms)等 |
| キャッシュ読み込み | 即時（ファイル存在時） | `info.vim`キャッシュファイルを利用。存在しない場合は動的生成 |
| ALE補完遅延 | 500ms | `g:ale_completion_delay = 500` |
| ALEエコー遅延 | 20ms | `g:ale_echo_delay = 20` |
| ALEリント遅延 | 500ms | `g:ale_lint_delay = 500` |
| LSP updatetime | 300ms | `set updatetime=300`（CursorHold/CursorHoldI用） |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| レイヤー同時読み込み | 制限なし | レイヤーシステムにより柔軟に拡張可能 |
| プラグイン管理数 | vim-plugの制限に依存 | vim-plugによる並列インストール・更新をサポート |
| ファイルタイプサポート | 25種類以上 | ftplugin配下で定義（c, cpp, css, go, html, java, javascript, markdown, php, python, rust, sh, tex, typescript, vim, vue等） |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 対応プラットフォーム | macOS, Linux, Windows | `g:spacevim.os`で自動検出。Windowsは特別なruntimepath設定を適用 |
| Vim/NeoVim互換性 | Vim 8+, NeoVim 0.2.3+ | `has('patch-8.0.1206')`, `has('nvim-0.2.3')`で機能分岐 |
| プラグイン欠落時の動作 | 自動検出・インストール促進 | `spacevim#vim#plug#check()`で欠落プラグインを検出し、ダイアログ表示 |
| 設定ファイル欠落時 | エラーメッセージ表示 | `.spacevim`未存在時は警告を表示 |
| キャッシュ破損時 | 自動再生成 | `spacevim#cache#init()`で再構築 |

## セキュリティ要件

### 外部リソースアクセス

- **vim-plugダウンロード**: HTTPS経由で`raw.githubusercontent.com`からダウンロード
- **プラグインリポジトリ**: GitHubからHTTPS経由でクローン
- **インストールスクリプト**: `curl`によるHTTPSダウンロード、`set -eo pipefail`でエラーハンドリング

### コード実行

- **VimScript実行**: 信頼されたソースからのスクリプトのみ実行
- **Python連携**: `has('python')` / `has('python3')`で利用可能性を確認後に実行
- **外部コマンド実行**: `AsyncRun`を使用した非同期実行をサポート

### 認証・認可

- **GitHub Actions**: `secrets.github_token`を使用したCI/CD認証
- **ローカル設定**: ユーザーホームディレクトリの`.spacevim`ファイルによるカスタマイズ

## 拡張性要件

### レイヤーアーキテクチャ

- **モジュラー設計**: spacemacsにインスパイアされたレイヤーシステムを採用
- **トピック分類**: `+vim`, `+version-control`, `+checkers`, `+completion`, `+tools`, `+distributions`, `+programming`, `+themes`, `+lang`, `+fun`, `+misc`の11カテゴリ
- **レイヤー構成**: 各レイヤーは`packages.vim`（プラグイン定義）と`config.vim`（設定）で構成
- **プライベートレイヤー**: `private/`ディレクトリによるユーザー独自のレイヤー追加をサポート

### カスタマイズ機能

- **UserInit()関数**: ユーザー独自のプラグイン追加
- **UserConfig()関数**: デフォルト設定のオーバーライド
- **Layer()コマンド**: レイヤーの有効化と除外設定
- **g:spacevim_layers**: レイヤー一括設定用変数

### プラグイン管理

- **vim-plug統合**: プラグインの追加・更新・削除をサポート
- **遅延読み込み**: `on_event`オプションによるイベントベースのロード
- **プラグイン除外**: `exclude`オプションによる特定プラグインの除外

## 保守性要件

### コード構造

- **ディレクトリ構成**: `core/`（コア機能）、`layers/`（レイヤー）、`private/`（プライベート設定）の分離
- **autoload機構**: Vimのautoload機能を活用した遅延ロード
- **ftplugin**: ファイルタイプ別の設定を分離管理

### ドキュメント

- **README.md**: プロジェクト概要、インストール手順、使用方法を記載
- **CHANGELOG.md**: バージョン履歴と変更内容を管理
- **レイヤー別README**: 各レイヤーの機能説明と設定方法を記載
- **ヘルプファイル**: `core/doc/spacevim.txt`によるVimヘルプ統合

### バージョン管理

- **Git管理**: `.gitignore`によるキャッシュファイル等の除外
- **バージョン番号**: `g:spacevim.version = '0.9.0'`で管理
- **ブランチ戦略**: `master`ブランチをメインとして使用

## 運用・監視要件

### CI/CD

- **GitHub Actions**: プッシュ・プルリクエスト時に自動実行
- **vint**: VimScriptの静的解析（reviewdog統合）
- **ShellCheck**: シェルスクリプトの静的解析
- **インストールスクリプトテスト**: `install.sh`の自動テスト

### デバッグ・診断

- **SpaceInfoコマンド**: システム情報の表示（`spacevim#debugging#Info()`）
- **LayerStatusコマンド**: レイヤー状態の確認
- **LayerCacheコマンド**: キャッシュの再生成

### ログ機能

- **LSPログ**: `/tmp/LanguageClient.log`, `/tmp/LanguageServer.log`への出力
- **各種言語サーバーログ**: `/tmp/cq.log`（C/C++）, `/tmp/gols.log`（Go）, `/tmp/pyls.log`（Python）

### インストール・更新

- **ワンライナーインストーラー**: `curl`による簡易インストール
- **Makefileサポート**: `make vim`, `make neovim`, `make update`, `make uninstall`
- **バックアップ機能**: 既存設定の自動バックアップ（タイムスタンプ付き）
- **vim-plug自動ダウンロード**: 未インストール時に自動取得

## 備考

### 対応言語・フレームワーク

space-vimは以下の言語・フレームワーク向けのレイヤーを提供している：

- **プログラミング言語**: Go, Python, Rust, JavaScript, TypeScript, C/C++, Java, Ruby, Haskell, Scala, Clojure, Elixir, Erlang, Elm, C#, Solidity, WASM
- **マークアップ・設定**: HTML, CSS, Vue, Markdown, LaTeX, Graphviz
- **開発ツール**: Git, GitHub, Docker, LSP, ctags, cscope, fzf, tmux

### 依存関係

- **必須**: Git, Vim 8+ または NeoVim
- **推奨**: fzf, ripgrep(rg), ag, Python 3
- **オプション**: 各言語のLanguage Server

### ライセンス

MIT License (Copyright (c) 2016-2018 Liu-Cheng Xu)
