gulp watch
すれば良いんだけど、そのためだけにNodeやgulpを登場させないといけないのがちょっと嫌です。ググったらShellでそういう機能を書いてる人がいました。
次のようなことを対応したかったので、上記を参考に書いてみました。
- OSXには
ls -l --full-time
が無いようなので違うコマンドでファイルの更新日時を取得する。 - 複数ファイルを監視する。
- 監視自体は複数ファイルを対象にしても、実行するコマンド自体は変更があったファイルのみを対象にできる。
gulp.watchみたいにファイルの変更を検知して何かする
Usage
$ watch-files Usage: 第一引数: 監視対象ファイルが更新された際に実行されるコマンド 第二引数以降: 監視対象ファイルのリスト 例: watch-files 'cargo build && cargo run' ./src/*.rs watch-files 'mermaid -sp $_f' ./*.mermaid
*
とか[foo,bar].cpp
とかのように複数ファイルを指定してもいいし、単純に第二引数以降にファイル名を列挙してもいいです。- 環境変数
INTERVAL
で変更監視の間隔を指定できます(秒)。
INTERVAL=3 sh watch-files 'echo $_f is modified!' ./*.txt
みたいな感じです。
- 第一引数のコマンド内で使える変数
$_f
: 変更があったファイル(例:foo.mermaid
)*1$_last
: 変更があったファイルの以前の更新日時(例:2016-7-18_17:54:00
)$_current
: 変更があったファイルの今回の更新日時(例:2016-7-18_17:54:57
)
Motivator
きっかけは、Sublimetextでmermaid.jsのシーケンス図をリアルタイムプレビューしたかったことです。Atomだとプラグインがありました。 このプラグインはすこぶるきちんと動作していたのでAtom使えばいいんですが。
ただ、やりたいことは「mermaidファイルの変更を検知してmermaid
コマンドを叩きたい」だけなのに、こういう状況が発生する度にエディタにプラグインを書くことにするとしたらちょっと面倒に思えました。
タイトルにもある通りそういう汎用動作がスクリプトであればいいだけなので。*2
実際にSublimeで画面分割して、右ペインに生成されるpngを、左ペインにmermaidのファイルを開いて書いてみて、ややモッサリしているけれど概ねうまく動作してくれています。
Others
ちなみに、mermaidをサポートしているエディタは、Atom以外にHaroopadやgitbookのエディタ があります。
Haroopadは、サポートしているのが次のようなインラインコード形式で書く場合のみで、ファイル全体をmermaidとして扱うことには対応していません。マークダウンエディタなので、そりゃそうです。
```mermaid
.....
```
gitbookのエディタを使ってみようと、プラグインをmermaid
で検索したら6つくらいヒットしました。どれがいいのかよく分からないので、挫折しました。ごめんなさい。
Impression
- Shellは書かないとすぐ忘れてしまう。
*
$@
と$*
がどっちがどっちだったかとか。*3 - Shellで配列を久しぶりに使ったんだけど、これってkshとかだと挙動違うからポータビリティ的にアウトだよね。。ごめんなさい。
ls -l --full-time
の代わりはbash - issues "using ls -al --full-time" in OSX - Stack Overflowを参考にls -lT
を使いました。ただ、このコマンドだとミリ秒を扱えないので、ミリ秒以内の変更は検知できない場合がありますが。