# Case1 https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/issues/106 問題のコード。`Ctrl+-`でズームアウトが貫通する。 ```ts this.scope.register(["Mod"], "-", () => this.chooseCurrentSuggestion("new-pane-horizontal"); ); ``` ## 問題が発生しない例 ```ts this.scope.register(["Mod"], "-", () => { this.close(); return false; }); ``` ## 問題が発生する例 ```ts this.scope.register(["Mod"], "-", () => // Promise<boolean>を返す this.chooseCurrentSuggestion("new-pane-horizontal"); ); ``` ```ts this.scope.register(["Mod"], "-", async () => { this.close(); return false; }); ``` ## 原因 `register`の第3引数がbooleanを返していないから。`Promise<boolean>`はNG。 他の非同期処理を待ってしまうと、キーイベントがその完了より前に拾われているような気がする。 ## 対策 非同期処理を無視して、`false`を返す。(動きの実害も多分ないはず...) つまり ```ts this.scope.register(["Mod"], "-", () => { // Promise<boolean>を返す this.chooseCurrentSuggestion("new-pane-horizontal"); // 上記が返却するPromiseがresolveする前に`false`を返す. この時点でキーイベントは止まるはず... return false }); ``` # Case2 [[macOS]]の場合のみ > [[📜macOSだと日本語入力中に確定として押したEnterが貫通してAnother Quick Switcherの候補を確定してしまう]] ## 原因 `Enter`キーなどに割り当てたhandlerの中で、[[IME]]操作中であるか否かの分岐をしていなかった。そのため、[[macOS]]のような一部環境では、`Enter`を拾ってhandlerが起動してしまい、[[🦉Another Quick Switcher]]の動作として貫通してしまっていた。 ## 対策 [[IME]]操作中であるか否かの分岐を行い、操作中の場合は処理を無効化する。 具体的には以下のような感じ。 ```ts this.scope.register(modifies, key, (evt) => { // IME操作中でない場合のみ、処理を実行してイベント伝播を停止 if (!evt.isComposing) { evt.preventDefault(); handler(); // キーに割り当てたい処理 return false; } }); ```