# Launcherスクリプト暫定仕様書（拡張版）

## 1. 概要

Launcherスクリプトは、`.ini` 風の独自DSLであり、以下を1つのスクリプト内で扱える。

- メニュー／ボタン定義
- 右側ボタン・ツールバーボタン定義
- ダイアログGUI定義
- 設定値の読み書き
- パス操作
- 環境変数や共通変数の初期化
- 外部プログラム起動
- セクション間ジャンプ
- Webやローカルヘルプへのリンク
- コンテキストメニュー生成

この言語は一般的な関数呼び出し型ではなく、**グローバル変数 + セクション + goto 型実行** を基本としている。

---

## 2. 起動シーケンス

Launcher 起動時には、まず `Boot.ini` の `[Boot]` セクションが実行される。  
ここでは、共通変数の初期化、検索パス追加、OS依存パラメータの設定準備、タイトル設定、古いスクリプトの削除などが行われる。

例として、`[Boot]` では次のような処理が行われている。

- 古い `.ini` スクリプトの削除
- ウィンドウタイトル設定
- デバッグ／確認モードの初期設定
- `tklib_path`, `tkdb_path`, `TkPlotDir` などの共通パス設定
- `PATH`, `PYTHONPATH`, `PERL5LIB` などの環境変数拡張
- `python3_path`, `python_path`, `start`, `web_root`, `sphinx_url_base` などの共通変数設定 fileciteturn3file15

さらに OS ごとのセクションがあり、Windows / Darwin / Linux / GNOME ごとに以下が上書き・追加される。

- `batch_ext`, `exe_ext`, `dll_ext`
- `tkapp_path`, `tkapp2_path`
- `start_cmd`, `start_cmd_C`, `start_cmd_K`
- `vesta_path`
- 一部外部アプリの探索や `PATH` 追加

特に Windows では、`start cmd /C` / `start cmd /K` 系の起動変数が定義され、Linux 系では `xterm -e` や shell 実行に置き換えられている。 fileciteturn3file17turn3file19

---

## 3. 実行モデル

### 3.1 セクション

スクリプトはセクションの集合からなる。

例:

```ini
[Button5.Diode]
Caption=pvfit
...
End
```

- セクションは `[SectionName]` で始まる
- `End` が見つかるまで順次実行される

### 3.2 call の意味

```ini
call [pvfit_execute]
```

- `call` はサブルーチン呼び出しではない
- 実体は **goto**
- 戻り値はない
- ローカル変数もない
- コールスタックもない

したがって、Launcher全体は **グローバル変数だけで動く手続き型DSL** とみなせる。

### 3.3 onload / select 系セクション

通常の `[Section]` に加え、次のようなイベント的セクションがある。

- `[Boot]` : 起動時
- `[MenuName].select` : 左リストボックスでそのメニューを選択したとき
- `[TButton].onload` : ツールバーボタン読み込み時
- `[RButton].onload` : 右ボタン読み込み時

例として、`[VASP].select` や `[textbook].select` では、選択時に `section_root_dir` を設定し、ツールチップやコンテキストメニューを追加している。 fileciteturn3file9turn3file3

---

## 4. 変数

### 4.1 特殊変数

1文字の特殊変数がある。

- `$o` : 直前の取得系コマンドの出力値  
  例: `get_open_file_name` の選択ファイルパス
- `$i` : `Launcher.ini` のパス

このほか、実行環境由来の特殊変数がある可能性が高い。

### 4.2 通常変数

`set` 系コマンドや環境変数で定義した変数は、次の形式で参照する。

```ini
$(varname)
```

例:

```ini
set outprefix=test
$(start) "$(editor_path)" "$(outprefix).txt"
```

### 4.3 スコープ

- すべての変数は **Launcher全体でグローバル**
- セクションをまたいで値を保持する

### 4.4 ダイアログ変数

`add_dialog` で作成したウィジェットの値は、指定した変数名に入る。  
必要に応じて `set_dialog_var` でダイアログ側へ値を戻すこともできる。

例として VASP 関連では、要約ファイルを `read_ini` で読み、その結果を `set_dialog_var` でダイアログへ反映している。 fileciteturn3file9

---

## 5. コメント付き値と remove_comment

変数値には、人間向けの `#コメント` を含められる。

例:

