Awesome
<div align="center"> <h1>Silhouette</h1> <img src="./silhouette.webp" width="256" /> <p> <div>Obsidianでシンプルにタスクを管理するためのプラグインです。</div> <div>目の前のタスクに集中することのみにフォーカスしています。</div> </p> <a href="https://github.com/tadashi-aikawa/silhouette/releases/latest"><img src="https://img.shields.io/github/release/tadashi-aikawa/silhouette.svg" /></a> <a href="https://github.com/tadashi-aikawa/silhouette/actions"><img src="https://github.com/tadashi-aikawa/silhouette/workflows/Tests/badge.svg" /></a> <img src="https://img.shields.io/github/downloads/tadashi-aikawa/silhouette/total" /> </div>⏬ インストール
BRATを使ってtadashi-aikawa/silhouette
でインストールします。
🚄 クイックスタート
何よりもまずは動かしてみたい人向けです。インストール完了して、プラグインを有効にしたところからスタート。
- 設定画面にて、繰り返しタスクファイルのパスに
tasks.md
を設定 - Vaultのrootに
tasks.md
を作成して以下を貼り付け
// 週ごとの基本ルーチン
毎日やるタスク,every day
平日やるタスク,weekday
土日やるタスク,weekend
月・水・金やるタスク,mon/wed/fri
火・木・土やるタスク,tue/thu/sat
// 月ごとの基本ルーチン
毎月10日やるタスク,10d
毎月1日/11日/21日/31日やるタスク,1d/11d/21d/31d
// 月末・月初の特殊ルーチン
月末の3日前にやるタスク,end of month<3
// 年ごとの基本ルーチン
毎年7月1日にやるタスク,0701
// 起点日あり一定期間繰り返し
2023年1月1日から7日ごとにやるタスク,every 7 day,2023-01-01
2023年1月1日から10日ごとにやるタスク,every 10 day,2023-01-01
// 稼働日に関係するタスク
稼働日の翌日にやるタスク,workday>1
休み明けの稼働日,non workday>1!
翌日が休み,non workday<1
// 稼働日でない場合は実施日をずらすタスク
毎週水曜のタスク(稼働日でない場合は翌稼働日),wed>!
毎週火曜・木曜のタスク(稼働日でない場合は前稼働日),tue/thu<!
毎月第2月曜のタスク(稼働日でない場合は前稼働日),2mon<!
- 本日のDaily Noteを開き、Silhouette: Insert tasksコマンドを実行
いくつかのタスクリストが挿入されれば成功です🎉
[!NOTE] 学校や仕事が休みの日、祝日などを考慮する場合は休日設定ファイルを使ってあなただけの休日を定義しましょう📅
🧠 Silhouetteを用いたタスク管理について
機能の紹介をする前に、Silhouetteを使ってどのようにタスク管理するか、前提としているシナリオの説明をします。
Silhouetteでは、タスクはDaily Noteにタスクリストとして管理する 思想に基づいた機能を提供します。そのため、タスク管理に必要なデータを極力独自に持たないようにしています。
タスク発生時のアクション
ワンタイムタスクの場合
実施予定日のDaily Noteにタスクリストとして追加します。Silhouetteの機能は使いません。
繰り返しタスクの場合
繰り返しタスクファイルに登録します。登録された繰り返しタスクは、今開いているDaily Noteに対してSilhouette: Insert tasks
コマンドにより、タスクリストとして追加します。
タスク完了時のアクション
タスクリストを完了させるだけです。Silhouetteの機能は使いません。
⌨️ コマンド
Silhouette: Insert tasks
このコマンドは 現在アクティブなDaily Noteの日付を読み取り、繰り返しタスクファイルからその日にやるべきワンタイムタスクを、Daily Noteに生成 します。
上記は、2023-01-21(土)のワンタイムタスクを、以下の繰り返しタスクファイルを元に生成した動画です。
毎日やるタスク,every day
平日やるタスク,weekday
土日やるタスク,weekend
月・水・金やるタスク,mon/wed/fri
火・木・土やるタスク,tue/thu/sat
毎月10日やるタスク,10d
毎月1日/11日/21日/31日やるタスク,1d/11d/21d/31d
1月1日から7日ごとにやるタスク,every 7 day,2023-01-01
1月1日から10日ごとにやるタスク,every 10 day,2023-01-01
繰り返しタスクファイルの見方は、この後に登場する仕様をご覧ください。
Silhouette: Push timer
このコマンドはカーソル配下のワンタイムタスクを計測開始/終了します。計測に関数するコマンドは1コマンドで賄います。
コマンド実行後に遷移する計測に関するステータスは以下の通りです。
- [ ] 未計測のタスク
- [ ] 計測中のタスク (⏳)
- [ ] 計測済のタスク (⏲️01:23:45)
計測済のカッコ内にあるHH:mm:ss
表記は、そのタスクを計測した時間の合計です。01:23:45
は合計で1時間23分45秒計測したという意味です。
[!WARNING] 異なるデバイス間で計測状態を同期する場合は、計測状態を記録したJSONファイルのパスで指定したファイルが同期対象となるようにしてください。
Silhouette: Push timer and open
基本的には Silhouette: Push timer
と同じですが、タスクが以下2つの条件を満たすとき
後処理として、タスク内のリンクを開きます。
Silhouette: Cycle bullet/checkbox
基本はObsidianのCycle bullet/checkbox
コマンドと同じですが、変更前のタスクが計測中 かつ チェックがついていない場合のみタスクを計測済にします。
具体的には
- [ ] 計測中のタスク (⏳)
に対してコマンドを実行すると
- [x] 計測済のタスク (⏲️01:23:45)
に変わります。
Silhouette: Move to recording
計測中のタスクが存在する行に移動します。
Silhouette: Force stop recording
強制的に現在の計測を停止します。
計測中のタスクを示す行を誤って削除してしまい、新たな計測を開始したいが、内部状態が計測中になっていて開始できない場合に使用します。
[!WARNING] 計測中タスクの記録時間は消去されます。記録時間を消去したくない場合は
(⏳)
を末尾に追加してから、通常通り計測済にしてください。
Silhouette: Insert current time
カーソル位置の項目に現在時刻を挿入します。開始時刻や終了時刻を記録するなどの用途でお使いください。
リストの状態やインデントも考慮します。たとえば以下のテキストがある場合。
hoge
- hoge
- hoge
- [ ] hoge
- [x] hoge
* hoge
* hoge
* [x] hoge
各行で19時4分にSilhouette: Insert current time
コマンドを実行した結果は以下のようになります。
19:04 hoge
- 19:04 hoge
- 19:04 hoge
- [ ] 19:04 hoge
- [x] 19:04 hoge
* 19:04 hoge
* 19:04 hoge
* [x] 19:04 hoge
また、既に時刻が挿入済の場合は終了時刻が挿入されます。たとえば以下のテキストがある場合。
- 19:04 hoge
- 19:04 - 19:06 hoge
19:10
にそれぞれの行でコマンドを実行すると以下のようになります。
- 19:04 - 19:10 hoge
- 19:04 - 19:10 hoge
UI
繰り返しタスクが意図通りの日付に予定されているか...を確認するUIを用意しています。
詳細は0.8.0のリリースノートをご覧ください。
⚙️ 設定
繰り返しタスクファイルのパス
繰り返しタスクファイルのパスを、Vault rootからの相対パスとして指定します。
例
: _Privates/repeatable tasks.md
休日設定ファイルのパス
休日設定ファイルのパスを、Vault rootからの相対パスとして指定します。
例
: _Privates/holidays.md
ファイルの日付フォーマット
タスクを挿入する日付を判断するために必要なファイル名のフォーマットを指定します。
例
: YY_MM_DD
(2023年1月1日なら23_01_01というファイル名)
以下のフォーマットに対応しています。
https://day.js.org/docs/en/parse/string-format
計測状態を記録したJSONファイルのパス
計測中の状態を記録したJSONファイルを保存するパスを、Vault rootからの相対パスとして指定します。
例
: _Privates/NOSYNC/timer.json
指定しなかった場合は.obsidian/plugins/silhouette/timer.json
に保存されます。
ステータスバーに計測時間を表示する
有効にすると計測中タスクの計測時間が表示されます。以下のタイミングで更新されます。
- 計測を開始したとき
- 計測を終了したとき
- 計測中、前回の更新から30秒経ったとき (計測中は30秒に1回更新)
[!WARNING] 端末間で同期したときも最大で30秒のラグがあります
完了したら次のタスクを自動で計測開始する
有効にすると Cycle bullet/checkbox
コマンドでタスクを完了したあと、次の行に未完了のタスクが存在するなら、次の行のタスクを自動で計測開始します。
📜 仕様
繰り返しタスクファイル
カンマ区切りのCSV形式です。
列index | 必須 | 意味 | 例 |
---|---|---|---|
1 | O | タスク名 | 10:00 朝会 |
2 | O | 繰り返しパターン | every day |
3 | 起点日 | 2022-03-11 |
以下の行は無視されます。
//
から始まるコメント行- 空行、もしくはスペースのみの行
タスク名
タスクの名称です。
階層構造のタスクを挿入
先頭に半角スペースやタブをつけると、Silhouette: Insert tasksコマンドを実行したとき、タスクがインデントされます。たとえば
普通の タスク,every day
4つインデント,every day
8つインデント,every day
タブインデント,every day
という4つのタスクを登録したとき、Silhouette: Insert tasksを実行すると以下が挿入されます。
- [ ] 普通の タスク
- [ ] 4つインデント
- [ ] 8つインデント
- [ ] タブインデント
リストとして挿入
-
または*
から始まるタスク名は タスクではなく単なるリストとして 挿入されます。リストを挿入したい場合や、タスクのチェック状態を含めて挿入したい場合に便利です。
たとえば
体重計測,every day
- 身長,every day
* [x] 体重,every day
- [_] 血圧,every day
と記載したとき、Silhouette: Insert tasks
を実行すると以下が挿入されます。
- [ ] 体重計測
- 身長
* [x] 体重
- [_] 血圧
繰り返しパターン
繰り返しタスクの繰り返されるパターンを示す文字列です。
パターン | 例 | 複数指定 |
---|---|---|
毎日 | every day | 不可 |
平日(月~金) | weekday | 不可 |
土日 | weekend | 不可 |
稼働日 | workday | 不可 |
稼働日ではない日 | non workday | 不可 |
曜日複数指定 | sun/mon | / 区切り可 |
毎月特定日複数指定 | 10d/20d | / 区切りで可 |
毎年特定日 | 0701 | 不可 |
N日ごと | every 3 day | 不可 |
月初 | beginning of month | 不可 |
月初の稼働日 | workday beginning of month | 不可 |
月末 | end of month | 不可 |
月末の稼働日 | workday end of month | 不可 |
[!WARNING]
複数指定
は同一パターンのみ有効です。たとえばweekday/mon
のような表現はできません。その場合は後述の複数パターン指定を利用してください。
曜日
曜日は小文字のアルファベット3文字で表現します。
表記 | 意味 |
---|---|
sun | 日曜 |
mon | 月曜 |
tue | 火曜 |
wed | 水曜 |
thu | 木曜 |
fri | 金曜 |
sat | 土曜 |
sun! | 休日ではない日曜 |
mon! | 休日ではない月曜 |
tue! | 休日ではない火曜 |
wed! | 休日ではない水曜 |
thu! | 休日ではない木曜 |
fri! | 休日ではない金曜 |
sat! | 休日ではない土曜 |
sun* | 休日の日曜 |
mon* | 休日の月曜 |
tue* | 休日の火曜 |
wed* | 休日の水曜 |
thu* | 休日の木曜 |
fri* | 休日の金曜 |
sat* | 休日の土曜 |
また、曜日表記の前に数字(N)を入れると、第N曜日を表現できます。以下は一例です。
表記 | 意味 |
---|---|
2sat | 第2土曜日 |
1fri! | 休日ではない第1金曜日 |
オフセット
末尾にオフセット表記をつけると、特定日の〇日前や〇日後という表現ができます。
末尾につける表記 | 意味 |
---|---|
>N | N日後 |
<N | N日前 |
>N! | N稼働日後 |
<N! | N稼働日前 |
>! | 稼働日でない場合は翌稼働日 |
<! | 稼働日でない場合は前稼働日 |
以下は具体例です。
稼働日の翌日タスク,workday>1
月末の3日前タスク,end of month<3
月末の2稼働日前タスク,end of month<2!
休み前の稼働日,non workday<1!
休み明けの稼働日,non workday>1!
翌日が休み,non workday<1
休日の水曜の1稼働日前,wed*<1!
毎週水曜のタスク(稼働日でない場合は翌稼働日),wed>!
毎月第2月曜のタスク(稼働日でない場合は前稼働日),2mon<!
複数パターン指定
繰り返しタスクには、|
区切りで複数の繰り返しパターンを設定できます。指定されたパターンはOR条件(いずれか1つのパターンにマッチした場合に適応される)となります。
以下は具体例です。
稼働日の木曜(稼働日でない場合は翌稼働日),thu!|thu*>1!
稼働日でない日の前後1稼働日,non workday<1!|non workday>1!
起点日
繰り返しパターンの起点となる日付です。たとえば
タスク,every 2 day,2022-03-10
のとき、2022/3/10を起点として1日おき(2日に1回)のタスクと判定されます。また、起点日以降にならないとタスクは有効になりません。
具体的な各日付でのタスク有無は以下のようになります。
日付 | 有無 |
---|---|
2022/03/08 | 無 |
2022/03/09 | 無 |
2022/03/10 | 有 |
2022/03/11 | 無 |
2022/03/12 | 有 |
2022/03/13 | 無 |
2022/03/14 | 有 |
そのほかの例
私が設定している繰り返しタスクの一部を例として紹介します。
08:30 出勤,mon!/tue!/thu!
22:45 歯磨き,every day
洗濯(洗う),every 2 day,2023-01-14
洗濯(干す),every 2 day,2023-01-14
爪切り,every 7 day,2023-01-13
Minervaバックアップ,mon
解説
- 水金はリモートワークなので、月火木は出勤が必要 (休日は不要なので
!
つき) - 歯磨きは毎日
- 洗濯は2日に1回
- 爪切りは毎週
- Minervaのバックアップは毎週月曜 (休日かどうかは関係ないので
!
なし)
休日設定ファイル
各行に日付を記載する形式です。以下は2023年における日本の祝日を定義した例です。
Note
サポートフォーマットはYYYY-MM-DD
形式ですが、他の一般的なフォーマットも受け付ける可能性があります。
2023-01-01
2023-01-02
2023-01-09
2023-02-11
2023-02-23
2023-03-21
2023-04-29
2023-05-03
2023-05-04
2023-05-05
2023-07-17
2023-08-11
2023-09-18
2023-09-23
2023-10-09
2023-11-03
2023-11-23
以下の行は無視されます。
//
から始まるコメント行- 空行、もしくはスペースのみの行
🔤 用語定義
タスクの種類
ワンタイムタスク
日付が指定されたタスクです。完了したらそれで終わりです。
繰り返しタスク
一定のルールに基づいて繰り返し発生するタスクです。完了しても定期的に発生します。
計測に関するステータス
タスクの計測機能に関するステータス。それぞれの意味とエディタ上での表示状態を説明します。
未計測
ワンタイムタスクを一度も計測したことがない状態。
- [ ] タスク名
計測中
ワンタイムタスクを計測中である状態。末尾に (⏳)
が付与される。
- [ ] タスク名 (⏳)
計測済
ワンタイムタスクを計測した実績はあるが、今は計測中でない状態。末尾に (⏲️HH:mm:ss)
が付与される。
- [ ] タスク名 (⏲️01:23:45)
日付に関する単語
平日
月曜~金曜のこと。
月 | 火 | 水 | 木 | 金 | 土 | 日 | |
---|---|---|---|---|---|---|---|
休日以外 | o | o | o | o | o | x | x |
休日 | o | o | o | o | o | x | x |
休日
休日設定ファイルで指定された日付のこと。通常は以下を設定する。
- 祝日
- 年末年始など、仕事や学業などがない休み
月 | 火 | 水 | 木 | 金 | 土 | 日 | |
---|---|---|---|---|---|---|---|
休日以外 | x | x | x | x | x | x | x |
休日 | o | o | o | o | o | o | o |
稼働日
月 | 火 | 水 | 木 | 金 | 土 | 日 | |
---|---|---|---|---|---|---|---|
休日以外 | o | o | o | o | o | x | x |
休日 | x | x | x | x | x | x | x |
月初
各月、1日のこと。
例 | 対象 |
---|---|
2023-01 | 1日 |
月末
月の最終日のこと。1月なら31日、4月なら30日。
例 | 対象 |
---|---|
2023-01 | 31日 |
2023-04 | 30日 |
月初の稼働日
その月最初の稼働日のこと。以下の条件を満たすとき
- 2023-01-01が休日
- 2023-01-02が平日
- 2023-04-01が平日
以下のようになる。
例 | 対象 |
---|---|
2023-01 | 2日 |
2023-04 | 1日 |
月末の稼働日
その月最後の稼働日のこと。以下の条件を満たすとき
- 2023-01-31が休日
- 2023-01-30が平日
- 2023-04-30が平日
以下のようになる。
例 | 対象 |
---|---|
2023-01 | 30日 |
2023-04 | 30日 |
第N曜日
その月でN番目に登場する特定曜日のこと。具体的には以下のように使う。
2023 February
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28
例 | 対象 |
---|---|
第1水曜日 | 2023-02-01 |
第1月曜日 | 2023-02-06 |
第4月曜日 | 2023-02-27 |
🐈 FAQ
異なる端末で計測時間の同期ができない
計測状態の同期には計測状態を記録したJSONファイルを同期する必要があります。以下を確認してください。
- 設定で 計測状態を記録したJSONファイルのパス が指定されているか?
- 指定されている場合
- 指定されたパスのファイルは同期が有効になっているか?
- 指定されてない場合
.obsidian/plugins/silhouette/timer.json
の同期が有効になっているか?
- 指定されている場合
🦉 宣伝
NeovimプラグインとSilhouette Core
ObsidianだけでなくNeovimのプラグインも提供しています。(機能は多少減っており開発中ステータスです)
<a href="https://github.com/tadashi-aikawa/silhouette.nvim"> <img width="50%" src="https://opengraph.githubassets.com/796ed8b971a84d9f9dcb9e107edd11f765e230028bd04a967a487d1551585d90/tadashi-aikawa/silhouette.nvim"/> </a>また、SilhouetteのコアロジックはSilhouette Coreというライブラリで提供しています。TypeScript製でJSRリポジトリで配布しています。
<a href="https://github.com/tadashi-aikawa/silhouette-core"> <img width="50%" src="https://opengraph.githubassets.com/796ed8b971a84d9f9dcb9e107edd11f765e230028bd04a967a487d1551585d90/tadashi-aikawa/silhouette-core"/> </a>Silhouetteのタスク判定ロジック、または繰り返し表現パースロジックを再利用して、自分だけのタスクアプリケーションを開発したい場合など是非ご利用ください。
その他のObsidianプラグイン
他にもいくつかのObsidianプラグインを開発しております。よろしければ以下をご覧ください。
Silhouette以外でオススメのプラグインは以下2つです。機能が多くてとっつきにくいかもしれませんが、手に馴染めばObsidian活動がかなり捗ること間違いないと思います。
<a href="https://github.com/tadashi-aikawa/obsidian-various-complements-plugin"> <img width="50%" src="https://opengraph.githubassets.com/796ed8b971a84d9f9dcb9e107edd11f765e230028bd04a967a487d1551585d90/tadashi-aikawa/obsidian-various-complements-plugin"/> </a> <a href="https://github.com/tadashi-aikawa/obsidian-another-quick-switcher"> <img width="50%" src="https://opengraph.githubassets.com/796ed8b971a84d9f9dcb9e107edd11f765e230028bd04a967a487d1551585d90/tadashi-aikawa/obsidian-another-quick-switcher"/> </a>開発者向け
セットアップ
以下でhooksの場所を変更する。
git config core.hooksPath hooks
リリース
Release Action を実行。