## 経緯
[[snacks.picker]]で行った以下の対応が使い勝手良かったので、[[🦉Another Quick Switcher|AQS]]の機能の1つとして導入したい。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" />
<span class="link-card-v2-site-name">Minerva</span>
</div>
<div class="link-card-v2-title">
📕snacks.pickerで最近Gitで操作したファイル一覧を表示するコマンド
</div>
<div class="link-card-v2-content">最近Gitでコミットされたファイルやローカルでgit statusの差分があるファイル一覧を時間順に表示するコマンドの作成方法。『最近いじったファイル』をざっくり探したいときなどにあると便利。ファイルの更新順だとあくまでファイルシステム次第なので、コミット履歴の方が信頼できると判断した。</div>
<img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/prime.webp" />
<a data-href="📕snacks.pickerで最近Gitで操作したファイル一覧を表示するコマンド" class="internal-link"></a>
</div>
%%[[📕snacks.pickerで最近Gitで操作したファイル一覧を表示するコマンド]]%%
## 仕様
- 各候補の左側 (ghostのアイコンなどを表示しているgutter部分) に『相対更新期間』を表示する
- 表示する文字のルール: 現在日時と『相対更新期間の計算に使う値』が
- 1分未満の場合: 1m
- 1時間未満の場合: 1m ~ 59m
- 24時間未満の場合: 1h ~ 23h
- 30日未満の場合: 1d ~ 30d
- 1年未満の場合: 1mo ~ 11mo
- 1年以上の場合: 1y ~
- それぞれに専用のCSSクラスを用意する
- 『相対更新期間の計算に使う値』は以下の候補から選択できるようにする
- ファイルの作成日時
- ファイルの更新日時 `default`
- [[プロパティ (Obsidian)|プロパティ]]
- とりあえず[[Git]]は使わずにやる
- 更新日時の管理はファイルシステムや[[プロパティ (Obsidian)|プロパティ]]で十分なことも多い
- 依存を増やしたくない
- ただし、あとで機能追加する可能性はある
### やりとり1
> - プロパティ指定は「単一キー」で良いですか?複数キー(優先順)も必要でしょうか。
単一キーでいいです。
> - プロパティが未設定/不正な値の場合は「表示しない」でOKですか?それとも「更新日時にフォールバック」しますか。
『表示しない』でOKです。
> - プロパティ値が数値の場合の解釈はどうしますか?(UNIX秒 / UNIXミリ秒 / 数値は非対応)
非対応で問題ないですが、moment.js(?)を使って同じロジックで対応できるなら対応してもらえればと。
> - 「Hide gutter icons」を有効にしたとき、この相対更新期間は表示したままで良いですか?
表示したままでいいです。ただ『相対更新期間の算出元』の設定で『なし』相応を追加してください。設定名もユーザーに分かりやすいものにしてください。
> 月/年の境界は「1ヶ月=30日」「1年=365日」で問題ないですか?
問題ないです。
あと以下のルール定義を少し変更しました。境界値の表現が曖昧だったのと、minutesとmonthの区別がつかなかったため。
- 表示する文字のルール: 現在日時と『相対更新期間の計算に使う値』が
- 1分未満の場合: 1m
- 1時間未満の場合: 1m ~ 59m
- 24時間未満の場合: 1h ~ 23h
- 30日未満の場合: 1d ~ 30d
- 1年未満の場合: 1mo ~ 11mo
- 1年以上の場合: 1y ~
### やりとり2
> - suggestion-factory.tsは表示要素の組み立て専用なので、相対期間の「計算」はAnotherQuickSwitcherModal側で行い、suggestion-factoryには「表示用データ(text/unit)」だけ渡して要素生成する形が一番綺麗だと思います。
> もし「計算も suggestion-factory 側でやってほしい」場合は、設定や日付パースの責務が寄るので少し密結合になります。
たしかに suggestion-factory に計算までさせる必要はありませんね。なら、計算は `times.ts` に書いてください。AnotherQuickSwitcherModal は責務が多いので、本質的でない処理を追加したくないので。
> 1. 設定移動: グローバル(Appearance)から削除し、SearchCommandにrelativeUpdatedPeriodSourceとrelativeUpdatedPeriodPropertyKeyを追加。createDefaultSearchCommandとプリセットにもデフォルト値(modified/空)を入れる。
- UIは「各 Custom Search」の設定内に追加し、Do not show / Last modified (default) / Created time / Propertyの選択肢と、Property時のみキー入力欄を表示。
- relativeUpdatedPeriodSource のデフォルト値は `none` (現状の `do not show`) に変えて
- relativeUpdatedPeriodPropertyKey のデフォルト値は `Last modified` のままでOK