Obsidianでデイリーノートを書くとき、タイムスタンプを挿入する機会がけっこうあります。「何時に起きた」「何時にコーヒーを淹れた」みたいな記録で、ずっとRaycastのスニペットで対応していました。timeと打つと今の時刻に展開されるやつで、これが地味に便利でした。

ところが最近ObsidianにVimモードを導入してから、このスニペットの挙動がちょっとおかしくなってきました。入力してもラグがあったり、うまく展開されないことが増えてきて。Vimモードとの相性なのか、仕様の問題なのかはよくわからないんですが、使うたびに「あ、またか」と思うようになっていました。

ちょうどVimのコマンドを少しずつ覚えている最中だったので、「これもVimコマンドで実装できないかな」と思って試してみることにしました。

いくつか試したんですが、Obsidianのプラグイン仕様的になかなか上手くいかないものもありました。最終的に<C-t>(Ctrl+t)に落ち着きました。.obsidian.vimrcに書いた内容はこんな感じです。

" タイムスタンプを行頭に挿入(HH:MM形式)
exmap insertTimestamp jscommand { const now = new Date(); const h = String(now.getHours()).padStart(2, '0'); const m = String(now.getMinutes()).padStart(2, '0'); const ts = h + ':' + m + ' '; const cur = editor.getCursor(); const line = editor.getLine(cur.line); editor.setLine(cur.line, ts + line); }

nmap <C-t> :insertTimestamp<CR>

exmapでJavaScriptのコマンドを定義して、nmapでキーに割り当てます。ノーマルモードで<C-t>を押すと現在時刻(HH:MM形式)が行頭に入ります。Raycastスニペットと違ってラグもなく、Vimモード中でもちゃんと動きます。

出来上がった瞬間、ちょっと「お!」ってなりました。デイリーノートをVimで書きながらタイムスタンプを打って、それが自分で作ったコマンドというのは、なんか地味に気持ちいいです。