Placeholder Form
unlistedby takosasi-dev
Fill the placeholders in section 8 of a spec note with a form. Confirms, keeps a backup, and can undo.
Placeholder Form
仕様書のノートの §8(## 8. … の節)に残っている空欄 {{…}} を、右サイドバーのフォームから埋める Obsidian プラグインです。ノートを書き換えます。 書くのは確認の窓で「書き換える」を押したときだけで、書く前に本文全体の控えを取り、本文が書いた直後のままなら取り消せます。ネットワークには出ません。PC とモバイル(iPhone・Android)の両方に向けて作ってあります。
English summary is at the bottom.
できること
- 空欄をフォームに並べる: 開いている仕様書の §8 の
{{…}}を、小節ごとに、名前・種類(表・コード・インラインコード・文)・行番号・前後の文脈つきで並べます。 - 形を壊す値は断る: 表のセルでは改行を
<br>に、縦棒を\|に直します。コードブロックを閉じてしまう行や、見出しになる行は受け付けません。 - 確認してから書く: 変わる行の前と後を窓で見せ、「書き換える」を押すまで書きません。
- 書く直前に読み直す: フォームを出した後に仕様書が変わっていたら、書きません。
- 構造の検査: 置き換えた後の本文で、ほかの空欄・見出し・コードブロックの形が変わるなら、書きません。
- 控えと取り消し: 書く前の本文全体を控えに残し、直前の書き込みをコマンドから元に戻せます(確認つき)。
- 履歴: 書き込みごとに、今の状態(取り消せる・本文が変わった など)と控えの全文を見られます。
- 同じ名前の欄: 同じ名前の空欄が複数あるときは、1 か所だけ埋めるか、全部に入れるかを選べます。
- 空欄がどの仕様書にいくつ残っているかを一覧で見るのは、別のプラグイン Blocker Board です(読むだけ。無くても使えます)。
向いている vault(前提)
次の形で書いた仕様書ノートを前提にしています。
- 対象は、設定の「仕様書のフォルダ」に入れたフォルダ(既定は空 = 未設定)の下の md で、番号 8 で始まる
##の見出し(## 8. …。以下 §8)がある物 - 空欄は二重の波括弧で
{{名前}}と書く(1 行の中で開きと閉じが揃っている物)。§8 の中の### 8.1 …(### 8-1. …でも同じ)が小節になる
# SampleTool 仕様書
## 8. 実物を貼る節
### 8.1 動作環境
| 項目 | 実物 |
|---|---|
| OS の版 | {{OS_VERSION}} |
| アプリの版 | `{{APP_VERSION}}` |
### 8.2 コマンドの出力
次のコマンドの出力を貼る:
```
{{COMMAND_OUTPUT}}
```
保存先は {{SAVE_DIR}} にする。
## 9. 画面
題は {{TITLE}} にする。
このノートを開くと、フォームに §8 の欄 4(表 2・コード 1・インラインコード 0・文 1)/ §8 の外 1(書き換えない) と出て、小節 8.1 と 8.2 に入力欄が 2 つずつ並びます。OS_VERSION に Windows 11 と入れて確定すると、確認の窓に次の形で出ます。
8.1 7 行目 表
前: | OS の版 | {{OS_VERSION}} |
後: | OS の版 | Windows 11 |
細かい決まり:
- インラインコードの中の
`{{...}}`と`{{…}}`(欄の書き方を説明する文)は、欄にしません。 - §8 の外の
{{…}}(上の例の{{TITLE}})は数だけ出し、書き換えません。
フォルダは既定では決まっていません(未設定)。入れたら、まず設定の「仕様書のフォルダ」を指定してください(下の「入れたら最初に設定する項目」)。節の番号 8 と空欄の形 {{…}} は固定で、変えられません。
入れ方
BRAT で入れる(おすすめ)
- コミュニティプラグインの「BRAT」(Obsidian42 - BRAT)を入れて有効にする。
- BRAT の設定 → 「Add Beta plugin」に
takosasi-dev/placeholder-formを入れる。 - コミュニティプラグインの一覧で「Placeholder Form」を有効にする。
手で入れる
Releases から main.js・manifest.json・styles.css を落とし、vault の .obsidian/plugins/placeholder-form/ に置いて、コミュニティプラグインの一覧で有効にします。
入れたら最初に設定する項目
設定 → Placeholder Form で、仕様書のフォルダを入れます。仕様書を置いているフォルダを、vault からのパスで 1 行に 1 つ(例: Specs や 仕様書)。既定は空(未設定)です。
未設定のあいだは、どのノートも対象にならず、読みも書きもしません。フォームには 仕様書のフォルダが未設定です。設定 → Placeholder Form で指定してください と出ます(起動しただけでは知らせません)。前に書き込んだ記録があるときは、その取り消しと履歴だけは未設定でも使えます。
使い方
- 「仕様書のフォルダ」の下の仕様書を開き、コマンド「Placeholder Form: 欄の入力フォームを開く」でフォームを出す。
- 埋めたい欄に値を打つか貼る。入れない欄は空のままにする。
- 「確定(入力 N 件)」を押し、確認の窓「欄を書き換える」で前と後の行を見て「書き換える」を押す。やめるなら「やめる」を押すか、窓を閉じる。
N か所を埋めたと出る。間違えたら「Placeholder Form: 直前の書き込みを取り消す」。
コマンド
| コマンドパレットに出る名前 | すること |
|---|---|
| Placeholder Form: 欄の入力フォームを開く | 右サイドバーにフォーム「欄の入力フォーム」を出す |
| Placeholder Form: 直前の書き込みを取り消す | いちばん新しい書き込みを、確認の後に控えの本文へ戻す。履歴が無ければ 履歴が無い と出る |
| Placeholder Form: 書き込みの履歴と控えを開く | 全部の仕様書の書き込みの一覧を出す。記録ごとに「取り消す」「控えを見る」 |
既定のホットキーはありません。
画面の見方
- 対象がまだ無いとき:
仕様書を開いて。「仕様書のフォルダ」が未設定のあいだは仕様書のフォルダが未設定です。設定 → Placeholder Form で指定してください 対象: <仕様書のパス>。ほかのノートに移っても前の仕様書のまま残り、「対象外のファイル。前の仕様書のまま」と出ます(値をほかのノートからコピーして戻れます)。- 欄ごとに、名前(押すとその行へ移る)・種類と行番号・文脈(表なら「行の 1 列目 / 列の見出し」)・入力欄。同じ名前の欄が複数あると
名前 #2のように番号が付き、「同じ名前の欄にも入れる(ほか N か所)」のチェックが出ます。名前が英大文字・数字・_だけでない欄には「名前の形でない」の印が付きます(埋めることはできます)。 - 入れられない値には、入力欄の下に理由が出ます。例:
フェンスの行は入れられない(コードブロックが閉じる)・インラインコードの欄なので、1行だけ・二重の開き波括弧は入れられない(欄として数えられる) - 下に「確定(入力 N 件)」「入力を消す」、
欄が無くなった入力(N)、この仕様書の履歴(N) - 履歴の行は
<日時> N か所 <状態>。状態は「取り消せる」(今の本文が書いた直後と同じ)・「書かれていない」(控えと同じ)・「本文が変わった」・「ファイルが無い」の 4 つで、「取り消す」のボタンが出るのは「取り消せる」のときだけです。
設定
| 項目 | 既定 | 内容 |
|---|---|---|
| 仕様書のフォルダ | 空(未設定) | 1行に1つ。vault からのパス。この下の md で §8 がある物を対象にする。未設定(空)だとどのノートも対象にならない。例: Specs や 仕様書 |
| 除くパス | 空 | 1行に1つ。フォルダかファイル。Foo は Foo/ の下だけに効く |
| 欄にしない言及 | ... と … | 1行に1つ。インラインコードの中でこの中身の欄は欄にしない。BlockerBoard と同じ値にする |
| 表のセルの改行 | <br> | 表のセルに入れる値の改行をこの文字にする(例: <br> か、前後に空白を付けた /) |
| 履歴の上限 | 20 | これを超えたら古い記録(控え)から消す |
| 入力の下書きを保存する | オフ | 入力欄から離れたときに data.json に保存し、次にその仕様書を開いたとき戻す |
| 履歴 | N 件(上限 20) | 「履歴をすべて消す」のボタン。確認の後、記録と控えを全部消す |
安全のための決まり
- 書く場所: 対象の仕様書の、§8 の中の空欄の文字(
{{から}}まで)だけを、入れた値に置き換えます。§8 の外の空欄・ほかの行・プロパティ・ほかのノートには書きません。ノートを作る・消す・動かす・名前を変える、もしません。 - 値に手を加えるのは 3 つだけ: 末尾の改行を取る / 複数行の値の改行を、その行の改行(LF か CRLF)にそろえる / 表のセルでは改行を「表のセルの改行」の文字にし、縦棒の前に
\を足す。値の中身は見ません。 - 確認の窓: 確定を押すと、必ず窓「欄を書き換える」が出ます。対象のパス・書き換える数・変わる行ごとの「前: 」「後: 」(長い値は最初の 5 行まで)を見せ、「書き換える」を押すまで書きません。
- 書く直前の確かめ: 窓を出す前に仕様書を読み直し、空欄の並びがフォームと違えば
仕様書が変わったので書かなかった。読み直したと出て書きません。書くときも、その時点の本文が読み直した本文と違えば書きません。 - 構造の検査: 置き換えた後の本文を読み直し、残りの空欄の並び・見出しの並び・コードブロックの区切りの数・§8 の外の空欄の数が変わらないこと、入れた値を除くと元の本文と同じになることを確かめます。1 つでも外れると
書かなかった: <理由>と出て書きません。 - 控え: 書くたびに、書く前の本文全体を、このプラグインの
data.json(プラグインのフォルダ)に残します。vault に控えのノートは作りません。控えを保存してから書き、保存できなければ控えを保存できなかったので書かなかったと出て書きません。 - 取り消しの仕方: コマンド「直前の書き込みを取り消す」か、履歴の「取り消す」を押し、確認の窓「書き込みを取り消す」で「取り消す」を押すと、本文全体を控えに戻します。取り消せるのは、今の本文が書いた直後と同じときだけです(後から足された変更を黙って消さないため)。取り消すとその記録は消え、取り消しの取り消しはありません。取り消せないときは窓「控え(書き換え前の本文)」が開き、埋めた行の前と後と、書く前の全文を見られます(戻すのは手で行います)。
- 控えの大きさ: 控えは「履歴の上限」(既定 20 件)まで残り、超えたら古い記録から消えます。控えは本文の全文で、大きさの上限は無いので、
data.jsonはおおよそ「ノートの大きさ × 件数」ぶん大きくなります。上限を下げても、消えるのは次に書いたときです。すぐ減らすには設定の「履歴をすべて消す」を押します(消すと、それらの書き込みは取り消せなくなります)。 - 編集画面の保存: 確定か取り消しを押すと、まずその仕様書を開いている編集画面を保存させてから読み直します。確認の窓より前なので、「やめる」を押してもこの保存は済んでいます。
data.jsonに入る物: 設定・履歴と控え。「入力の下書きを保存する」をオンにすると、入力中の値も入ります(オフにすると、保存済みの下書きは消えます)。data.jsonが読めないときは、確定と取り消しを止め、何も保存しません。- 外に出す物: ネットワークに出ません。Node.js / Electron の機能を使いません(モバイルでも動く作りです)。クリップボードに書くのは、控えの窓で「控えの全文をコピー」を押したときだけです。
動作確認の状況
- 版 0.1.1。Windows の Obsidian 1.14.4 で動作を確認(フォームの表示、1 つの欄に入れて確定 → 確認の窓 → ファイルはその 1 行だけが変わる → 「直前の書き込みを取り消す」で書く前とバイト単位で同じに戻る)
- iPhone・Android の実機は未確認(モバイル表示のエミュレーションで読み込みと表示まで確認)
- まだ確かめていない事: 打ちかけの文字がある編集画面を開いたまま書いたときの動き、表の中の
<br>の見え方、モバイルで「控えの全文をコピー」が働くか。確認の窓を出している間に本文が変わったら書かないこと・改行が CRLF のノートは、テストでは確かめましたが Obsidian の画面では未確認です。 - フォルダが未設定のときにフォームに案内が出ること(0.1.1 で足した)は、Obsidian の画面でも確かめました。
- 初めて使うときは、写しの vault か、消えても困らないノートで 1 度動きを見てください。
分かっている限界
- 節の番号 8 と空欄の形
{{…}}は固定です。ほかのノートの{{…}}(テンプレートなど)は対象になりません。 - 1 度埋めた欄は無くなります。値の後ろに欄を残す機能はありません。欄を足す・消す・名前を変える、もしません。
- 取り消しは本文全体を控えに戻す方式です。書いた後に 1 文字でも変わっていると、取り消せません。
- 控えは件数で数え、大きさでは止めません。履歴と控えは 1 つの
data.jsonに入ります。複数の端末でdata.jsonを同期しているときに、片方の端末の履歴が残るかは未確認です。 - 名前を押して行へ移る動きは、カーソルを置く方法です。閲覧モード(読み取りビュー)では未確認です。
開発
npm install
npm run build # main.js を作る(型チェックつき)
npm test # vitest
npm run lint # eslint-plugin-obsidianmd
読み取り・置き換えの計画・構造の検査(src/parse/・src/fill/)は obsidian を import しない関数で、書き込みの手順は偽の関数で試します。テストは作り物のノートだけを使います。
ライセンス
MIT。LICENSE を見てください。
English summary
Placeholder Form fills the placeholders ({{…}}) in section 8 of a spec note from a form in the right sidebar. It modifies your notes.
- First-time setup: the spec folder (「仕様書のフォルダ」) is empty by default. Set it in Settings → Placeholder Form (e.g.
Specs). Until then no note is a target, nothing is read or written (undo of earlier writes still works), and the form says so. - It expects notes under that folder that have a
## 8. …section, with placeholders written as{{NAME}}under### 8.1 …subsections. The section number 8 and the{{…}}shape are fixed. - It replaces only the placeholder text inside section 8 with the value you entered. Placeholders outside section 8, other lines, properties and other notes are never written.
- Before writing it always shows a confirmation dialog with the before/after lines, re-reads the note, and refuses to write if the note changed or if the replacement would alter other placeholders, headings or code fences.
- Before each write, the full text of the note is saved as a backup in the plugin's
data.json(default: last 20 writes; full text each, no size cap, sodata.jsongrows with note size × count). - Undo restores the whole note from the backup, only while the note is still exactly as the plugin left it. Otherwise it shows the backup so you can restore by hand.
- Clicking confirm or undo first saves any open editor of that note. The clipboard is written only when you press the copy button in the backup dialog. No network requests, no Node.js or Electron APIs.
- Install with BRAT (
takosasi-dev/placeholder-form) or copymain.js,manifest.jsonandstyles.cssfrom the latest release into.obsidian/plugins/placeholder-form/. - The UI is in Japanese. Tested on Obsidian 1.14.4 for Windows only; mobile was checked only with mobile emulation, not on real devices. Try it on a copy of your vault first.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.