## 関連Issue
https://github.com/tadashi-aikawa/obsidian-various-complements-plugin/issues/258
## TODO
- [x] 現在の実装を確認する
- [x] currentTokens or currenToken?
- [x] currentTokenは本当に`[0]`なのか?
- [x] リファクタリング
- [x] `currentToken` -> `currentPhrase`
- [x] `currentTokens.last()` -> `currentToken`
- [-] ひらがな or カタカナ2文字の場合にサジェストを出さないようにする
- [x] 確認テストケースをつくる
- [x] 実装のハードコーディング
- [-] テストケースが通ることを確認
- [x] currentTokensごとに候補を出す出さないを制御する実装の検討
- [x] `onTrigger`の中か外か?
- [x] `onTrigger`の中で
- [x] queriesからパターンを除外する
- [x] その上でqueriesが空ならreturn null
- [x] [[Front matter complement]]が動くかの確認
- [x] descriptionで
- `プロダ`まで入れないと出ない...
- [x] 入力しなくても候補が出るか
- [x] `プ`や`プロ`で候補が出るか
- [x] テストケースに追加
- [x] 空行で`Cannot read properties of undefined (reading 'word')`
- [x] 設定を追加する
- [x] 設定が反映されるようにする
- [x] 設定値は完全一致にする
- [x] descriptionにも明示
- [x] 設定レイアウト変更
- [x] "Line patterns to suppress trigger" の領域を広げる
- [x] "Phrase patterns to suppress trigger" の領域を広げる
- [x] 複数行指定の設定が有効か確認
- [x] 👺を消す
- [-] パフォーマンス測定
- おそらく平気
- [x] betaリリース
┃
┃ (少し様子見)
┃
- [ ] ドキュメントに追加
- [ ] `Patterns to suppress trigger` -> `Line patterns to suppress trigger`
- [ ] `Line patterns to suppress trigger` の partial matchを追記
- [ ] stableリリース
## メモ
### 現在の実装を確認
カーソルまでのcurrent lineのケースは以下。ノリはこれと似ているはず。
```ts
const currentLineUntilCursor =
this.appHelper.getCurrentLineUntilCursor(editor);
if (currentLineUntilCursor.startsWith("---")) {
onReturnNull(
"Don't show suggestions because it supposes front matter or horizontal line"
);
return null;
}
const suppressedPattern = this.settings.patternsToSuppressTrigger.find(
(p) => new RegExp(p).test(currentLineUntilCursor)
);
if (suppressedPattern) {
onReturnNull(
`Don't show suggestions because it is the ignored pattern: ${suppressedPattern}`
);
return null;
}
```
#### currentTokens or currenToken?
どちらを使うべきか...
```ts
const currentTokens = tokenized.slice(
tokenized.length > this.settings.maxNumberOfWordsAsPhrase
? tokenized.length - this.settings.maxNumberOfWordsAsPhrase
: 0
);
showDebugLog(`currentTokens is ${JSON.stringify(currentTokens)}`);
const currentToken = currentTokens[0]?.word;
showDebugLog(`currentToken is ${currentToken}`);
if (!currentToken) {
onReturnNull(`Don't show suggestions because currentToken is empty`);
return null;
}
```
`I like Obsidian` なら
```ts
currentTokens = ["I", "like", "Obsidian"]
currentToken = "Obsidian"
```
となる。
補完させない制御なので `currentToken` だけ気にすればいいはず。
```
ある人達
```
```ts
currentTokens = ["ある人達", "人達"]
currentToken = "ある人達"
```
==currentTokensの理解が違った... `人達`だと思ったら1つ目のほうか==。
#### currentTokenは`[0]`でいいのか? lastではなく?
以下のsuppressがデグレする。フレーズの1文字目が入力したときに補完が消えるのは致命的。
```ts
if (
!this.runManually &&
!currentFrontMatter &&
currentToken.length < this.minNumberTriggered
) {
onReturnNull(
"Don't show suggestions because currentToken is less than minNumberTriggered option"
);
return null;
}
```
また、以下も影響がありそう。
```ts
// For multi-word completion
this.contextStartCh = cursor.ch - currentToken.length;
```
ここは定義をしっかりして
- `currentToken` -> `currentPhrase`
- `currentTokens.last()` -> `currentToken`
にした方がよさそう。
==ただ `よくあ` のように `[よくあ, あ]` となったケースで今度は表示されなくなる... currentTokenだと。==
となると、やはり `currentPhrase` の方で抑制しないといけないのかな... とはいえこのケースだとほぼすべてに当てはまってしまうような...
`onTrigger()` で抑制することに無理がある気がする。`[よくあ, あ]`のケースだと
- `よくあ`の候補は出す
- `あ`の候補は出さない
があるべき姿なんだよな。
### ひらがな or カタカナ2文字の場合にサジェストを出さないようにする
#### 確認テストケースをつくる
- `アイ` で補完が表示されないこと
- `アイテ` で補完が表示されること
- `毎年` で補完が表示されること
- `よく` で補完が表示されないこと
- `よくあ` で補完が表示されること
- `値オ`で補完が表示されること
- [[Front matter complement]]
- `description: ` で補完が出ること
- `プ`の1文字で補完が出ること
#### 実装のハードコーディング
表示を抑制する正規表現はこんな感じ。『ひらがな か カタカナ からなる2文字以下の文字列』。
```
[\u3040-\u309F\u30A0-\u30FF]{1,2}
```