メインコンテンツへスキップ
  1. Footprints/
  2. Footprints of 2026-01/

2026-01-04

·1 分·

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がなければ新規に追加するような仕様だ.

lua/obsidian/builtin.lua
---@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にまとめられる.

このデフォルトのふるまいに,createdupdatedを自動付加・更新する処理を追加した.

 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本体と遜色ない使い勝手に近づいた.

著者
Myuu
CS Researcher