追記: よりよい方法を思いついたので、ver.2を書きました
以下は追記前の本文です
新卒で入ってからずっと業務の日報を個人的につけてます。日報があると便利なことは多くて、たとえば連休前になにをやっていたのかを思い出したりするときに便利です。
ほぼ毎日日報をつけるには、とにかく書き始めるまでのハードルを下げるのが大事です。僕は memo コマンドを叩くとすぐ日報が書けるようにしています。今回はそのコマンドについて紹介します。
日報を即書ける memo コマンドの仕様
memo コマンドの仕様は以下のとおりです。
- memo コマンドを叩くと ~/Documents/daily-report/{今年}/{今月}.md が vim で開かれる
- もし日報ファイルがなければ作成してから vim で開く
- 日報ファイルを作成する際、
# 2024/06/18(火)のように平日すべての見出しをつくる - 開いたとき、今日の見出し位置にカーソルが当たるようにする (さらに、マークもつける)
実際に叩くとこんな感じになります。

memo コマンドの実装
shell command はこんな感じです
memo() {
local dailyDir="$HOME/Documents/daily-report"
if [ $# -eq 2 ]; then
local yyyy=$1
local mm=$(printf "%02d" $2)
nvim "$dailyDir/$yyyy/$mm.md"
return
fi
if [ $# -eq 1 ]; then
local yyyy=$(date +%Y)
local mm=$(printf "%02d" $1)
nvim "$dailyDir/$yyyy/$mm.md"
return
fi
local current_daily_file="$dailyDir/$(date +%Y/%m.md)"
if ! [ -f "$current_daily_file" ]; then
# 日記ファイルがまだないとき、ファイルを作る
mkdir -p "$dailyDir/$(date +%Y)"
node "$dailyDir/create.js" $(date +%-m) >$current_daily_file
fi
todays_position="$(cat $current_daily_file | rg "$(date +%Y/%-m/%-d)\(" --line-number | cut -d':' -f1)"
if [ -z "$todays_position" ]; then
# なぜか今日の日付が見当たらないときはそのまま開く
nvim "$current_daily_file"
else
# 1. 今日の位置にnマークをつける
# 1. 昨日の位置にyマークをつける
# 1. 今日の位置に移動する
nvim "$current_daily_file" \
-c "normal ${todays_position}G" \
-c 'normal mn' \
-c "/^# $(date +%Y)" \
-c 'normal my' \
-c 'let @/=""' \
-c 'normal `n'
fi
}
create.js
/** * @file 日報を生成するプログラム。 * node create.js [month] [year] * month, year は省略可能。指定しなかった場合、来月の日報が出力される */ const today = new Date(); const [ _command, _file, month = today.getMonth() + 2, year = today.getFullYear(), ] = process.argv; const date = (d) => new Date(parseInt(year, 10), parseInt(month, 10) - 1, d, 0, 0, 0, 0); const res = []; for (let i = 1; i <= 31; i++) { const d = date(i); if (date(1).getMonth() != d.getMonth()) break; if (d.getDay() === 0 || d.getDay() === 6) continue; res.push( `# ${d.getFullYear()}/${d.getMonth() + 1}/${d.getDate()}(${ '日月火水木金土'[d.getDay()] })` ); } res.reverse(); console.log(res.join('\n'));