## 対応内容
用語を入力したあと、その[[内部リンク]]が存在しなかったら、そのまま作成するオプションをつくる。
たとえば `Obsidian Publish` が[[内部リンク]]になかったときに以下を入力したら
```markdown
私はObsidian Publish
```
- Publish (作成)
- Obsidian Publish (作成)
- はObsidian Publish (作成)
みたいな感じでフレーズの候補を含んで表示する。どれを優先するかは分からないと思うので短い方が優先でいいはず。
### 仕様詳細
- ~~追加するフレーズは`maxNumberOfSuggestions`からは除外~~
- ~~ex: `maxNumberOfSuggestions`が10だったら、11以上表示されてOK~~
## タスク
- [x] フレーズをconsole.logで出力してみる
- [x] `onTrigger`
- [x] `debounceGetSuggestions`
- [x] フレーズを候補として表示してみる
- [x] 候補を選択したら文中に挿入してみる
- [x] ここで不可能ならやめる
- [x] 仕様検討
- [x] FallbackLinkify
- [x] runManuallで動作の感じを確かめてみる
- [x] 専用コマンドを作成する
- [x] Issueに説明書く
- [x] フォールバックで表示する候補から[[内部リンク]]以外を外す
- [x] 理論的には`completionMode="partial"`の場合
- [x] フォールバックの部分一致で候補がない場合は、いきなり`new`に遷移する
- [x] 理論的には`completionMode="partial"`の場合
## メモ
### 必要な情報
- `tokens`はここの単語である
- `currentTokens`は畳み込まれた配列
- `currentToken`は`currentTokens`の最後のword (最も近い単語)
- `currentPhrase`は最も長いものをとる
```
[onTrigger] tokens is another,qui
[onTrigger] currentTokens is [{"word":"another qui","offset":0},{"word":"qui","offset":8}]
[onTrigger] currentPhrase is another qui
```
**今回欲しいのは `currentTokens` のはず。**
**そのあとに `suppressedTokens` として、最終的にこれを使う。**
### どこで処理をするか
- `onTrigger`ではない... が情報の受け渡しはここで必要
- `query`の`JSON.stringify({})`で渡すしかない
- `this.debounceGetSuggestions` の中で処理
- クエリの値をそのまま[[Internal link complement]]の候補として使えそうな気がする
### 常に表示することはノイズではないか...?
- 作ってて若干そう思った..
- [[IME]]使っているとそっちの候補で隠れるからまだいいけど
- 英語圏の人はノイズに感じる気がする
- 記号でいちいち表示されるのもなんかヤダ
- かといってこれのフィルタはちょっとしんどい気も
- 別にホットキーを入力するようにしたほうがいいか...
- popup commandsにしてしまうと候補が表示されていないときに使えない
- かといって通常コマンドにするとpopupを閉じるのが面倒
- 閉じるコマンドとセットで定義すればいける?
- `FallbackLinkify` というコマンドで
### fallback中の判断
モードが設定と異なることで判定する。
```ts
this.completionMode = this.matchStrategy.name;
```
この方法はベストではないが、根本から変更すると影響範囲が広すぎるため。