vimで日報を書く

一言で書いてしまうと、

```
alias memo vim ~/doc/memos/$(date +'%Y%m%d').txt
```

というような alias を定義して、日ごとのテキストファイルを開けるようにしておくというだけの話です。ただ、これだけだと閲覧が少々不便なので、実際には以下のようなシェルスクリプトを作っています。

```bash:memo.sh
#!/bin/sh

MEMODIR=~/doc/memos
TMPFILE=$(mktemp)
PAGER=${PAGER-less}

function rm_tmpfile {
  [[ -f "$TMPFILE" ]] && rm -f "$TMPFILE"
}
trap rm_tmpfile EXIT
trap 'trap - EXIT; rm_tmpfile; exit -1' INT PIPE TERM


function edit_memo {
  vi "${MEMODIR}/$(date +'%Y%m%d').txt"
}

function view_memo {
  if [ $# -lt 1 ]; then
    pattern=`date +%Y%m`
  elif [ "$1" = "all" ]; then
    pattern=""
  else
    pattern=$1
  fi

  memos=`find $MEMODIR -name "${pattern}[0-9]*.txt" | sort`
  for memo in $memos; do
    echo $memo | awk -F/ '{print "\[\[\[" $NF "\]\]\]\n"}' >> $TMPFILE
    cat $memo >> $TMPFILE
    perl -le 'print "\n" . "="x80' >> $TMPFILE
  done

  if [ -p /dev/stdout ]; then
    cat $TMPFILE
  else
    $PAGER $TMPFILE
  fi
}


if [ $# -lt 1 ]; then
  edit_memo
elif [ "$1" = "edit" ]; then
  edit_memo
elif [ "$1" = "view" ]; then
  view_memo $2
fi
```

以下の alias も定義しておきます。

```
alias memo="~/bin/memo.sh"
alias memoview="~/bin/memo.sh view $@"
```

これで、

```shell
$ memo
```

とすれば今日の日報ファイルを開いて vim が立ち上がります。

```shell
$ memoview
```

とすれば今月の日報を連結してビューワが立ち上がります。

```shell
$ memoview 202001
$ memoview all
```

というように対象年月を指定したり、全ての日報を連結することもできます。

## 他の方法と比べて

### 紙のノートに手書き

私は以前は紙のノートに日報をつけていました。日報と言ってますが実際には上司に提出したりするわけではなく、自分の覚え書きです。その日に実際に作業したこと、調べたこと、考えたことなどを書き記します。特に考え事をする際には紙は最高のデバイスなのですが、記録性や検索性では大きく劣ります。コピペもできませんし。

### チャットツールの分報

私は経験がないのですが、チャットツールを使った分報もあります。vim 日報と同じくテキストデータなので、スニペットやコマンド履歴なども残せること、他のメンバーからコメントをもらえること、メッセージごとにタイムスタンプが自動で付くなどは便利です。

一度送信してしまうと編集しにくい。分報はどちらかというとログ的に都度吐き出すような使い方なのでしょう。その点で vim 日報とはちょっと性格が違います。

チャットツールによりますが、過去メッセージの検索が難しい場合があります。1年くらい前にこんなことがあったんだけどなぁといった時に、検索できるとは限りません。

### チャットツールの自分宛 DM

他のメンバーに見られないという点以外は分報と同じです。誰も見てないので送信済のメッセージを編集し放題という点は違いますか。

### 社内ブログ / 社内 SNS などの記事

書き方のスタイルとしては vim 日報とかなり近いです。ただ、日報を書くためにブラウザを立ち上げて編集フォームにアクセスしなければならないのは少々煩雑です。手元のターミナルで vim が立ち上がる方が素早くないでしょうか。

## 検索機能

(2023/8/14追記)

日報が溜まってくると検索したくなってきたのでスクリプトを修正しました。ほかにもちょこちょこと手を入れています。

```bash:memo.sh
#!/usr/bin/env bash

MEMODIR=~/doc/memos
TMPFILE=$(mktemp)
PAGER=${PAGER-less}

function rm_tmpfile {
  [[ -f "$TMPFILE" ]] && rm -f "$TMPFILE"
}
trap rm_tmpfile EXIT
trap 'trap - EXIT; rm_tmpfile; exit -1' INT PIPE TERM


function edit_memo {
  memofile="${MEMODIR}/$(date +'%Y%m%d').txt"
  templatefile="${MEMODIR}/template.txt"
  if [ ! -e $memofile ] && [ -e $templatefile ]; then
    cp $templatefile $memofile
  fi
  $EDITOR $memofile
}

function view_memo {
  if [ $# -lt 1 ]; then
    pattern=`date +%Y%m`
  elif [ "$1" = "all" ]; then
    pattern=""
  else
    pattern=$1
  fi

  memos=`find $MEMODIR -name "${pattern}[0-9]*.txt" | sort`
  _view_files "${memos[*]}"
}

function search_memo {
  if [ $# -lt 1 ]; then
    echo "パターンが指定されていません"
    return
  else
    pattern=$1
  fi

  memos=`grep -l ${pattern} ${MEMODIR}/[0-9]*.txt | sort`
  _view_files "${memos[*]}"
}

function _view_files {
  for memo in ${memos[@]}; do
    echo "[[[${memo}]]]" >> $TMPFILE
    cat $memo >> $TMPFILE
    echo "================================================================================" >> $TMPFILE
  done

  if [ -p /dev/stdout ]; then
    cat $TMPFILE
  else
    $PAGER $TMPFILE
  fi
}


if [ $# -lt 1 ]; then
  edit_memo
elif [ "$1" = "edit" ]; then
  edit_memo
elif [ "$1" = "view" ]; then
  view_memo $2
elif [ "$1" = "search" ]; then
  search_memo $2
fi
```


```
alias memosearch="~/bin/memo.sh search $@"
```

としておけば

```
$ memosearch (キーワード)
```

で、キーワードを含む日報を閲覧できます。

ところで久しぶりにこの記事を更新してて気づきましたが、日報なのに `memo` ってのも変ですね。`daily` とか `diary` とかにすればよかったか。今更ですが。