vim でナレッジベースを作る

以前、vim で日報を書くという記事を書きました。その応用みたいなものです。

https://qiita.com/saoyagi2/items/aa0be1f7802b30bbc459

## どういうもの?

インターネット上で共有できるナレッジベースとしては、この Qiita や Zenn がありますし、各種ブログサービスも使えます。組織内だけで閉じて使えるサービスとしては Qiita Team や esa.io や DocBase などがあります。SaaS だけではなく、OSS として公開されているツールを自前でインストールして使う方法もあります。

これらの方法は「ブラウザ上で動作する」「一定の範囲内の人に共有される」という特徴があります。前者については、アクセスするためにはブラウザを立ち上げてブックマークを選択する手間が発生します。後者については、みんなに見てもらうほどではない自分用のメモなどは書きづらいという問題があります。

これらを回避するためにデスクトップにテキストファイルを一つ置いておいて、そこにメモ書きしているという人も多いのではないでしょうか。そのテキストファイルをもう少しシステマチックにやってみようというのがこの記事です。

やってることは単純で、要点としては以下のコマンド一つです。

```shell
alias note="vim ~/doc/notes/$(date +%s).txt"
```

要するにエポック秒で決まるファイル名のテキストファイルを vim で開いてるだけですね。

エポック秒なので、1秒以内に2回実行すれば重複します。が、このコマンドを操作するのは自分だけです。ターミナルを二つ開いて1秒以内に `note` というコマンドを2回実行しなければ重複することはありません。もしも運悪く重複したところで、一旦終了して再度開きなおせばいいだけの話です。自分だけの閉じた環境での話ですので。どうしてもそれが気持ち悪いという人は uuidgen コマンドなりを使えばいいでしょう。

新規にナレッジファイルを作成するには上記の alias だけでよいのですが、それだけでは閲覧や検索が不便ですので、以下のようなスクリプトを作成しました。

```shell:note.sh
#!/usr/bin/env bash

NOTEDIR=~/doc/notes
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_note {
echo $#
  if [ $# -lt 1 ]; then
    notefile="${NOTEDIR}/$(date +%s).txt"
  else
    notefile="${NOTEDIR}/$1.txt"
  fi
  templatefile="${NOTEDIR}/template.txt"
  if [ ! -e $notefile ] && [ -e $templatefile ]; then
    cp $templatefile $notefile
  fi
  $EDITOR $notefile
}

function list_note {
  notes="$NOTEDIR/*.txt"
  _view_files 3 "${notes[*]}"
}

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

  notes="$NOTEDIR/${pattern}.txt"
  _view_files all "${notes[*]}"
}

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

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

function _view_files {
  for note in ${notes[@]}; do
    echo "[[[${note}]]]" >> $TMPFILE
    if [ $1 = "all" ]; then
      cat $note >> $TMPFILE
    else
      head -n $1 $note >> $TMPFILE
    fi
    echo "================================================================================" >> $TMPFILE
  done

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


if [ $# -lt 1 ] || [ "$1" = "edit" ]; then
  edit_note $2
elif [ "$1" = "list" ]; then
  list_note
elif [ "$1" = "view" ]; then
  view_note $2
elif [ "$1" = "search" ]; then
  search_note $2
fi
```

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

```shell
alias note='~/bin/note.sh edit $@'
alias notelist='~/bin/note.sh list'
alias noteview='~/bin/note.sh view $@'
alias notesearch='~/bin/note.sh search $@'
```

以下、簡単に使い方を。

`note` とすれば新規のナレッジファイルを作成できます。

```shell
$ note
# vim で新規ファイルが開く
```

`notelist` でナレッジの一覧を表示します。

```shell
$ notelist
[[[/home/shigekazu/doc/notes/1695340408.txt]]]
# テスト

これはテストなのよー
================================================================================
[[[/home/shigekazu/doc/notes/1695340425.txt]]]
# セカンドテスト

次のテストなのよー
================================================================================
[[[/home/shigekazu/doc/notes/1695340482.txt]]]
# 長いテスト

これは長い文章のテストなのよー
================================================================================
[[[/home/shigekazu/doc/notes/1695341523.txt]]]
# Git でよく使うコマンド
================================================================================
```

`notesearch` でナレッジの検索ができます。

```shell
$ notesearch Git
[[[/home/shigekazu/doc/notes/1695341523.txt]]]
# Git でよく使うコマンド
================================================================================
```

`noteview` で特定のナレッジファイルのみの閲覧ができます。

```shell
$ noteview 1695341523
[[[/home/shigekazu/doc/notes/1695341523.txt]]]
# Git でよく使うコマンド
```

特によく使うナレッジについては、こんな感じで alias を設定しておいても便利です。

```shell
$ alias gitnote="noteview 1695341523"
```