```ini
"nelder-mead # Downhill simplex"
"lecture_VOICEVOX_jp #日本語対談で講義の説明"
```

実行時にコメント部分を除いて値だけを使いたい場合は、`remove_comment` を用いる。

```ini
remove_comment method_pvfit
remove_comment prompt_ini
```

この方式により、

- GUI上では説明付き選択肢を見せる
- 実引数では純粋な値だけを渡す

ことができる。  
この使い方は `prompt_ini` や VASP 関連パラメータでも確認できる。 fileciteturn3file12turn3file9

---

## 6. 文字列とクオート

ファイルパスには空白が含まれることがあるため、外部プログラムへ渡すパスは基本的に `"` でクオートする。

例:

```ini
"$(input_path)"
"$(script)"
"$(output_path)"
```

推奨方針:

- 外部コマンドへ渡すパスや文字列は基本的にクオートする
- 特に Windows パスではほぼ必須

---

## 7. パス操作

### 7.1 join_path

`join_path` は、パス構成要素を OS 依存セパレータで連結する。

例:

```ini
join_path script "$(tkprog_X_path)" electrical pvfit.py
```

概念的には `os.path.join(...)` 相当である。

### 7.2 use_os_path_sep

変数内のパス区切りを OS 依存形式へ変換する用途に使われる。

例として Boot では `perllib_path` を `PERL5LIB` へ追加する前に `use_os_path_sep ppath` を使っている。 fileciteturn3file15

### 7.3 関連コマンド

- `get_directory`
- `get_filebody`
- `get_filename`
- `get_drive`
- `get_last_word`
- `get_cur_dir`
- `chdir`

---

## 8. 外部コマンド実行

Launcherは外部ツール実行を主要用途とする。

### 8.1 start / start_cmd 系

```ini
$(start) "$(excel_path)"
$(start_cmd_C) "$(python3_path)" "$(script)" ...
$(start_cmd_K) vaspkit
```

- `$(start)` : 単純な start
- `$(start_cmd_C)` : 実行して終了
- `$(start_cmd_K)` : 実行後も端末を残す

Boot で OS ごとに実体が設定される。Windows では `cmd /C`, `cmd /K` に、Linux では `xterm -e` や shell 実行に対応する。 fileciteturn3file17turn3file19

### 8.2 shell / editor / filer 呼び出し

右ボタンの定義から、Launcher には「標準シェル・ファイラ・エディタ」を呼ぶ共通操作があることが分かる。

- `RButton1` : shell
- `RButton2` : filer
- `RButton3` : editor

これらは `section_root_dir` やカレントディレクトリに対して起動される。 fileciteturn3file13

### 8.3 URL 起動

`$(start) https://...` のように Web URL も直接開ける。

VASP やヘルプ関連で多数使われている。 fileciteturn3file7turn3file16

---

## 9. GUIダイアログ

### 9.1 基本の流れ

ダイアログは概ね次の流れで構築する。

```ini
new_dialog
add_dialog ...
add_dialog ...
custom_dialog "title" close
```

### 9.2 add_dialog の主要サブタイプ

確認できたサブタイプ:

- `choose_file`
- `entry`
- `combobox`
- `spinbox`
- `button`
- `frame`
- `message`
- `label`
- `checkbox`
- `tab`
- `reset_tab`
- `pack_frame`

`textbook.ini` や `VASP.ini` では、かなり大規模なタブ付きダイアログが構築されている。 fileciteturn3file3turn3file4turn3file11

### 9.3 ウィジェット値の受け取り

ダイアログ部品定義の **2行目の変数名** が、そのウィジェットの値を受け取る変数になる。

例:

```ini
add_dialog entry\
  outprefix\
  "label_head=outfile prefix:"\
  width=80\
  "def_val=$(outprefix)"
```

この場合、入力値は `outprefix` に入る。

### 9.4 タブ

`textbook.ini` から、`add_dialog tab ...` と `add_dialog reset_tab dummy` により、タブ付きUIを構築できることがわかる。  
たとえば「main」「AI configuration」「OpenAI API Key」などを切り替える構造が作られている。 fileciteturn3file12turn3file5

### 9.5 複数アクション付きウィジェット

`choose_file` や `combobox` には追加ボタンや追加コマンドを持たせられる。

例:

- `button1_text=media info`
- `button1_command=call [media_inf_execute]`

