Home

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でインストールします。

🚄 クイックスタート

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

  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つの条件を満たすとき

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

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に保存されます。

ステータスバーに計測時間を表示する

有効にすると計測中タスクの計測時間が表示されます。以下のタイミングで更新されます。

[!WARNING] 端末間で同期したときも最大で30秒のラグがあります

完了したら次のタスクを自動で計測開始する

有効にすると Cycle bullet/checkbox コマンドでタスクを完了したあと、次の行に未完了のタスクが存在するなら、次の行のタスクを自動で計測開始します。

📜 仕様

繰り返しタスクファイル

カンマ区切りのCSV形式です。

列index必須意味
1Oタスク名10:00 朝会
2O繰り返しパターン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金曜日
オフセット

末尾にオフセット表記をつけると、特定日の〇日前や〇日後という表現ができます。

末尾につける表記意味
>NN日後
<NN日前
>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

解説

休日設定ファイル

各行に日付を記載する形式です。以下は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)

日付に関する単語

平日

月曜~金曜のこと。

休日以外oooooxx
休日oooooxx

休日

休日設定ファイルで指定された日付のこと。通常は以下を設定する。

休日以外xxxxxxx
休日ooooooo

稼働日

休日を除く平日のこと。

休日以外oooooxx
休日xxxxxxx

月初

各月、1日のこと。

対象
2023-011日

月末

月の最終日のこと。1月なら31日、4月なら30日。

対象
2023-0131日
2023-0430日

月初の稼働日

その月最初の稼働日のこと。以下の条件を満たすとき

以下のようになる。

対象
2023-012日
2023-041日

月末の稼働日

その月最後の稼働日のこと。以下の条件を満たすとき

以下のようになる。

対象
2023-0130日
2023-0430日

第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ファイルを同期する必要があります。以下を確認してください。

🦉 宣伝

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プラグインを開発しております。よろしければ以下をご覧ください。

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

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 を実行。