## 事象
以下のようなコードについて。
```ts
this.suggestions.setSelectedItem(this.suggestions.selectedItem - 1, true);
```
v0.15.xのときは問題なく動作していた(前の候補に移動できた)が、v0.16.0からは移動した瞬間に候補が閉じてしまう。
## 原因
`setSelectedItem`の仕様が変わっていた。
- v0.15.xでは `setSelectedItem(index: number, scroll: boolean)`
- v0.16.0では `setSelectedItem(index: number, event: KeyboardEvent)`
## 解決方法
`setSelectedItem`の第2引数に入れる値を[[KeyboardEvent]]型の値に変更する。`scope.register`に指定されるコールバックは`KeymapEventListener`型であり、[[obsidian.d.ts]]を見ると第1引数に渡される。それを使えばよい。
```ts
export type KeymapEventListener = (evt: KeyboardEvent, ctx: KeymapContext) => false | any;
```
例
```ts
const selectNext = (evt: KeyboardEvent) => {
this.suggestions.setSelectedItem(this.suggestions.selectedItem + 1, evt);
return false;
};
this.scope.register([], "ArrowDown", selectNext),
```
## 参考
[[EditorSuggest]]のデフォルトキーバインド初期化処理を除いてみた。
```ts
}(FB)
, NB = function() {
function e(e, t, n) {
var i = this;
...
this.selectedItem = 0,
var r = function(e) {
if (!e.isComposing)
return i.setSelectedItem(i.selectedItem - 1, e),
!1
}
, o = function(e) {
if (!e.isComposing)
return i.setSelectedItem(i.selectedItem + 1, e),
!1
};
n.register([], "ArrowUp", r),
n.register([], "ArrowDown", o),
...
```
`i.setSelectedItem`の呼び出し箇所を見ると、第2引数に`e`を渡している。`e`は[[KeyboardEvent]]であるため、以前とは`setSelectedItem`のシグニチャが変わっていることが分かる。この通りに改修すればよい。