また VASP のファイル選択UIでは、edit / start / XML viewer / file list / VESTA など複数のボタン操作を同一ウィジェットに持たせている。 fileciteturn3file3turn3file14

### 9.6 行継続

長い `add_dialog` は行末の `\` で継続できる。

---

## 10. メニューとボタン

### 10.1 左リストボックスメニュー

例:

```ini
[VASP].select
[textbook].select
```

これらはメニュー選択時の初期化を担う。  
`section_root_dir` の設定、ツールチップ追加、コンテキストメニュー作成などが行われる。 fileciteturn3file9turn3file3

### 10.2 サブメニューボタン

例:

```ini
[Button1.textbook]
Caption=Convert/Split audio
...
End
```

意味:

- `Button1` : ボタン識別子
- `textbook` : 対象メニュー
- `Caption=...` : GUI上の表示名

### 10.3 ツールバーボタン

`RButton.ini` には上部のツールバーボタン定義が含まれている。

- `[TButton].onload` : ツールチップ設定
- `[TButton1]` : Setup details
- `[TButton2]` : Edit ini file
- `[TButton3]` : log
- `[TButton4]` : Restart
- `[TButton5]` : Boot ダイアログ

Boot ダイアログからは Launcher の再起動や他の Launcher 一覧起動などが行える。 fileciteturn3file2turn3file10

### 10.4 右ボタン

`[RButton].onload` で右側ボタンのツールチップが定義され、`[RButton1]` 〜 で実処理が割り当てられる。

- cmd.exe
- Explorer
- Editor
- Edit script
- Edit system files
- help

などの枠組みがここで定義されている。 fileciteturn3file13turn3file16

---

## 11. コンテキストメニューとツールチップ

### 11.1 add_tooltip

```ini
add_tooltip 1 "Convert movie file to audio file" #dcfbfe #0000ff
```

左ボタン、右ボタン、ツールバーボタンなどに説明を付ける用途で使われる。  
色も指定可能。  
`textbook` や `VASP` の `.select`、`TButton.onload`、`RButton.onload` で広く使われている。 fileciteturn3file3turn3file9turn3file13

### 11.2 create_menu / add_context_menu

`VASP.ini` ではコンテキストメニューが作られている。

```ini
create_menu hmenu "title=examples"\
    "label=BoltzTraP2: show dialog" "command=call [Button10.VASP]"\
    "label=show example dir" "command=call [VASP_BoltzTraP_show_examples]"
