以前、vim で日報を書くという記事を書きました。その応用みたいなものです。
どういうもの?
インターネット上で共有できるナレッジベースとしては、この Qiita や Zenn がありますし、各種ブログサービスも使えます。組織内だけで閉じて使えるサービスとしては Qiita Team や esa.io や DocBase などがあります。SaaS だけではなく、OSS として公開されているツールを自前でインストールして使う方法もあります。
これらの方法は「ブラウザ上で動作する」「一定の範囲内の人に共有される」という特徴があります。前者については、アクセスするためにはブラウザを立ち上げてブックマークを選択する手間が発生します。後者については、みんなに見てもらうほどではない自分用のメモなどは書きづらいという問題があります。
これらを回避するためにデスクトップにテキストファイルを一つ置いておいて、そこにメモ書きしているという人も多いのではないでしょうか。そのテキストファイルをもう少しシステマチックにやってみようというのがこの記事です。
やってることは単純で、要点としては以下のコマンド一つです。
alias note="vim ~/doc/notes/$(date +%s).txt"
要するにエポック秒で決まるファイル名のテキストファイルを vim で開いてるだけですね。
エポック秒なので、1秒以内に2回実行すれば重複します。が、このコマンドを操作するのは自分だけです。ターミナルを二つ開いて1秒以内に note
というコマンドを2回実行しなければ重複することはありません。もしも運悪く重複したところで、一旦終了して再度開きなおせばいいだけの話です。自分だけの閉じた環境での話ですので。どうしてもそれが気持ち悪いという人は uuidgen コマンドなりを使えばいいでしょう。
新規にナレッジファイルを作成するには上記の alias だけでよいのですが、それだけでは閲覧や検索が不便ですので、以下のようなスクリプトを作成しました。
#!/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 も定義しておきます。
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
とすれば新規のナレッジファイルを作成できます。
$ note
# vim で新規ファイルが開く
notelist
でナレッジの一覧を表示します。
$ 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
でナレッジの検索ができます。
$ notesearch Git
[[[/home/shigekazu/doc/notes/1695341523.txt]]]
# Git でよく使うコマンド
================================================================================
noteview
で特定のナレッジファイルのみの閲覧ができます。
$ noteview 1695341523
[[[/home/shigekazu/doc/notes/1695341523.txt]]]
# Git でよく使うコマンド
特によく使うナレッジについては、こんな感じで alias を設定しておいても便利です。
$ alias gitnote="noteview 1695341523"