Obisidanで長文を書くときはLongformやFolder Note、Advanced Mergerといったプラグインを駆使するようですが、どうもピンと来ませんでした。 緻密に考えられているんですよね。 フロントマターに管理情報を入れて運用する。
緻密なのは頭が喜ぶだけ。 身体は喜ばない。 もっと雑に使いたい。
コンセプト
二段階方式を考えました。 プレイリストをまず作り、その順番で連結ファイルを作成する。 つまりプレイリストを定義ファイルとし、それに合わせマージする方式です。
日頃はプレイリストを書き換えるだけ。 仕上げまでは原稿に集中できます。
Playlist.md
Templaterスクリプトです。 dataviewも必要。
<%* p = tp.file.folder(true) + "/" q = "playlist" t = tp.file.title if(t == q){ s = tp.file.content d = s.match(/^## \[\[.+?\]\]/mg) q = "merge" s = "" for(i=0;i<d.length;i++){ f = p + d[i].replace(/## \[\[(.+?)\]\]/mg, "$1.md") b = app.vault.getAbstractFileByPath(f) s+= await app.vault.read(b) + "\n" } }else{ const d = DataviewAPI.pages("") .filter(x => x.file.path.includes(p)) .filter(x => !x.file.name.includes(q)) .filter(x => !x.file.name.includes("merge")) .sort(x => x.file.name) .map(x => "## [[" + x.file.name + "]]") s = p + "\n\n" + d.join("\n\n") } f = p + q + ".md" p = app.vault.getAbstractFileByPath(f) if(p){ if(q != "merge"){ s = await app.vault.read(p) if(s.search(t) < 0) s+= "\n\n## [[" + t +"]]" } await app.vault.modify(p, s) }else{ p = await app.vault.create(f, s) } app.workspace.activeLeaf.openFile(p) %>
Commanderでタブバーに置くと便利。
プレイリスト
原稿となるファイルを一つのフォルダに集めてください。 次に、どれかのファイルでPlaylistスクリプトを実行する。 するとプレイリスト(playlist.md)が作られます。
プレイリストにはフォルダ内のファイルがリストアップされます。 内部リンクになっているので、タップすれば元のファイルが開く。 目次代わりになります。
右サイドパネルの「アウトライン」で並べ替えることもできます。
すでにプレイリストがある場合
すでにプレイリストがあればそれを開きます。 ただし、Playlistスクリプトを実行したファイルがまだプレイリストに記載されていなかった場合は、 そのファイルを追記します。 つまり、新しく書いた分をあとからプレイリストに載せます。
マージ
playlist.mdでPlaylistスクリプトを実行するとファイルを連結します。 merge.mdに出力され、それを開きます。 あとはお好きにしてもらうだけ。
プレイリストの並び順に合わせて原稿をマージします。 インデントされた項目はスキップします。 このルールでプレイリストを編集すると良いでしょう。
まとめ
ScrivenerやUlyssesに近づけたかな。