Skip to content

Obsidianでシンプルにタスクを管理するためのプラグイン

Notifications You must be signed in to change notification settings

tadashi-aikawa/silhouette

Repository files navigation

Silhouette

Obsidianでシンプルにタスクを管理するためのプラグインです。
目の前のタスクに集中することのみにフォーカスしています。

⏬ インストール

BRATを使ってtadashi-aikawa/silhouetteでインストールします。

🚄 クイックスタート

何よりもまずは動かしてみたい人向けです。インストール完了して、プラグインを有効にしたところからスタート。

  1. 設定画面にて、繰り返しタスクファイルのパスtasks.mdを設定
  2. 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<!
  1. 本日の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に生成 します。

demo

上記は、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コマンドで賄います。

demo

コマンド実行後に遷移する計測に関するステータスは以下の通りです。

- [ ] 未計測のタスク
- [ ] 計測中のタスク (⏳)
- [ ] 計測済のタスク (⏲️01:23:45)

計測済のカッコ内にあるHH:mm:ss表記は、そのタスクを計測した時間の合計です。01:23:45は合計で1時間23分45秒計測したという意味です。

Warning

異なるデバイス間で計測状態を同期する場合は、計測状態を記録したJSONファイルのパスで指定したファイルが同期対象となるようにしてください。

Silhouette: Push timer and open

基本的には Silhouette: Push timer と同じですが、タスクが以下2つの条件を満たすとき

  • ステータスが未計測計測済
  • タスクの中にリンク(URLやInternal linkなど)を含む

後処理として、タスク内のリンクを開きます。

demo

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のプラグインも提供しています。(機能は多少減っており開発中ステータスです)

また、SilhouetteのコアロジックはSilhouette Coreというライブラリで提供しています。TypeScript製でJSRリポジトリで配布しています。

Silhouetteのタスク判定ロジック、または繰り返し表現パースロジックを再利用して、自分だけのタスクアプリケーションを開発したい場合など是非ご利用ください。

その他のObsidianプラグイン

他にもいくつかのObsidianプラグインを開発しております。よろしければ以下をご覧ください。

🦉tadashi-aikawaが開発しているObsidianプラグイン - Minerva

Silhouette以外でオススメのプラグインは以下2つです。機能が多くてとっつきにくいかもしれませんが、手に馴染めばObsidian活動がかなり捗ること間違いないと思います。

開発者向け

セットアップ

以下でhooksの場所を変更する。

git config core.hooksPath hooks

リリース

Release Action を実行。