## 経緯
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
the first or last underscore · Issue #319 · tadashi-aikawa/obsidian-various-complements-plugin
</div>
<div class="link-card-v2-content">
thanks for creating such a useful plugin plugin! now here has some collation for use underscore on itaic or bold ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/6651e075b1eae81053afd9108ecf955e8f7d5311040cb200c9dc9e6353f1e127/tadashi-aikawa/obsidian-various-complements-plugin/issues/319" />
<a href="https://github.com/tadashi-aikawa/obsidian-various-complements-plugin/issues/319"></a>
</div>
## 一旦対応をとりやめ
この対応をしてしまうと、個人的な `_` から始まる [[Custom dictionary complement]] が表示されなくなってしまう。これは他のユーザーに対しても大きな破壊的変更になりそうなので気軽に入れるのは厳しい。オプションにする方法はるが、処理が複雑になりそうなので保留。
## [[Codex CLI]]とのログ
> [!left-bubble] ![[chappy.webp]]
> 先頭/末尾の _ を単語扱いしないように、トークン抽出で両端トリム+再帰トークナイズの先頭オフセットを _ 分スキップするようにしました。マッチング用クエリも両端トリム済み文字列を使うので、treatUnderscoreAsPartOfWord の有無に関係なく _italic_ / __bold__ が期待どおり扱われます。
>
> - 文字列ユーティリティを追加し、_ の両端トリムと先頭連続数カウントを共通化: src/util/strings.ts
> - Default/English/Korean の tokenize で両端 _ を落とし、recursiveTokenize では先頭 _ をオフセットでスキップ: src/tokenizer/tokenizers/DefaultTokenizer.ts, src/tokenizer/tokenizers/
> EnglishOnlyTokenizer.ts, src/tokenizer/tokenizers/KoreanTokenizer.ts
> - クエリ生成時にマッチング用の word を両端トリム: src/ui/AutoCompleteSuggest.ts
> - 期待値更新+_italic_/__bold__ テスト追加: src/tokenizer/tokenizers/DefaultTokenizer.test.ts, src/tokenizer/tokenizers/EnglishOnlyTokenizer.test.ts, src/tokenizer/tokenizers/
> KoreanTokenizer.test.ts
> [!right-bubble] ![[minerva-face-right.webp]]
> uniqueOffsets を作っているのはなぜですか?
> [!left-bubble] ![[chappy.webp]]
> uniqueOffsets は、先頭 _ をスキップした結果 同じ offset が複数回出てしまうケース を潰すためです。
> recursiveTokenize は offset ごとに content.slice(offset) を返すので、重複 offset があると同じトークンが何度も出てしまい、候補生成や補完に無駄が出ます。
>
> - 例: __a __c__ e__ の先頭トークンは offset=0 ですが、先頭の _ をスキップして offset=2 になります。別トークン側も同じ offset=2 に寄ることがあり、重複が発生します。
> - Set のため 挿入順は保持 され、順序は維持されます。
>
> 該当箇所は src/tokenizer/tokenizers/DefaultTokenizer.ts、src/tokenizer/tokenizers/EnglishOnlyTokenizer.ts、src/tokenizer/tokenizers/KoreanTokenizer.ts です。