VScodeのターミナル情報ってどうやって記録されるのか[備忘録]

VS Code のターミナルが前回の状態を復元する仕組みは、主に **"Persistent Terminal"（永続的なターミナル）** の機能によるものです。  
具体的には、以下のような方法でターミナルの情報を保存・復元しています。

---

### **1. ターミナルのプロセス管理**
VS Code はターミナルのセッションを **バックグラウンドで管理** しており、エディターを閉じてもターミナルのプロセスは完全には終了しません。  
例えば、VS Code を再起動すると、前回開いていたターミナルが自動的に復元されます。

- Windows: `conpty`（Windows 10 以降）または `winpty`
- macOS/Linux: `pty`（擬似ターミナル）を使用

この機能によって、プロセスが完全に終了しない限り、ターミナルの状態を保持できます。

---

### **2. シリアライズとストレージ**
VS Code はターミナルの情報を **`workspaceStorage` に保存** し、復元時に利用します。

#### **保存される情報**
- ターミナルのセッション ID
- 実行していたシェル（bash、zsh、powershell など）
- ターミナルの作業ディレクトリ（カレントディレクトリ）
- 環境変数（特定のシェルオプションなど）

#### **保存場所**
ローカルの `workspaceStorage` ディレクトリ内に JSON 形式で保存されます。

```
~/.config/Code/User/workspaceStorage/（Linux/macOS）
%APPDATA%\Code\User\workspaceStorage\（Windows）
```

---

### **3. ターミナル復元の流れ**
1. VS Code 起動時に `workspaceStorage` から前回のターミナル情報を取得
2. セッションが生きている場合、同じプロセスに再接続
3. セッションが終了している場合、新しいターミナルを作成し、作業ディレクトリや環境変数を復元
4. ユーザーが `history` コマンドを実行すると、シェルの履歴（.bash_history など）から過去のコマンドを確認可能

---

### **4. コマンド履歴の保持**
実際の **コマンド履歴（history）** は、ターミナル自体の機能によって管理されます。  
例えば：

- Bash/Zsh: `~/.bash_history` や `~/.zsh_history`
- PowerShell: `$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt`
- Fish: `~/.local/share/fish/fish_history`

VS Code 自体はコマンド履歴を保存せず、ターミナルの履歴ファイルを利用します。

---

### **5. もし復元を無効化したい場合**
VS Code の設定で **ターミナルの永続化を無効化** できます。

```json
"terminal.integrated.enablePersistentSessions": false
```

また、手動で `workspaceStorage` を削除することでも復元を防げます。

---

### **まとめ**
- VS Code はターミナルの状態を `workspaceStorage` に保存している。
- シェルの履歴 (`~/.bash_history` など) は VS Code ではなく OS 側が管理。
- `terminal.integrated.enablePersistentSessions` を無効にすれば、復元を防げる。

VS Code は単にターミナルの情報を保存し、再接続しているだけで、履歴の管理はシェル自身が行っています。

VS Code のターミナルの復元に関係する `state.vscdb`、`state.vscdb.backup`、`workspace.json` について、それぞれ詳しく説明します。


---

## **1. `state.vscdb`（ターミナルの状態管理）**
このファイルは、VS Code の **アプリ全体の状態（State）を SQLite データベース形式で保存** するものです。  
ターミナルの永続化だけでなく、ウィンドウの配置、開いていたエディタの状態、拡張機能の状態などが記録されています。

### **主な役割**
- ターミナルのセッション情報（どのシェルを開いていたか、作業ディレクトリなど）を記録
- VS Code のウィンドウレイアウトやエディタの開閉状態を管理
- ユーザーが変更した一時的な UI 設定の保存

### **保存場所**
- **Windows**: `%APPDATA%\Code\User\globalStorage\state.vscdb`
- **macOS**: `~/Library/Application Support/Code/User/globalStorage/state.vscdb`
- **Linux**: `~/.config/Code/User/globalStorage/state.vscdb`

### **確認方法**
このファイルは SQLite 形式なので、`sqlite3` コマンドで開いて中身を確認できます。

```sh
sqlite3 state.vscdb
```

例えば、ターミナルの情報が含まれているか確認するには、以下のような SQL を実行できます。

```sql
SELECT * FROM ItemTable WHERE key LIKE '%terminal%';
```

### **関連ファイル**
- `state.vscdb.backup`：`state.vscdb` のバックアップファイル。VS Code が異常終了した場合に備えて、一つ前の状態を保存。

---

## **2. `workspace.json`（ワークスペースごとの設定管理）**
このファイルは、VS Code がワークスペース（プロジェクトごとの作業環境）の設定を管理するために使います。

### **主な役割**
- **ワークスペースごとのターミナル情報を記録**
  - どのターミナルが開いていたか（bash, zsh, PowerShell など）
  - ターミナルの作業ディレクトリ
  - ターミナルのレイアウト（分割ターミナルの配置など）
- エディタの開いていたファイルやタブの情報を保持
- ワークスペースごとの拡張機能の状態を管理

### **保存場所**
- **Windows**: `%APPDATA%\Code\User\workspaceStorage\<ワークスペースID>\workspace.json`
- **macOS**: `~/Library/Application Support/Code/User/workspaceStorage/<ワークスペースID>/workspace.json`
- **Linux**: `~/.config/Code/User/workspaceStorage/<ワークスペースID>/workspace.json`

`<ワークスペースID>` は、ワークスペースごとに VS Code が自動的に割り当てたランダムな ID になります。

### **確認方法**
このファイルは **JSON 形式** なので、`cat` や `jq` コマンドで中身を確認できます。

```sh
cat ~/.config/Code/User/workspaceStorage/<ワークスペースID>/workspace.json | jq .
```

### **ワークスペースをリセットする場合**
特定のワークスペース設定を削除したい場合は、このファイルを削除すると、次回 VS Code 起動時にデフォルト設定で開くようになります。

---

## **まとめ**
| ファイル名 | 役割 | 保存場所 |
|------------|---------------------------------|--------------------------------------------|
| **state.vscdb** | グローバルな状態管理（ターミナル、ウィンドウレイアウトなど） | `globalStorage/state.vscdb` |
| **state.vscdb.backup** | `state.vscdb` のバックアップ（異常終了時に使用） | `globalStorage/state.vscdb.backup` |
| **workspace.json** | ワークスペースごとのターミナルやレイアウトの記録 | `workspaceStorage/<ワークスペースID>/workspace.json` |

VS Code のターミナル情報は `state.vscdb`（グローバル）と `workspace.json`（ワークスペースごと）で管理されており、次回起動時に復元される仕組みになっています。