IME onの時、キー入力をScrapboxに渡すUserScript
元ネタ:
2021-01-20 16:51:47 なんとか成功したみたい
ブラケティングだけ実装した
2023-11-08
08:53:25 終了
初回だけ 「
が残る
ほかは消えてくれる
たくさんタイプするとsleepが間に合わないかも
08:45:10 今度こそ成功
2. 対象のキーであれば、ブラケティングボタンを押す。eventはcancelしない
3. 少し待ってから #text-input
のfocusを外す
5. 文字を消した後にfocusを戻す
08:24:39 だいぶうまくいくようになった
<BS>
の効果がなさそうだ
いや、これがないとIMEがおかしくなる
08:10:35 いや、失敗していた
blur
のあと isTrusted===false
なcompositionendが発行されている
08:02:53 成功したかな?
chrome@windows11で確認
05:23:51 ずいぶん前から、キー入力を消せなくなっている
focusも外れるというオマケ付き
直したい
Known Issue
IMEに入力した文字を消せない <ESC>
を使えばIMEを強制終了できるのだが、不具合が発生するのでやりたくない
どんな不具合が起きたかは忘れた
工夫すればIMEを終了させられるのかもしれない
この前、終了できたのは何だったんだろうか?
22:02:17 方法見つけた!
$ deno check --remote -r=https://scrapbox.io "https://scrapbox.io/api/code/takker/IME_onの時、キー入力をScrapboxに渡すUserScript/script.ts"
script.tsimport { 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 });
};
};