add_context_menu hmenu 10
```

これは、対象ボタンに右クリック的な追加メニューを結び付ける仕組みと考えられる。 fileciteturn3file9

---

## 12. 設定ファイル読み書き

### 12.1 read_ini / write_ini

```ini
read_ini $i "textbook" "work_dir" last_dir "."
write_ini $i "textbook" "work_dir" "$(dir_name)"
```

用途:

- 前回開いたフォルダの記憶
- ダイアログ初期値の復元
- 結果ファイルから値の再読み込み

### 12.2 外部設定ファイルの読み込み

`textbook.ini` では `.env` やアカウント情報ファイルを読み込んで API キーを取り込んでいる。

- `read_ini`
- `load_dotenv`
- `set_if_not_blank`

などを組み合わせ、OpenAI / Google API キー設定へつなげている。 fileciteturn3file12

---

## 13. 環境・システム関連コマンド

Boot から、Launcher が単なる GUI スクリプトではなく「環境初期化も担う」ことが分かる。

確認できたもの:

- `add_path PATH ...`
- `add_path PYTHONPATH ...`
- `add_path PERL5LIB ...`
- `search_latest_file ...`
- `use_os_path_sep ...`
- `check_exist ...`
- `exit_if_not_exist ...`
- `del ...`
- `load_menu`

`search_latest_file` は Windows で `csc.exe` を探す用途に使われている。  
`load_menu` はメニュー再読み込みに使われている。 fileciteturn3file17turn3file10

---

## 14. 制御・確認・表示系コマンド

確認できたもの:

- `debug on / off`
- `confirm on / off`
- `show_window NoTopMost`
- `ask_yesno_dialog ...`
- `echo ...`
- `Bye`

右ボタン側では debug / confirm / topmost の説明ダイアログも定義されている。  
VASP では削除処理の前に `ask_yesno_dialog` を使っている。 fileciteturn3file16turn3file9

---

## 15. 大規模スクリプトから見える設計パターン

### 15.1 VASP.ini に見られるパターン

- `.select` でツールチップやコンテキストメニューを付与
- 大きなタブ付きダイアログ
- `remove_comment` を使った選択値の正規化
- 実行前に `work_dir` を `write_ini`
- Python / Perl / 外部GUI(VESTA, VASPKIT など) を連携起動
- `set_dialog_var` で後からダイアログへ値を戻す

VASP 用途では、Launcher が「複雑なワークフローをまとめる前面 GUI」として使われていることがはっきり分かる。 fileciteturn3file9turn3file14turn3file11

### 15.2 textbook.ini に見られるパターン

- 音声変換、文字起こし、翻訳、AI API 利用、TTS などを統合
- `tab` による多段設定UI
- `.env` / APIキーの読込
- 説明付き combobox 値 + `remove_comment`
- `button1_command` などの補助アクション付き choose_file
- OpenAI/Gemini など複数バックエンドの切替

ここでは Launcher が、AI・教材作成系の統合フロントエンドとして使われている。 fileciteturn3file3turn3file4turn3file12

### 15.3 RButton.ini に見られるパターン

- Launcher 自体の制御UIを別スクリプト化
- 右側ボタンやツールバーを独立定義
- 再起動、再読み込み、システムファイル編集などのメタ操作を提供

つまり、Launcher 自身の UI もまた Launcher スクリプトで定義されている。 fileciteturn3file2turn3file13

---

## 16. 代表的な命令一覧（今回確認できたもの）

### 制御
- `call [Section]`
- `End`
- `Bye`

### 変数
- `set`
- `set_if_blank`
- `set_if_not_blank`
- `remove_comment`
- `set_dialog_var`

### パス・ファイル
- `join_path`
- `get_directory`
- `get_filebody`
- `get_filename`
- `get_drive`
- `get_last_word`
- `get_cur_dir`
- `get_open_file_name`
- `get_save_file_name`
- `chdir`
- `copy`
- `del`

### ini / 環境
- `read_ini`
- `write_ini`
- `load_dotenv`
- `add_path`
- `use_os_path_sep`
- `search_latest_file`

### GUI
- `set_title`
- `new_dialog`
- `add_dialog ...`
- `custom_dialog ...`
- `add_tooltip`
- `create_menu`
- `add_context_menu`

### 確認・表示
- `echo`
- `debug on/off`
- `confirm on/off`
- `ask_yesno_dialog`
- `show_window`

### 起動
- `start`
- `$(start)`
- `$(start_cmd)`
- `$(start_cmd_C)`
- `$(start_cmd_K)`

---

## 17. 実装思想の要約

Launcherスクリプトは、単純なメニュー定義ファイルではない。  
実際には次の役割を同時に担う。

- **起動時環境設定**
- **OS依存差異の吸収**
- **GUIフォーム構築**
- **永続設定管理**
- **ワークフローの状態受け渡し**
- **外部プログラム実行**
- **Launcher自身のメタ制御**

この意味で、Launcherスクリプトは

**「グローバル変数を共有する goto 型DSLで、GUI定義・環境初期化・外部ツール実行を統合したランチャー言語」**

と表現するのが最も近い。

---

## 18. 現時点で未確定の点

今回の資料だけでは、以下は未確定である。

- 一般的な `if / else / for / while` の有無
- すべての特殊変数一覧
- `call` の厳密な実装詳細
- `custom_dialog` の全オプション
- `add_dialog` サブタイプごとの完全パラメータ仕様
- `:` で始まる命令（例 `:debug on`）と通常命令の厳密な違い

---

## 19. 参考例ファイル

今回の仕様整理では、少なくとも以下のファイルを参考にした。

- `3-000-Boot.ini` : 起動時処理と OS 別共通変数設定 fileciteturn3file15turn3file17
- `3-001-RButton.ini` : 右ボタン・ツールバー・Launcher 自体の制御UI fileciteturn3file2turn3file13turn3file16
- `6-041-VASP.ini` : 大規模な実務用ワークフロー統合例 fileciteturn3file9turn3file14turn3file11
- `9-200-textbook.ini` : タブ付きGUI、APIキー管理、AI/TTS 連携例 fileciteturn3file3turn3file4turn3file12
