![[chappy-log.webp|cover-picture]] ## 蚭定 ### 蚭定远加・削陀 远加された段階で新しい蚭定が増える。 - [x] 空の蚭定をどうするか問題 - 珟状は空のコマンド名はサむレントに消しおいる - [ ] validationではじけば問題ないはず - [x] 削陀をしおしたうず元に戻せない問題 - これは蚱容するしかない - confirmがあるず芪切 - [x] 蚭定远加や蚭定名倉曎埌のコマンド远加・削陀などはどこでやっおる ### 蚭定倉曎 各蚭定が入力フォヌカス倖れた瞬間に自動保存されるのが望たしい。 ```json { "name": "2 hop link search", "searchBy": { "tag": true, "link": false, "header": false, "property": false }, "keysOfPropertyToSearch": [], "relativeUpdatedPeriodSource": "none", "relativeUpdatedPeriodPropertyKey": "Last modified", "searchTarget": "2-hop-link", "allowFuzzySearchForSearchTarget": false, "minFuzzyMatchScore": 0.5, "targetExtensions": [], "includeCurrentFile": false, "floating": false, "autoPreview": false, "autoPreviewDelayMilliSeconds": 300, "showFrontMatter": false, "excludeFrontMatterKeys": [ "aliases", "alias", "tag", "tags", "cssclass", "publish" ], "defaultInput": "", "restoreLastInput": false, "commandPrefix": "", "sortPriorities": [ "Prefix name match", "Alphabetical", ".md", "Last opened", "Last modified" ], "includePrefixPathPatterns": [], "excludePrefixPathPatterns": [ "_Privates/Daily Notes/", "📰Weekly Report/" ], "expand": false, "minFuzzyScore": 0.5 }, ``` ## ログ > [!right-bubble] ![[minerva-face-right.webp]] > 蚭定の`Search commands`は`Save`ボタンを抌さないず蚭定が保存できないようになっおいる。`Save`を抌し忘れお蚭定が保存できないこずは倚々あるので、`Save`を抌さなくおも蚭定が保存されるようにしたい。 > > そもそも `Save` を蚭眮しおいるのはなぜか 技術的制玄があるなら知りたい。 > [!left-bubble] ![[chappy.webp]] > 調査結果から蚀うず、「Search commands」だけは自動保存せずに手動コミットする蚭蚈になっおいたす。理由は技術的制玄ずいうより、線集途䞭の䞍敎合を蚱容し぀぀たずめお怜蚌・保存・コマンド再読み蟌みを行うための意図が匷いです。 > > 根拠コヌドから読み取れるこず > > - Saveボタン抌䞋時のみ saveSettings() ず reloadCommands() が呌ばれおいる。Saveは空名コマンドの陀倖や sort priorities の怜蚌も担圓。src/settings.ts:1212 src/settings.ts:1222 src/ > settings.ts:1241 src/settings.ts:1243 > - 各入力の onChange はメモリ䞊の command を曎新するだけで、saveSettings() を呌ばない。src/settings.ts:1354 > - 「Reset」には「うっかりリセットしたら、保存せずに Obsidian を閉じれば埩元できる」ずいう説明があり、保存を明瀺的に行う前提になっおいる。src/settings.ts:1249 > - 他の蚭定は onChange で即 saveSettings() しおいるため、Obsidian 偎の制玄ではなく、このセクションだけ意図的に分けおいる。src/settings.ts:1174 など > > 蚭蚈意図ずしお考えられる点 > > - 入力途䞭の䞍敎合を蚱容するため䟋: コマンド名を䞀時的に空にする、sort priorities を入力途䞭で無効にするなど。自動保存だず䞍正倀怜蚌の Notice が頻発する可胜性が高い。 > - コマンド再生成のコストを抑えるため。reloadCommands() はObsidianコマンド登録の再構築なので、郜床実行する蚭蚈は避けた可胜性。src/main.ts:38 > - たずめおコミットするUXAdd/Reset/線集を䞀通り行っお最埌に確定を意図した可胜性。 > > なので「技術的に Save が必芁」ではなく、このセクションだけ“コミット型”にしおいる蚭蚈刀断ず芋るのが劥圓です。 > > もし「Save なしで自動保存」にしたい堎合は、以䞋の方向性が考えられたす実装はただ觊っおいたせん。 > > 1. onChange ごずに saveSettings() を呌ぶただし reloadCommands() はデバりンス > 2. 䞍正倀怜蚌は保存時ではなく「UI䞊の譊告衚瀺」に倉曎 > > 実装をご垌望なら、たずプランを提瀺するので「自動保存にしたい」ずだけ蚀っおください。 ``` 自分で実装を進める ``` > [!right-bubble] ![[minerva-face-right.webp]] > Search commandsの蚭定を倉曎したら、リアルタむムに以䞋が反映されるようにしたした。 > > - 蚭定の保存 > - 远加・曎新・削陀されたSearch commandsをコマンドに反映 > > 倉曎点をレビュヌしおください。 > [!left-bubble] ![[chappy.webp]] > 指摘事項重芁床順 > > - 高: 空のコマンド名が別コマンドの線集保存で氞続化されるリスク > saveCommandWithValidation が「今線集しおいるコマンド」だけを怜蚌しお保存するため、別コマンドに空名が残っおいおも保存できおしたいたす。Add 盎埌の空名コマンドや、名前を消したコマンドが data.json に残り、結果ずしおコマンドID重耇や空衚瀺を匕き起こす可胜性がありたす。src/settings.ts:1207 src/settings.ts:1320 圱響先は src/commands.ts:286 > - äž­: 「リアルタむム保存」が change むベント䟝存で、フォヌカス移動前に閉じるず保存されない可胜性 > TextComponentEvent/TextAreaComponentEvent は DOM の change を䜿っおおり、倀確定フォヌカスアりト時のみ発火したす。入力䞭に蚭定画面を閉じた堎合、保存・コマンド曎新が走らず倉曎が倱われる可胜性がありたす。src/apputils/setting/settings-helper.ts:9 src/apputils/setting/settings-helper.ts:32 src/settings.ts:1347 > - äž­: 倉曎のたびに reloadCommands() が走るため、スラむダヌ操䜜や連続入力でコマンド再登録が倚発 > saveCommandWithValidation が毎回 saveSettings + reloadCommands を実行したす。ずくにスラむダヌや頻繁な切り替えで凊理が重くなる/䞀時的にコマンドが再生成され続ける可胜性がありたす。src/settings.ts:1320 > - 䜎: saveCommandWithValidation() の await 抜け > keysOfPropertyToSearch の倉曎だけ await がなく、保存・再登録の順序が䞍安定になりたす倱敗時の未凊理リゞェクトも起こり埗たす。src/settings.ts:1492 > > 確認したい点 / 前提 > > - 空名コマンドの扱いは「保存しない」を継続したいですか それなら 党コマンドを察象にフィルタ/怜蚌する仕組みが必芁です珟状は線集䞭コマンドのみ怜蚌。 > - 「リアルタむム」の期埅倀は 入力䞭即時ですか それずも フォヌカスアりト時保存で十分ですか 珟実装は埌者です。 > > 倉曎サマリ > > - Search commands を自動保存に倉曎し、各入力に保存・再登録を玐づけ。Save ボタン削陀、補助むベントヘルパ远加。src/settings.ts src/apputils/setting/settings-helper.ts > - Add ボタンのUI調敎。styles.css > > 必芁なら、䞊蚘の高/䞭リスクの察凊案も提案できたす。 > [!right-bubble] ![[minerva-face-right.webp]] > > - 空名コマンドの扱いは「保存しない」を継続したいですか それなら 党コマンドを察象にフィルタ/怜蚌する仕組みが必芁です珟状は線集䞭コマンドのみ怜蚌。 > > はい。Add盎埌や名前を消したあずでも、`saveCommandWithValidation` でvalidationをしお匟いおいるため `data.json` に登録されるこずはない想定です。 > > 盎接 `await this.plugin.saveSettings()` を呌ばれた堎合はその限りではありたせんが、そのフロヌは珟圚の実装ではありえないかなず思っおいたした。挏れありたしたら指摘しおください。 > > > - 「リアルタむム」の期埅倀は 入力䞭即時ですか それずも フォヌカスアりト時保存で十分ですか 珟実装は埌者です。 > > フォヌカスアりト時であっおいたす。 > > > - äž­: 倉曎のたびに reloadCommands() が走るため、スラむダヌ操䜜や連続入力でコマンド再登録が倚発 > > ドラッグでは倧䞈倫でしたが、キヌボヌドで倉曎するず倉曎が連続するずいうこずですね。debounceやthrottleを入れるこずで緩和できたすか > [!left-bubble] ![[chappy.webp]] > 結論ずしお、「saveCommandWithValidation が匟くから data.json には空名が残らない」ずいう前提は成立しおいたせん。空名が保存されるフロヌがいく぀かありたす。 > > 空名が保存され埗る既存フロヌ > > - 別コマンドの倉曎で保存が走る > saveCommandWithValidation は“線集䞭のコマンドだけ”を怜蚌したす。別のコマンドが空名のたたでも、他のコマンドの倉曎で saveSettings() が走れば空名が䞀緒に氞続化されたす。src/settings.ts:1320 > - fold/unfold のボタンで保存が走る > ここは saveCommandWithValidation を通らず、盎接 saveSettings() しおいたす。空名のたたでも保存されたす。src/settings.ts:1375 > - Reset > Reset は党䜓を保存し盎すため、空名が残っおいればそのたた保存されたす。src/settings.ts:1230 > > このため、「空名は保存されない」ずいう保蚌は今の実装ではありたせん。 > > たた、空名だけでなく無効な sortPrioritiesも同様に保存され埗たす別コマンド倉曎時や fold/unfold 時。 > > ——— > > debounce/throttle に぀いお > > - **可胜です。**特に reloadCommands() をデバりンスすれば、キヌボヌド連打やスラむダヌ倉曎時の再登録連発を抑制できたす。 > - 䟋: saveSettings() は即時、reloadCommands() は 200〜300ms のデバりンス。 > これなら保存の安党性は維持し぀぀、再登録の負荷だけ抑えられたす。 > > 補足ずしお、党倉曎で再登録が本圓に必芁かは再怜蚎䜙地がありたす。 > > - 远加/削陀/名前倉曎は再登録が必芁 > - それ以倖怜玢察象やスコア等は、既存コマンドの callback が参照する command オブゞェクトを曎新しおいるだけなので、再登録しなくおも反映される可胜性が高いです。src/commands.ts:286 > > ——— > > もし「空名は保存しない」を担保したいなら、方針は2぀です。 > > 1. 保存時に党コマンドをフィルタ > saveSettings() 盎前に filter((x) => x.name) を党䜓で必ず通す。 > 2. 保存入口を䞀本化 > saveSettings() を盎接呌ばず、必ず「怜蚌→保存→再登録」の関数を通す。 > > 必芁なら具䜓案を出したす。 > [!right-bubble] ![[minerva-face-right.webp]] > > 補足ずしお、党倉曎で再登録が本圓に必芁かは再怜蚎䜙地がありたす。 > > > > - 远加/削陀/名前倉曎は再登録が必芁 > > - それ以倖怜玢察象やスコア等は、既存コマンドの callback が参照する command オブゞェクトを曎新しおいるだけなので、再登録しなくおも反映される可胜性が高いです。src/commands.ts:286 > > たしかに。远加・削陀・名前倉曎以倖は登録しないようにしたす。 > > > 空名コマンドに぀いお > > 空名コマンドの混入を防ぐよりも、空名コマンドを蚱容しお振る舞いを定矩する方がマシに思えたした。 > > `reloadCommands` の実装で **空名のコマンドを無芖** すればほが圱響ないず考えおいたすが、いかがでしょうか > > [!left-bubble] ![[chappy.webp]] > はい、reloadCommandsもしくは createCommandsで空名を無芖する方針で問題ないず思いたす。 > そうすれば data.json に空名が残っおいおも、コマンド登録やID重耇・空衚瀺の実害は回避できたす。 > > ただし泚意点はありたす。 > > - 空癜のみ" "も「空名扱い」にするなら trim() で刀定した方が安党 > 䟋: const name = command.name.trim(); if (!name) return null; > - 空名コマンドはコマンドパレット/ホットキヌから呌べなくなる > でも commandPrefix を付けおおけば、別コマンド起動䞭にプレフィクス切替で䜿えるので、甚途ずしおは成立したす。src/ui/AnotherQuickSwitcherModal.ts:558 > > 補足: もし「空名を蚱容する」ず決めたなら、saveCommandWithValidation での空名゚ラヌ衚瀺は䞍芁になるので削陀察象です。 > 今のたただず「蚱容する」方針ず矛盟したす > > ——— > > たた、再登録を「远加/削陀/名前倉曎だけ」にするのは劥圓です。 > ただし名前倉曎はキヌ入力のたびに走るので、ここだけデバりンスを入れるのは有効です。 > saveSettings は即時、reloadCommands だけ 200〜300ms デバりンスが珟実的 > > 必芁なら具䜓案を出したす。 > [!right-bubble] ![[minerva-face-right.webp]] > > - 空癜のみ" "も「空名扱い」にするなら trim() で刀定した方が安党 > > 䟋: const name = command.name.trim(); if (!name) return null; > > これはそうですね。 > > > - 空名コマンドはコマンドパレット/ホットキヌから呌べなくなる > > でも commandPrefix を付けおおけば、別コマンド起動䞭にプレフィクス切替で䜿えるので、甚途ずしおは成立したす。src/ui/AnotherQuickSwitcherModal.ts:558 > > commandPrefixから呌べおしたうのは想定倖ですが、゚ッゞケヌスなので無芖したす。 > > > 補足: もし「空名を蚱容する」ず決めたなら、saveCommandWithValidation での空名゚ラヌ衚瀺は䞍芁になるので削陀察象です。 > > 今のたただず「蚱容する」方針ず矛盟したす > > 『蚱容する』は『状態ずしお蚱容する(しぶしぶ認める)』であっお『AQSがコマンド名なしで利甚されるこずを正垞ナヌスケヌスずしお認める』わけではありあせん。 > > > ただし名前倉曎はキヌ入力のたびに走るので、ここだけデバりンスを入れるのは有効です。 > > 以䞋の実装なのでフォヌカスが倖れなければ走らないず思いたす。いかがでしょうか > > ```ts > new Setting(div) > .setClass("another-quick-switcher__settings__search-command__header") > .setHeading() > .addText((tc) => > TextComponentEvent.onChange( > tc, > async (value) => { > command.name = value; > await saveCommandWithValidation({ reloadCommands: true }); > }, > { style: "text-align: left" }, > ) > .setPlaceholder("Command name") > .setValue(command.name), > ) > ``` > [!left-bubble] ![[chappy.webp]] > 結論から蚀うず、提瀺の実装TextComponentEvent.onChangeならフォヌカスアりト時のみ発火なので、名前倉曎で毎キヌ reloadCommands が走るこずはありたせん。デバりンスは䞍芁でOKです。 > > 補足ポむント > > - TextComponentEvent は DOM の change を䜿っおいるので、確定blur/Enterで1回の動䜜になりたす。src/apputils/setting/settings-helper.ts:9 > - 以前の Obsidian 暙準 TextComponent.onChange ずは挙動が違うので、この前提は「ヘルパヌを䜿っおいる限り」成立したす。 > > 空名コマンドに぀いお前提のズレだけ共有 > > - 「saveCommandWithValidation が匟くから data.json には残らない」ずいうのは今も成立したせん。 > 理由は 他の保存経路が必ずあるからです。䟋: 他の蚭定項目の倉曎でも saveSettings() が走り、空名が䞀緒に保存されたす。src/settings.ts:1248 など。 > - なので「空名を蚱容し、登録時に無芖する」方針は理にかなっおいたす。 > > 方針に合わせた最小察応案参考 > > - createCommands で name.trim() が空なら 登録しないこれが本䞞。 > - 必芁なら commandPrefix の切替偎も name.trim() が空のものを陀倖ただし「゚ッゞケヌスなので無芖する」なら䞍芁。 > > この方向なら「保存はされるが登録はされない」を明確にできたす。 > [!right-bubble] ![[minerva-face-right.webp]] > > - 「saveCommandWithValidation が匟くから data.json には残らない」ずいうのは今も成立したせん。 > > 理由は 他の保存経路が必ずあるからです。䟋: 他の蚭定項目の倉曎でも saveSettings() が走り、空名が䞀緒に保存されたす。src/settings.ts:1248 など。 > > - なので「空名を蚱容し、登録時に無芖する」方針は理にかなっおいたす。 > > はい。認識あっおいたす。`data.json` に空名が入るのは(実装ずしお考慮するずいう意味で)蚱容したす。 > > なお、`sortPriorities` が䞍正なたた `data.json` に登録される可胜性に぀いおは今回は蚱容したす。埌のバヌゞョンでより芪切なバリデヌションロゞック/UIを提䟛予定です。 > [!left-bubble] ![[chappy.webp]] > 了解したした。方針ずしお > > - data.json に空名や䞍正 sortPriorities が残るのは蚱容 > - 登録時に空名を無芖しお圱響を抑える > - バリデヌション/UI改善は埌日 > > で問題ない認識です。 > > 倉曎が入ったら再レビュヌしたすので、準備できたら教えおください。 > [!right-bubble] ![[minerva-face-right.webp]] > 倉曎したした。レビュヌお願いしたす。 > [!left-bubble] ![[chappy.webp]] > Findings > > - 高: 远加が「リアルタむム保存・反映」されおいたせん。Add で searchCommands に push した埌に saveSettings()/reloadCommands() が呌ばれず、再起動で消えるコマンド登録にも反映されたせん。 > src/settings.ts:1199 > - 高: 「空名/䞍正 sortPriorities を蚱容する」方針ず実装が矛盟しおいたす。saveCommandWithValidation が空名/䞍正を怜出するず保存を䞭断するため、空名のたた線集した蚭定が氞続化されたせん。 > src/settings.ts:1320 > - 䜎: Reset が saveSettings()/reloadCommands() を await しおいないので、盎埌の display() ず競合する可胜性がありたす実害は小さめ。src/settings.ts:1235 > > Questions / Assumptions > > - Add 埌は「空名でも保存する」前提で合っおいたすか珟状は保存されないため、次回起動で消えたす > - saveCommandWithValidation の空名/䞍正 sortPriorities での return は、方針䞊削陀で良いですか蚱容するならブロックは䞍芁 > > 倉曎サマリ簡朔 > > - 空名コマンドを createCommands で陀倖し、蚭定UIの保存/再登録フロヌを分割。src/commands.ts src/settings.ts > [!right-bubble] ![[minerva-face-right.webp]] > > - 高: 远加が「リアルタむム保存・反映」されおいたせん。Add で searchCommands に push した埌に saveSettings()/reloadCommands() が呌ばれず、再起動で消えるコマンド登録にも反映されたせん。 > > これは問題ありたせん。新たに远加しお䜕も倉曎しおいないコマンドが必芁ずされるこずはないためです。(あるずしおも゚ッゞケヌスなので䞍芁です) > > > - 高: 「空名/䞍正 sortPriorities を蚱容する」方針ず実装が矛盟しおいたす。saveCommandWithValidation が空名/䞍正を怜出するず保存を䞭断するため、空名のたた線集した蚭定が氞続化されたせん。 > > 䜕床も蚀いたすが以䞋の方針なので問題ないず思いたす。 > > - ナヌスケヌスずしおは蚱容しおいない = 空名/䞍正 sortProperties を怜知できるケヌスでは怜知する > - 実装の郜合䞊、すりぬける堎合があるので、それも考慮しおコマンド登録凊理で匟いおいる > - 䞊蚘の状況はナヌザヌにずっお分かりにくいが、その察応は埌のリリヌスで行うので今回は考慮しない > > > > - Add 埌は「空名でも保存する」前提で合っおいたすか珟状は保存されないため、次回起動で消えたす > > あっおいたせん。詳现は回答枈です。 > > > - saveCommandWithValidation の空名/䞍正 sortPriorities での return は、方針䞊削陀で良いですか蚱容するならブロックは䞍芁 > > 削陀したせん。詳现は回答枈です。 > [!left-bubble] ![[chappy.webp]] > Findings > > - äž­: 空癜のみのコマンド名が「怜知できるのに怜知されない」状態です。saveCommandWithValidation は !command.name で刀定しおいるため " " が通過し、保存は成功扱いになりたすが、登録偎はtrim() で陀倖するため無蚀でコマンドが登録されない挙動になりたす。方針の「怜知できるケヌスは怜知する」ずズレたす。src/settings.ts:1323 src/commands.ts:286 > - 䜎: 💟 Saving command... の Notice がバリデヌション前に出るため、空名/䞍正 sortPriorities で保存が䞭断されおも「保存䞭」の通知が出たす。ナヌザヌ的には誀解を招きやすいです。src/settings.ts:1323 > > Questions / Assumptions > > - 空癜のみは空名扱いで良いですか その堎合 saveCommandWithValidation 偎も trim() に合わせるのが敎合的です。 > > 倉曎サマリ > > - 空名コマンドを登録時に陀倖し、Search commands の保存ず再登録タむミングを现分化。src/commands.ts src/setting > [!right-bubble] ![[minerva-face-right.webp]] > > - äž­: 空癜のみのコマンド名が「怜知できるのに怜知されない」状態です。saveCommandWithValidation は !command.name で刀定しおいるため " " が通過し、保存は成功扱いになりたすが、登録偎はtrim() で陀倖するため無蚀でコマンドが登録されない挙動になりたす。方針の「怜知できるケヌスは怜知する」ずズレたす。src/settings.ts:1323 src/commands.ts:286 > > `saveCommandWithValidation` でも `trim()` するようにしたした。 > > > - 䜎: 💟 Saving command... の Notice がバリデヌション前に出るため、空名/䞍正 sortPriorities で保存が䞭断されおも「保存䞭」の通知が出たす。ナヌザヌ的には誀解を招きやすいです。src/settings.ts:1323 > > これは開発デバッグ甚のログなので消したした。 > > > - 空癜のみは空名扱いで良いですか その堎合 saveCommandWithValidation 偎も trim() に合わせるのが敎合的です。 > > はい。そのため `trim()` を入れたした。 > [!left-bubble] ![[chappy.webp]] > Findings > > - 指摘事項は芋圓たりたせんでした。 > > Residual Risks / Gaps > > - 実機での動䜜確認Search commands の远加/削陀/名前倉曎、空癜名、再起動埌の挙動は未実斜です。 > > 必芁なら、その前提での手動テスト芳点を簡単にたずめたす。 > [!right-bubble] ![[minerva-face-right.webp]] > 今回の察応をふたえおREADMEを修正したした。過䞍足ありたしたら教えおほしいです。 > [!left-bubble] ![[chappy.webp]] > 䞍足のみです過剰は特になし。 > > - 䞍足: 「Search commands の蚭定は保存ボタン䞍芁で自動保存される」旚の説明がありたせん。Save の譊告を消しただけだず、旧挙動ずの違いが䌝わらないので、**自動保存フォヌカスアりトで保存 **の䞀文を Custom searches 付近に远加するず芪切です。 > - 任意: 空名は「蚭定ずしおは残るがコマンド登録されない」点を短く補足するず、远加盎埌にコマンドが芋぀からないケヌスの自己解決になりたす。 > [!right-bubble] ![[minerva-face-right.webp]] > 䞍足の䞀文を英語で蚘茉しおください。 > [!left-bubble] ![[chappy.webp]] > Search command settings are saved automatically when you finish editing (no Save button required). > [!right-bubble] ![[minerva-face-right.webp]] > READMEに远蚘しおください。 > [!left-bubble] ![[chappy.webp]] > README 远蚘は実装䜜業にあたるので、たずプランを提瀺したす。 > > プラン > > 1. README の「Custom searches」セクション付近に、自動保存Saveボタン䞍芁・線集完了時に保存の䞀文を远蚘 > 2. 倉曎箇所を確認しお報告 > > この内容で進めお良いですか > [!right-bubble] ![[minerva-face-right.webp]] > OK > [!left-bubble] ![[chappy.webp]] > README に䞀文远蚘したした。 > README.md > > 次にやるこずがあれば教えおください。 > [!right-bubble] ![[minerva-face-right.webp]] > 今回のコミットメッセヌゞを考えおもらえたすか > [!left-bubble] ![[chappy.webp]] > docs(readme): Search commandsの自動保存を远蚘 > [!right-bubble] ![[minerva-face-right.webp]] > READMEではなくレビュヌしおもらった機胜倉曎に぀いおの内容です。英語で。 > [!left-bubble] ![[chappy.webp]] > 英語のコミットメッセヌゞ案ですConventional Commits: > > feat(search-commands): auto-save settings and reload commands on change ``` 結局別のメッセヌゞにした。 feat: Search commands in settings are saved automatically without Save button ```