generated at
選択範囲に似ているリンクを入力補完するUserScript
選択範囲中の文字列に近いリンクを表示してリンクの入力補完を行うUserScript

機能
ページ中の文字を選択すると、選択した文字に近いリンクが表示される
defaultで5個まで表示される。
一番下に、表示されなかったリンクの個数がでる
表示されたリンクを押すと、そのリンクで選択範囲が置き換わる
右クリックメニューやCtrl+クリックで、リンク先ページを新しいタブで開いたり、リンクをコピーしたり、ドラッグアンドドロップでリンクを挿入できたりもする
注意
コードブロック中、ページタイトル、テーブル記法のタイトルでは起動しない
複数行選択しているときも起動しない

使い方
簡単な方法
1. ここをコードをbuildする
2. 生成されたコードをコピーして、/help-jp/自分のページ script.js に貼り付ける
カスタマイズ
css変数
default
--select-suggest-bg#111
--select-suggest-font-family"Open Sans", Helvetica, Arial, "Hiragino Sans", sans-serif
--select-suggest-text-color#eee
--select-suggest-border-color#eee
--select-suggest-selected-bg#222
--select-suggest-information-text-color#aaa
setup() にoptionを渡して制御できる
設定方法はSetupInitの型定義を参照
操作函数は await setup() の戻り値に入っている
これを使って、各自でショートカットなどを実装する

動機
これと同じ不満を持っていた
>[]を書いてからリンクする語を書くのではなく,書いた語を選択してリンクする場合はpopupが出ないので難しい?yosider
どこから引用したか書き忘れてた
井戸端に置いたページにソースがある
で、最近(2022-08中旬)「選択中入力補完が表示されればいいのでは?」と思いついた
codingに集中すると7時間使ってしまうので、一旦アイデアとして温めた状態にしていた
2022-08-28体調が悪く、なんとなくこれを実装してみたくなった
体調が悪くて他のことができそうになかった
2023-01-26 08:20:10 えっこれ作ったの8月ってマジ?takker
もっと最近に作ったscriptだと思ってた
選択範囲に対してwindowを表示するtestで試した結果、もうreleaseできる段階までcodeを組めたので、本番コードを書いて実装してしまうことにした

バグ
memory leakしている?
このscriptか、@takker/ScrapJupyterが原因っぽい
GCUI threadが固まる
Firefoxでのみ発生している
Firefoxの問題かも
scrapbox.Page.linesのdeep cloneも時間がかかっているが、それだけが原因ではない
候補更新時に、選択状態をresetしない
debounceじゃなくてthrottleにしないといけなかった
最初と最後しか検索結果が更新されないようになっちゃった

実装したいこと
文字入力補完のスクショも撮る
external-completionで作った場面と同じやつを撮ってみよう
popupmenuが表示されているときでも補完を有効にする
simple.tsに実装する
popup menuの(先頭|末尾)候補を選択しているときに次候補へ移動しようとしたら、このuserscriptの補完候補へ移動できるようにする
✅ショートカットキーの導入
選択・確定操作を外部から操作できるようにする
ショートカットキーの設定はユーザーに任せる
ddc.vim形式
Promiseを使って吐き出す
workerを使う
モチベ
debounceではカクツキを低減できない
2022-09-18 07:56:03 requestAnimationFrame()でなんとかなった
✅外部projectのリンクも補完できるようになる
ソース取得先を変えればいいだけ

external-completionの代わりとして使いたい
実装
検索結果のやりとり
やってもいいんじゃない?
中断処理なしなら、補完候補を選んでいる途中にアイテムが変わって誤クリックする確率が減る
たぶん500ms以内で計算し終わるなら、中断処理なしでも動く
useSource を廃止し、検索処理内でdatabaseを読み込むようにする
Workerに移行する前の前準備
Worker内でIndexed DBから直接データを読み込んで検索するようにする
SharedWorkerにすれば、メモリ節約にもなる
タブごとにDBからデータを構築せずに済む
export不要
project絞り込みパネルで有効になっているprojectから先に検索する
これは難しい
すべてのsourceを一つに合体してしまっている
メモリを節約する
タブがアクティブでないときは、リンクデータを解放する
visibilitychangeで切り替える
アクティブになるたびにDBから読み出す?
同じ現象発生しているんだよなあ……
不便に慣れてしまいがちなので放置していたが、直そうかな
高速に絞り込まれていくヌルヌル感が目眩となって楽しさを産むのを体験してみようか
React Hooksからロジックを排除する
そっちのほうがテストもしやすい

❌補完ソースのデータ形式
現在
{...; projects: string[]; }[]
ヒットしたリンクの統計データをprojectごとに計算するのが難しい
例:編集距離dでマッチしたリンク数を各projectで計算する
検索と同時にカウントすれば、あまり難しくないかも
Map<string/* project name */, Link[]>
projectごとに絞り込む処理が高速になる
検索するリンク数が増える
重複しているリンクを、project数回検索しなければならなくなる
大したoverheadではないだろうtakker
重複しているリンク数なんて、たかが知れている
ddc-sourceの概念を導入する?
project一つ一つを、独立したsourceとみなす


mod.tsx
export * from "https://raw.githubusercontent.com/takker99/scrapbox-select-suggestion/0.10.8/mod.tsx";

advanced.ts
export * from "https://raw.githubusercontent.com/takker99/scrapbox-select-suggestion/0.10.8/examples/advanced.ts";

#2024-07-14 19:59:42
#2023-10-29 16:31:23
#2023-05-12 03:41:48
#2023-05-11 02:58:33
#2023-03-29 22:22:54
#2023-03-27 22:54:58
#2023-03-25 09:14:42
#2023-03-23 19:51:53
#2023-03-21 21:12:45
#2023-03-20 18:16:19
#2023-03-18 21:33:19
#2023-03-17 23:01:43
#2023-02-26 07:33:28
#2023-02-15 11:23:43
#2023-02-11 07:18:00
#2023-01-31 05:58:09
#2023-01-26 08:40:58
#2023-01-07 06:38:18
#2023-01-05 12:38:00
#2022-12-28 08:02:42
#2022-12-08 07:39:57
#2022-11-18 16:15:16
#2022-11-13 06:04:33
#2022-11-12 18:04:34
#2022-11-11 21:05:57
#2022-11-03 18:21:46
#2022-11-03 02:56:44
#2022-10-31 22:45:23
#2022-10-27 11:46:02
#2022-10-18 08:50:16
#2022-10-14 12:52:04
#2022-10-09 06:29:21
#2022-10-06 08:48:12
#2022-09-24 17:31:19
#2022-09-18 07:54:26
#2022-09-14 15:20:32
#2022-09-06 18:00:37
#2022-09-03 06:55:33
#2022-08-29 18:07:21
#2022-08-29 00:07:10