generated at
IME onの時、キー入力をScrapboxに渡すUserScript
元ネタ:
compositionupdateで入力キーを受け取り、それをscrapboxに渡せばいけそうな気がした
2021-01-20 16:51:47 なんとか成功したみたい
ブラケティングだけ実装した


2023-11-08
08:53:25 終了
初回だけ が残る
ほかは消えてくれる
たくさんタイプするとsleepが間に合わないかも
08:45:10 今度こそ成功
1. compositionupdateを受け取る
2. 対象のキーであれば、ブラケティングボタンを押す。eventはcancelしない
3. 少し待ってから #text-input のfocusを外す
4. compositionendを受け取る
5. 文字を消した後にfocusを戻す
08:24:39 だいぶうまくいくようになった
<BS> の効果がなさそうだ
いや、これがないとIMEがおかしくなる
08:10:35 いや、失敗していた
blur のあと isTrusted===false なcompositionendが発行されている
08:02:53 成功したかな?
chrome@windows11で確認
javascriptからIMEをcancelする#600823d41280f00000104ab1したあとに、compositionend eventをcatchして握りつぶすのがポイントっぽい
07:53:24 compositionendをdispatchしてもIMEが終了しない
本物のcompositionend eventが発火したときにしか有効でないのか?
05:23:51 ずいぶん前から、キー入力を消せなくなっている
focusも外れるというオマケ付き
直したい

Known Issue
doneIMEに入力した文字を消せない
<ESC> を使えばIMEを強制終了できるのだが、不具合が発生するのでやりたくない
どんな不具合が起きたかは忘れた
工夫すればIMEを終了させられるのかもしれない
scrapbox-keyboard-emulation-2 <ESC> を入力したが効き目がなかった
この前、終了できたのは何だったんだろうか?
22:02:17 方法見つけた!

$ deno check --remote -r=https://scrapbox.io "https://scrapbox.io/api/code/takker/IME_onの時、キー入力をScrapboxに渡すUserScript/script.ts"
script.ts
import { takeStores, press, sleep } from "../scrapbox-userscript-std/dom.ts"; const callback = (e: CompositionEvent) => { if (!e.isTrusted) return; if (e.data.length === 0) return; if (!(e.target instanceof HTMLTextAreaElement)) return; if (e.target.id !== "text-input") return; const { cursor, selection } = takeStores(); if (!selection.hasSingleLineSelection()) return; switch([...e.data].pop()){ case "「": { const button = document.getElementsByClassName('button link-button')?.[0] if (!(button instanceof HTMLElement)) return; //e.preventDefault(); //e.stopPropagation(); button.click(); const textarea = e.target; (async () => { await sleep(100); textarea.blur(); await new Promise((resolve) => { document.addEventListener("compositionend", resolve, { capture: true, once: true }); }); press("Backspace"); textarea.focus(); cursor.focus(); })(); break; } default: break; } }; export const setup = (): () => void => { document.addEventListener("compositionupdate", callback, { capture: true }); return () => { document.removeEventListener("compositionupdate", callback, { capture: true }); }; };

#2023-11-08 05:24:52