## 関連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} ```