# 画面設計書 29-Deft

## 概要

本ドキュメントは、Doom EmacsのDeft機能の画面設計について記述します。Deftは、プレーンテキストのノートを高速に作成、閲覧、フィルタリングするためのノート管理インターフェースです。

### 本画面の処理概要

Deftは、指定されたディレクトリ内のノートファイル（org、md、tex等）をインクリメンタル検索でフィルタリングし、素早くノートにアクセスできるインターフェースを提供します。Notational Velocity（macOSのノートアプリ）にインスパイアされた設計で、思考を素早く記録し、後から効率的に検索できます。

**業務上の目的・背景**：日々の作業でアイデアやメモを素早く記録し、後から検索して参照する必要があります。Deftは、ファイル名やコンテンツに基づくインクリメンタル検索により、大量のノートから目的の情報を瞬時に見つけることを可能にします。org-mode、markdown、LaTeXなど様々な形式に対応し、既存のノートワークフローに統合できます。

**画面へのアクセス方法**：以下の方法でDeft画面にアクセスします：
- `M-x deft` コマンドを実行
- Evil使用時：`SPC n d`（デフォルトのキーバインドが設定されている場合）

**主要な操作・処理内容**：
1. `deft` コマンドを実行
2. deft-directoryに設定されたディレクトリ内のノートファイルを一覧表示
3. フィルター入力でインクリメンタルに絞り込み
4. Enterキーでノートを開く
5. 新規ノート作成、名前変更、削除などの操作

**画面遷移**：
- 入力元：任意の画面から `deft` コマンド実行
- 出力先：選択したノートファイルの編集バッファ

**権限による表示制御**：権限による制御はありません。ファイルシステムのアクセス権限に従います。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Doomコアシステム | 主機能 | ノート検索・管理機能（deft連携） |

## 画面種別

一覧（ノート一覧・検索）

## URL/ルーティング

N/A（Emacsバッファ上で動作するため、URLの概念なし）

## 入出力項目

| 項目名 | 入力/出力 | データ型 | 説明 |
|--------|----------|----------|------|
| deft-directory | 入力 | string | ノートファイルの格納ディレクトリ |
| deft-default-extension | 入力 | string | 新規ノートのデフォルト拡張子（デフォルト: "org"） |
| deft-extensions | 入力 | list | 対応する拡張子のリスト |
| deft-use-filename-as-title | 入力 | boolean | ファイル名をタイトルとして使用するか |
| deft-use-filter-string-for-filename | 入力 | boolean | フィルター文字列をファイル名に使用するか |
| deft-auto-save-interval | 入力 | float | 自動保存間隔（-1.0で無効） |
| deft-file-naming-rules | 入力 | alist | ファイル名生成規則 |

## 表示項目

| 項目 | 説明 |
|------|------|
| フィルター入力エリア | インクリメンタル検索用の入力フィールド |
| ノート一覧 | フィルターに一致するノートのリスト |
| ノートタイトル | 各ノートのタイトル（ファイル名またはコンテンツから抽出） |
| ノートサマリー | 各ノートの冒頭テキストのプレビュー |
| 更新日時 | 各ノートの最終更新日時 |

## イベント仕様

### 1-ノート検索/フィルタリング

フィルター入力に応じてノート一覧を絞り込みます。

**処理フロー**：
1. フィルター文字列を入力
2. `deft-filter` が呼び出される
3. ノートのタイトル/コンテンツと照合
4. マッチするノートのみを一覧表示

### 2-ノートを開く

選択したノートを編集バッファで開きます。

**処理フロー**：
1. ノート上でEnterキーまたはクリック
2. `deft-open-file` が呼び出される
3. 対応するファイルを編集バッファで開く

### 3-新規ノート作成

新しいノートを作成します。

**処理フロー**：
1. `C-n`（deft-new-file）または`C-m`（deft-new-file-named）
2. フィルター文字列をファイル名として使用（`deft-use-filter-string-for-filename`有効時）
3. ファイル名生成規則（`deft-file-naming-rules`）を適用
4. 新規ファイルを作成して編集バッファを開く

