できるだけ楽にテキストファイルにメモを残す

# 概要

何かしら業務を行っている際に、自分の考えや作業内容を記録したいことはないだろうか。
私の場合、問題を解決するまでの過程や、判断を下した根拠を記録しておきたいことが多々あった。
しかし、エディタを開いてファイルを作成・選択してメモを記載するという流れは面倒であり、作業対象への集中を途切れさせてしまう。
そこで、極力楽にメモを記録できるようなスクリプト類を作ったので以下に作成手順を記す。
なお、私は元々Windowsでスクリプトを作っていたが、最近環境をMacに切り替えたので、両方の環境について記載している。

# 何ができるか

- 一行だけ入力するエディタ（以下、一行版）と、複数行入力できるエディタ（以下、複数行版）をできるだけ楽に起動できるようにする。
- 一行版では、入力を行なってEnterキーを押せば、所定のファイルに日時と合わせて入力が記録される。
- 複数行版では、適当なエディタを立ち上げて入力を行なって保存すれば、所定のファイルに日時と合わせて入力が記録される。

（実行イメージ: Mac 一行版)

![oneliner.gif](https://qiita-image-store.s3.amazonaws.com/0/36565/24e76312-4dfe-c551-71b3-f93164562c3c.gif)

(実行イメージ: Mac 複数行版)

![editor.gif](https://qiita-image-store.s3.amazonaws.com/0/36565/f645eed4-5968-33d7-ae0f-0dd18a356b63.gif)


# Macの場合

環境: macOS Sierra

### 一行版

- 1. Automatorを起動し、書類の種類: サービスとして新規作成する
- 2. 次の選択項目を受け取る: 入力なし、検索対象: すべてのアプリケーション を指定
- 3. ユーティリティ > AppleScriptを実行 を追加し、以下を入力する

```bash
on run {input, parameters}
	tell application "System Events"
		display dialog "memo:" default answer "" buttons {"OK", "Cancel"} default button {"OK"}
		set inputValue to text returned of the result
	end tell
	return {inputValue}
end run
```
- 4. ユーティリティ > シェルスクリプトを実行 を追加し、シェル: /bin/bash, 入力の引き渡し方法: 引数として を指定して以下を入力する
  - OUT_FILEには出力先のファイルパスを入れる

```bash
# 出力先のパスを入れる (以下はファイル名を YYYYMM.md のようにしている)
OUT_FILE=~/note/log/`date '+%Y%m'`.md

echo -n "`date '+%Y/%m/%d %H:%M:%S'` " >> $OUT_FILE
echo $1 >> $OUT_FILE
```
- 5. 適当な名前をつけてサービスを保存する
- 6. 環境設定 > キーボード > ショートカット > サービス から、作成したサービスにキーボードショートカットを割り当てる

なお、最初のAppleScriptを実行のところは "テキストの入力を求める" でも同様のことができるが、この場合で表示される入力欄には自動的にフォーカスが当たっていない(マウスでクリックする必要がある)ため使用せず、AppleScriptの方法で行なっている。

### 複数行版

ここではエディタとしてCotEditorを使用している。

- 1. Automatorを起動し、書類の種類: サービスとして新規作成する
- 2. 次の選択項目を受け取る: 入力なし、検索対象: すべてのアプリケーション を指定
- 3. ユーティリティ > シェルスクリプトを実行 を追加し、シェル: /bin/bash を指定して以下を入力する
  - TEMP_FILEには一時ファイルのパスを入れる(必要ならば)
  - OUT_FILEには出力先のファイルパスを入れる

```bash
# 一時ファイルのパス
TEMP_FILE=~/temp/__t__.md
# 出力先のパスを入れる (以下はファイル名を YYYYMM.md のようにしている)
OUT_FILE=~/note/log/`date '+%Y%m'`.md

echo -n '' > $TEMP_FILE
/usr/local/bin/cot -w $TEMP_FILE
[ ! -s "${TEMP_FILE}" ] && exit
echo -n "`date '+%Y/%m/%d %H:%M:%S'` " >> $OUT_FILE
cat $TEMP_FILE >> $OUT_FILE
echo "" >> $OUT_FILE
```
- 4. 適当な名前をつけてサービスを保存する
- 5. 環境設定 > キーボード > ショートカット > サービス から、作成したサービスにキーボードショートカットを割り当てる


# Windowsの場合

環境: Windows 10

### 一行版

1. Windows版rubyを使用するので、インストールしていなければインストールする
2. パスの通っているディレクトリに以下のようなバッチファイルを作成する
  - `RUBY_EXE` にはruby.exeの絶対パスを入れること
  - `OUT_FILE` には出力先のパスを入れる

```bat
@echo off
set monthstr=%date:~-10,4%%date:~-5,2%
:ruby.exeの絶対パスを入れる
set RUBY_EXE=C:\env\ruby\Ruby23-x64\bin\ruby.exe
:出力先のファイルパスを入れる(ここではファイル名を YYYYMM.md のようにしている)
set OUT_FILE=C:\memo\%monthstr%.md

%RUBY_EXE% -e "puts('memo: '); tw = gets; File.open('%OUT_FILE%', 'a') { |f| f.write('%date% %time:~,8% ' + tw.encode('UTF-8', 'Shift_JIS')) }"
```

以上より、ファイル名を指定して実行からバッチファイルを呼び出すことができる。
(例として、ホームディレクトリに t.bat とかで保存しておけば、ファイル名を指定して実行で `t` と打てば良い。私はC:\shortなどのディレクトリを作り、それをPATHに追加していた)

なおrubyを使っているのは、コマンドプロンプトの `SET /P` で標準入力を受け取った場合、標準入力の値に `|` が入っていたりするとその後の処理でエラーになってしまうなどして実用に耐えられなかったためである。
しかし書いていて気が付いたが、PowerShellのスクリプトを用意して `Read-Host` を呼び出し、それを `powershell -ExecutionPolicy RemoteSigned -File xxx.ps1` のようにして呼び出す形でもできたかもしれない(要検証)。

### 複数行版

1. Windows版Gitを使用するので、インストールしていなければインストールする
2. パスの通っているディレクトリに以下のようなバッチファイルを作成する
  - `TEMP_FILE` には一時ファイルのパスを入れる(必要ならば)
  - `GIT_USR_BIN` にはGitの/usr/binディレクトリのパスを入れる
  - `EDITOR_CMD` にはエディタを呼び出すコマンドを入れる(以下例ではGit環境下のvimを利用している)
  - `OUT_FILE` には出力先のパスを入れる

```bat
@echo off
set monthstr=%date:~,4%%date:~5,2%
:一時ファイルのパス
set TEMP_FILE=hogehogetmp.md
:Gitの/usr/binディレクトリのパスを入れる
set GIT_USR_BIN=C:\Program Files\Git\usr\bin
:エディタを呼び出すコマンドを入れる
set EDITOR_CMD="%GIT_USR_BIN%\vim.exe" -n -c ":set paste" -c start
:出力先のファイルパスを入れる(ここではファイル名を YYYYMM.md のようにしている)
set OUT_FILE=C:\memo\%monthstr%.md

echo. > %TEMP_FILE%
%EDITOR_CMD% %TEMP_FILE%
set PATH=%GIT_USR_BIN%;%PATH%
echo %date% %time:~,8% | tr -d '\r\n' >> %OUT_FILE%
cat %TEMP_FILE% >> %OUT_FILE%
```

なお、コマンドプロンプトでは `TYPE CON > out.txt` のようにすれば複数行の入力をout.txtに出力できるが、この入力の場合は改行すると前の行に戻ることができなくなるなど不便なので使用しなかった。