Obsidian.nvimでFrontmatterに更新日時を入れる #
普段からメモ書きやノートはObsidianでとっているが,
Obsidian本体の機能を使わないときはneovimでMarkdownを編集している.
neovimではプラグインのobsidian.nvimにより,
WikilinkやBacklinkなどのObsidianの基本機能がneovimで使える.見た目もちょっとリッチになる.
Obsidian以外でもMarkdownを書くことはあるので,Obsidian Vaultの中でのみobsidian.nvimをロードする
構成をとっている.
Obsidian本体では,プラグインでFrontmatterに更新日時・作成日時を自動で差し込むようにしているが, obsidian.nvimでも同様の機能を再現できる.
obsidian.nvimのoptionにfrontmatterという項目があり,これはノートの保存時に行うfrontmatterの更新
をカスタマイズできる.
実際に更新を行う関数をfrontmatter.funcで設定可能だ.
デフォルトでは既存のfrontmatter項目を維持し,id, aliases, tagsがなければ新規に追加するような仕様だ.
---@param note obsidian.Note
---@return table<string, any>
M.frontmatter = function(note)
local out = { id = note.id, aliases = note.aliases, tags = note.tags }
if note.metadata ~= nil and not vim.tbl_isempty(note.metadata) then
for k, v in pairs(note.metadata) do
out[k] = v
end
end
return out
endちなみに,obsidian.nvimではfrontmatterのうちid, aliases, tagsを特別扱いしていて,
これらはobsidian.Noteの直下に保持される.
その他の有象無象はobsidian.Note.metadataにまとめられる.
このデフォルトのふるまいに,createdとupdatedを自動付加・更新する処理を追加した.
1frontmatter = {
2 enabled = true,
3 ---@return table
4 func = function(note)
5 local out = { id = note.id, aliases = note.aliases, tags = note.tags }
6 if note.metadata ~= nil and not vim.tbl_isempty(note.metadata) then
7 -- Set created/updated time
8 local curtime, _ = tostring(os.date("%Y-%m-%dT%H:%M:%S%z")):gsub("(%d%d)$", ":%1")
9 if note.metadata["created"] == nil then
10 note.metadata["created"] = curtime
11 end
12 note.metadata["updated"] = curtime
13 for k, v in pairs(note.metadata) do
14 out[k] = v
15 end
16 end
17
18 return out
19 end,
20},単純にISO 8601に整形した日時をnote.metadataに差し込んでいるだけだ.
このあとのforループで,実際に関数が返す連想配列に値が入る.
これでObsidian本体と遜色ない使い勝手に近づいた.