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で書きながらタイムスタンプを打って、それが自分で作ったコマンドというのは、なんか地味に気持ちいいです。