### 4-ノート削除

選択したノートを削除します。

**処理フロー**：
1. `C-d`（deft-delete-file）または`d`（Normalモード）
2. 確認プロンプト表示
3. ファイルを削除

### 5-ノート名前変更

選択したノートの名前を変更します。

**処理フロー**：
1. `C-r`（deft-rename-file）または`r`（Normalモード）
2. 新しいファイル名を入力
3. ファイルをリネーム

## データベース更新仕様

N/A（ファイルシステムを直接操作）

## メッセージ仕様

N/A（標準的なEmacsメッセージを使用）

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| deft-directory未設定 | 設定を促すメッセージ表示 |
| ファイルアクセス権限なし | 標準エラー表示 |

## 備考

- 自動保存は無効化されている（`deft-auto-save-interval -1.0`）
- ファイル名はkebab-case（小文字、ハイフン区切り）に変換される
- tex拡張子も対応拡張子に追加されている
- Evilモード使用時は初期状態がinsertモード（即座にフィルタリング開始）
- `doom-mark-buffer-as-real-h` によりdeftバッファはリアルバッファとして扱われる

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

設定変数がDeftの動作を制御します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config.el | `modules/ui/deft/config.el` | 設定変数の初期化（行6-16） |

**読解のコツ**: `setq` でdeft-*変数を設定しています。`deft-file-naming-rules` はalistで、ファイル名変換規則を定義しています。

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

deftコマンドの設定を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config.el | `modules/ui/deft/config.el` | `use-package! deft` ブロック（行3-46） |

**主要処理フロー**:
1. **行4**: `:commands deft` で遅延読み込み
2. **行6-16**: 初期設定
3. **行18**: tex拡張子を追加
4. **行19**: deft-mode-hookで `doom-mark-buffer-as-real-h` を実行
5. **行21**: Evil使用時の初期状態を `insert` に設定

#### Step 3: キーバインドを理解する

操作コマンドのキーバインドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config.el | `modules/ui/deft/config.el` | キーバインド定義（行22-46） |

**主要処理フロー**:
- **行23-24**: Normalモードでの操作（`gr`でリフレッシュ、`C-s`でフィルター）
- **行25-28**: Insertモードでの操作（`C-n`新規、`C-d`削除等）
- **行29-34**: Normalモードでの操作（`r`リネーム、`a`新規等）
- **行35-46**: Localleaderでの操作

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

```
M-x deft
    │
    └─ deft-mode 有効化
           │
           ├─ deft-directory スキャン
           │         │
           │         └─ 対応拡張子のファイル取得
           │
           ├─ doom-mark-buffer-as-real-h
           │
           └─ set-evil-initial-state! 'insert
                      │
                      ▼
              フィルター入力待ち
                      │
          ┌───────────┼───────────┐
          │           │           │
          ▼           ▼           ▼
      フィルター    ノート開く    新規作成
          │           │           │
          ▼           ▼           ▼
    deft-filter   deft-open   deft-new-file
```

### データフロー図

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

deft-directory ───▶ ファイルスキャン ───▶ ノート一覧
       │
       └─ "~/notes"

フィルター入力 ───▶ deft-filter ───▶ フィルタリング結果
       │                                    │
       └─ "meeting"                         ▼
                                   マッチするノートのみ表示

deft-file-naming-rules ───▶ ファイル名生成 ───▶ 新規ファイル名
       │
       └─ ((noslash . "-")
           (nospace . "-")
           (case-fn . downcase))

"Meeting Notes" → "meeting-notes.org"
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config.el | `modules/ui/deft/config.el` | ソース | パッケージ設定、キーバインド |
| packages.el | `modules/ui/deft/packages.el` | 設定 | deftパッケージの依存定義 |
| README.org | `modules/ui/deft/README.org` | ドキュメント | モジュール説明書、設定例 |
| .doommodule | `modules/ui/deft/.doommodule` | 設定 | Doomモジュールメタデータ |
